簡體   English   中英

VBA 打開工作簿/檢查工作簿是否打開最佳實踐以及原因

[英]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”存在並且當文件在運行時沒有從打開開始時不會出現錯誤。

總結:

  1. 測試工作簿是否打開的最干凈方法?
  2. 為什么已打開的工作簿在嘗試訪問其工作表時會導致崩潰? (我認為它實際上與上面的行有關Set copyFromWB = Workbooks.Open(file)
  3. 為什么不將 Workbooks(file) 與 Nothing 進行比較? 是類型問題、excel 版本問題還是其他問題?

我正在尋找的不僅僅是編碼解決方案。 如果我不明白為什么你的代碼有效而我的卻沒有,那對我來說沒有多大用處。

這是我知道的最干凈的方法: 檢測 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.

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