2011-03-03 463 views
0

我已經爲Excel 2010編寫了一個宏,它爲包含任何文件和子文件夾的文件夾建立索引。這樣做的目的是管理從包含數百個文件的文件夾目錄中提取特定細節,其中只有一些文件是Excel文件,而其中只有一些文件與此細節相關。Excel VBA - 選擇確定彈出菜單/對話框

該宏提供了一些基本的細節和文件的超鏈接(包括xls,doc,pdf等)。然後,vba代碼將插入一個單元格公式,以從工作簿的特定位置(不打開它們)提取單個單元格值,並在其中存在Excel文件並生成#Ref!否則錯誤。由於單元格公式是通過FileItem.Path和文本操作創建的,因此該公式始終引用「摘要」工作表,以適合有意義的文件。

問題是剩餘的Excel文件中沒有包含此名稱的工作表,該名稱提示Excel爲用戶提供彈出對話框「選擇表」,以供用戶手動從選項中進行選擇。我需要一種方法在vba代碼中進行管理。我可以管理一些潛在的結果,包括選擇OK來每次選擇第一個選項,取消和忽略請求,跳過這些實例等,但是我不能讓宏反覆中斷用於用戶輸入。

我已經嘗試在代碼中的各個點插入Application.DisplayAlerts = False,但它不會阻止該對話框。

任何幫助/建議,非常感謝。

感謝

編輯

我原本:

Cells(r, 5).Formula = "='" & Left(File.Path, InStr(File.Path, File.Name) - 1) & "[" & File.Name & "]Summary'!$D$3"

...產生下面的單元格的公式:

='C:\Documents and Settings\[TEST]Summary'!$D$3 
+0

我認爲不可能從vba代碼訪問關閉的工作簿,所以這可以爲我工作。我只需要對Range的語法做一點澄清。目前給我一個錯誤'對象'_Application'失敗'錯誤1004方法'範圍' 我也嘗試創建一個文本變量來保存路徑並在Range()中使用,但沒有成功。 有什麼建議嗎? – kavmeister 2011-03-03 17:30:22

+0

由於我沒有明確的文件路徑或名稱(由於子文件夾加上不一致的命名約定),我必須動態構建位置。因此,對於您的解決方案,我不確定適當的方括號,撇號和引號需要使用此代碼。我一直在嘗試使用以下公式的變體: 'Application.Range(「[」&FileItem.Path&「] Summary!$ D $ 3」)。Value' ..它的計算結果如下: 'Application.Range([C:\ Documents and Settings [TEST] Summary!$ D $ 3).Value' – kavmeister 2011-03-03 17:31:21

+0

如果有人能夠指導我如何使用StackOverflow來評論/回覆將會有幫助。新手。 – kavmeister 2011-03-03 17:32:11

回答

1

它確實似乎你不能禁用這個「無效的參考」彈出框(如果我是錯的人,請糾正我),但是,你可以做的是生成你的公式,以引用你的VBA中的「摘要」表因爲你已經在做),但是在粘貼實際公式之前在VBA中評估它,這樣如果公式沒有錯誤地返回正常,那麼粘貼它,否則可以執行一些其他操作。

例如你在此刻:

if FileType <> "XLS" then 
    myCellFormula = "#Ref!" 
else 
    myCellFormula = "[<Target File Name>]Summary!A1" 
endif 

但是,如你所知試圖把在一個不存在的表的引用會導致Excel咳嗽。你可以做的是檢查這個錯誤在VBA,例如:

On Error Resume Next 

dim dummy as variant 

if FileType <> "XLS" then 
    myCellFormula = "#Ref!" 
else 
    dummy = Application.Range("[<Target File Name>]Summary!A1").Value 

    if not isempty(dummy) then 
     myCellFormula = "[<Target File Name>]Summary!A1" 
    else 
     <alternative action> 
    endif 
endif 

你也可以用一個錯誤處理程序做到這一點,它不取決於你是否想跳過這些不存在的引用(所以<alternative action>會無所事事)。根據您的最新回覆

編輯,你可以將代碼更改爲類似這樣:

On Error Resume Next 

dim dummy as variant 
dim targetFileFormula as string 
dim lastSlashPos as long 

lastSlashPos = InStrRev(fileitem.Path, "\", , vbBinaryCompare) 
targetFileFormula = "'" & Left(fileitem.Path, lastSlashPos) & "[" & Right(fileitem.Path, Len(fileitem.Path) - lastSlashPos) & "]Summary'!$D$3" 

if FileType <> "XLS" then 
    myCellFormula = "#Ref!" 
else 
    dummy = Application.Range(targetFileFormula).Value 

    if not isempty(dummy) then 
     myCellFormula = targetFileFormula 
    else 
     <alternative action> 
    endif 
endif 

然後,您可以定製這個您的需求。

+0

'Application.Range(targetFileFormula).Value'產生一個錯誤。路徑看起來很好,所以當使用Range公式時,您需要在'[]' @!中使用不同的標點符號組合/位置。 '。另外,你確定你可以像這樣從vba訪問封閉的工作簿嗎? – kavmeister 2011-03-04 10:12:03

+0

如果工作表不存在於目標工作簿中,那麼它確實會產生錯誤 - 所有目標工作簿都會發生這種情況嗎? – 2011-03-05 12:04:00