我制作了一个将工作表从一个工作簿复制到另一个工作簿的宏,在打开工作簿时我有几个关于最佳实践的问题。
从以前的编程经验来看,我知道在尝试打开它之前,您应该检查某些内容是否已打开。到目前为止,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”存在,并且当文件未在运行时从打开状态启动时不会出现错误。
要点:
Set copyFromWB = Workbooks.Open(file)
我正在寻找的不仅仅是编码解决方案。如果我不理解为什么你的代码有效而我的代码没有用,对我来说没什么用。
答案 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)
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