簡體   English   中英

Excel VBA無法打開工作簿

[英]Excel VBA can't open Workbook

第一:我使用的是Excel 2007,但代碼也必須適用於Excel 2003。

我的問題如下:我需要訪問可能已關閉的不同工作簿中的單元格。 可以在網絡上找到以下代碼:

Function Foo()
    Dim cell As Range
    Dim wbk As Workbook
    Set wbk = Workbooks.Open("correct absolute path")
    ' wbk is Nothing here so the next statement fails.
    Set cell = wbk.Worksheets("Sheet1").Range("A1")
    Foo = cell.Value
    wbk.Close
End Function

遺憾的是,wbk在公開聲明之后是沒有什么(我想提供更好的錯誤信息,但不知道我是怎么做的;我為真正的IDE和有用的語言提供了什么:/)。 絕對路徑是正確的,並指向有效的excel xlsx文件。

另外我假設最好的方法是“緩存”工作簿,而不是每次調用函數時都打開/關閉它? 任何可能的問題(除了必須處理工作簿已經打開的情況)?

單步執行時的圖像: 調試信息

我可以重現這個問題。 當我嘗試將此代碼粘貼到用戶定義的函數中時,它才會發生在我身上。

我相信這是設計的(引用是針對XL 2003的,但XL 2010上的情況也是如此)

在自定義函數中使用VBA關鍵字

可以在自定義函數中使用的VBA關鍵字數小於可以在宏中使用的數字。 除了將值返回到工作表中的公式或另一個VBA宏或函數中使用的表達式之外,不允許自定義函數執行任何操作。 例如,自定義函數無法調整窗口大小,編輯單元格中的公式或更改單元格中文本的字體,顏色或圖案選項。 如果在函數過程中包含此類“動作”代碼,則該函數返回#VALUE! 錯誤。

http://office.microsoft.com/en-us/excel-help/creating-custom-functions-HA001111701.aspx

我發現的唯一解決方法是通過普通的宏調用這種代碼。 類似於選擇要應用它的單元格,然后循環選擇等。

你可以使用它(類似於Bruno Leite提出的,但編寫起來要簡單得多):

Dim excelApp As New Excel.Application
excelApp.Visible = False
Set WB = excelApp.Workbooks.Open(FileName, xlUpdateLinksNever, True)

由於重復調用UDF,您應該確保在退出函數之前執行excelApp.Quit(以及之前的WB.close(False))以避免在您的盒子上運行無數的Excel實例。

我對它進行了一些思考,並得出結論,在執行UDF時,您無法使用當前excel實例的工作簿。 另一方面,打開excel的第二個實例將無干擾地完成工作。

將我的例程放入工作簿模塊中的單獨宏並從Workbook_BeforeSave代碼調用該宏的解決方法似乎已經完成了。

我有一個類似的問題,但在我的情況下,它是一個“Workbooks.Open(filename)”命令,在Workbook_BeforeSave中嵌入的一個小例程的開頭。 VBA只是跳過代碼行,就好像它不存在一樣,它甚至沒有報告Err.Code或Err.Description。

我唯一的線索是它是Workbook_BeforeSave例程的一部分,上面函數的限制似乎表明這可能是一個可能的原因。 所以我進一步挖掘以找到更多細節。

似乎Workbook_BeforeSave禁止Excel打開更多文件,我猜這是有充分理由的,因為File> Open選項仍然可以在File菜單中看到,但是無法單擊它。 奇怪的是,打開工具欄圖標/按鈕仍然有效,所以雖然我可以從那里手動打開文件,但我想知道是不是因為從VBA代碼調用此操作是不可能的,這就是為什么他們允許它?

若要從工作簿中獲取數據,而無需打開時,你可以使用這個 ,用ADO連接。

要在Excel 2007中使用,請更改此設置

Microsoft.Jet.OLEDB.4.0

Provider=Microsoft.ACE.OLEDB.12.0

Extended Properties=\"Excel 8.0;HDR=Yes;\

Extended Properties=\"Excel 12.0;HDR=Yes;\

[]的

您可以使用以下代碼以正確的方式檢查錯誤:

filelocation = c:\whatever\file.xlsx

On Error GoTo Handler 'this is key as if the next row returns an error while opening the file it will jump to the Handler down there.
Set wkb2 = Workbooks.Open(filelocation, ReadOnly)

Handler:
MsgBox "File " & filelocation & " does not exist or cannot be reached, please review and try again"

我知道這不回答這個問題(這就是為什么我也登陸這個帖子,因為我無法打開文件而無法理解為什么會這樣)

干杯,RV

您不必“設置”一個單元格,它是工作簿類的一部分(據我所知)。 只需使用以下內容......

foo = wbk.Worksheets("Sheet1").Range("A1").Value

我建議您在worbook_open事件中打開調用工作簿時打開新工作簿。

然后,將新工作簿引用存儲在全局變量中。

然后,您的單元格調用的函數使用所述全局變量,而不是嘗試打開新的工作簿。 這樣你可以繞過限制。

PS:當然要避免使用全局變量,某種容器會比直接全局變量更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM