[英]VBA Opening Workbooks/Checking if Workbook is Open Best Practice and Why
我制作了一個宏,可以將工作表從一個工作簿復制到另一個工作簿,並且在打開工作簿時我有幾個關於最佳實踐的問題。
根據以前的編程經驗,我知道在嘗試打開某些東西之前,您應該檢查它是否已經打開。 到目前為止,VBA 已經證明了這一點,因為如果我從中復制的工作表已經打開,我的宏就會崩潰。 我想知道測試它是否打開的最佳方法是什么。 它可能不是活動工作簿和測試If Workbooks(file) Is Nothing Then ....
給了我錯誤。 (這是我在網上找到的一個可能的解決方案)
如果我排除上述測試,則會出現以下錯誤:
Set copyFromWB = Workbooks.Open(file) Set copyFromWS = copyFromWB.Sheets(copyFromSheetName) 'ERROR HERE
當文件已經打開時,但在文件關閉時它可以完美運行。 我想知道為什么在文件已經打開時會引發錯誤,“幕后”答案正是我在這里尋找的,可以解釋計算機在想什么,更重要的是理論。
同樣在這一點上,我想知道為什么測試If Workbooks(file) Is Nothing Then ....
當我看到它在多個 VBA 幫助論壇上被建議時對我不起作用。 這是類型問題還是與我使用的 excel 版本有關?
作為參考,“file”和“copyFromSheetName”存在並且當文件在運行時沒有從打開開始時不會出現錯誤。
總結:
Set copyFromWB = Workbooks.Open(file)
我正在尋找的不僅僅是編碼解決方案。 如果我不明白為什么你的代碼有效而我的卻沒有,那對我來說沒有多大用處。
這是我知道的最干凈的方法: 檢測 Excel 工作簿是否已經打開。
它實際上並沒有崩潰,但你只能以讀寫模式打開一個文件,如果你打開它兩次,它會要求你以只讀模式打開它。
因此,如果您嘗試此操作,工作簿每次都會打開,但標題中會顯示只讀。
Sub OpenWbk()
Dim xl As Object
Set xl = CreateObject("Excel.Application")
Dim wbk As Workbook
Dim sht As Worksheet
xl.Visible = True
Set wbk = xl.Workbooks.Open("C:\Users\User\Desktop\Book1.xlsm")
Set sht = wbk.Sheets(1)
End Sub
它可能會拋出一個錯誤,因為它想要訪問不存在的東西。 如果您set wbk = Workbooks("FileName")
(如果未打開則拋出錯誤)並說On Error Resume Next
然后檢查If wbk Is Nothing
它將起作用。
所以我猜錯誤信息是某種保護。
UGP 可能已經打敗了我。 此代碼將檢查您的工作簿是否已打開。 如果是,那么它會將它設置為變量 myWB 並且它不會在我身上崩潰。 如果它沒有打開,它將用相同的變量打開它。
Sub wsdcvbhui()
Dim wb As Workbook
Dim wbs As Workbooks
Dim myWB As Workbook
Set wbs = Application.Workbooks
For Each wb In wbs
If wb.Path & "\" & wb.Name = "C:\Files\Bounce.xlsx" Then ' change this to your file path and name
Set myWB = wb
GoTo skipOpen
End If
Next wb
Set myWB = Workbooks.Open("C:\Files\Bounce.xlsx")
skipOpen:
myWB.Activesheet.range("B2").value = "Hello"
myWB.save
myWB.Close Saved = True
Set wbs = Nothing
Set myWB = Nothing
Set wb = Nothing
End Sub
要確定工作簿是否已打開,您可以為此目的使用一個函數,該函數利用了“On Error”語句。
Sub testIsOpen()
Dim sFN As String
Dim bFlag As Boolean
sFN = "FileName.xlsx" ' Put the name of your workbook here
bFlag = IsWkbOpen(sFN)
' Print in Immediate window True or False
Debug.Print bFlag
End Sub
Public Function IsWkbOpen(ByVal sFileName As String) As Boolean
Dim wkb As Workbook
Dim bReturn As Boolean
On Error GoTo EH
bReturn = True
Set wkb = Workbooks(sFileName)
IsWkbOpen = bReturn
Exit Function
EH:
bReturn = False
Resume Next
End Function
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.