VBA开放工作簿/检查工作簿是否是最佳实践和为什么

时间:2017-05-24 16:57:19

标签: vba excel-vba excel

我制作了一个将工作表从一个工作簿复制到另一个工作簿的宏,在打开工作簿时我有几个关于最佳实践的问题。

从以前的编程经验来看,我知道在尝试打开它之前,您应该检查某些内容是否已打开。到目前为止,VBA证明了这一点,因为如果我正在复制的工作表已经打开,我的宏崩溃了。我想知道测试它是否开放的最佳方法是什么。它可能不是活动工作簿,测试If Workbooks(file) Is Nothing Then ....给了我错误。 (这是我在网上找到的可能的解决方案)

如果我排除上述测试,我会收到错误:

Set copyFromWB = Workbooks.Open(file) Set copyFromWS = copyFromWB.Sheets(copyFromSheetName) 'ERROR HERE

文件已经打开,但文件关闭时效果很好。我想知道为什么当文件已经打开时会出现错误,“幕后”答案真的是我在这里寻找的东西,这解释了计算机在想什么,更理论。

同样在那个注释中,我想知道当我看到在多个VBA帮助论坛上建议时,为什么测试If Workbooks(file) Is Nothing Then ....对我不起作用。这是类型的问题还是与我正在使用的excel版本有关?

作为参考,“file”和“copyFromSheetName”存在,并且当文件未在运行时从打开状态启动时不会出现错误。

要点:

  1. 测试工作簿是否打开的最简洁方法?
  2. 为什么在尝试访问其工作表时,已打开的工作簿会导致崩溃? (我认为它实际上与Set copyFromWB = Workbooks.Open(file)
  3. 上面的行有关
  4. 为什么不将Workbooks(文件)与Nothing进行比较?是类型问题,excel版本问题还是其他什么?
  5. 我正在寻找的不仅仅是编码解决方案。如果我不理解为什么你的代码有效而我的代码没有用,对我来说没什么用。

3 个答案:

答案 0 :(得分:0)

这是我所知道的最干净的方式: Detect whether Excel workbook is already open

它实际上并没有崩溃,但你只能在读写模式下打开一次文件,如果你打开它两次它要求你以只读方式打开它。

因此,如果您尝试此操作,则每次都会打开工作簿,但它在标题中显示为只读。

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它会起作用。
所以错误信息是我猜的某种保护。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

要查明工作簿是否已打开,可以为此目的使用一个函数,该函数利用了“ 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