运行下面的代码时,根据打开的工作簿,我会得到不同的结果。 sub位于与Master Sheet.xlsm
相关联的模块中
Master Sheet.xlsm
然后代码运行正确,即消息框说(其中逗号分隔第一个和第二个消息框):主表,转移案例03-09-18Master Sheet.xlsm
和transferred cases 03-09-18.xlsx
都开放但transferred cases 03-09-18.xlsx
开放第二,那么消息框说:转移案件03-09-18,转移案件03-09-18Master Sheet.xlsm
和transferred cases 03-09-18.xlsx
都打开但Master Sheet.xlsm
开放第二,那么消息框说:Master Sheet,Master SheetSub foo()
Dim x As Workbook
Dim y As Workbook
'## Open both workbooks first:
Set x = Workbooks.Open("C:\Users\owner\Documents\ExelatecOutput\Master Sheet.xlsm")
Set y = Workbooks.Open("C:\Users\owner\Documents\ExelatecOutput\transferred cases 03-09-18.xlsx")
'Now, copy what you want from x:
MsgBox x.Name
MsgBox y.Name
End Sub
为什么没有正确分配变量x和y。
Workbooks.Open
总是返回最后打开的文件(即使它不是传入参数的文件)。这可能是文档错误或excel IMO中的错误。
您无需检查文件是否已打开,因为打开已打开的文件不会引发错误,但您需要稍后设置该变量:
Workbooks.Open "C:\Users\owner\Documents\ExelatecOutput\Master Sheet.xlsm": Set x = Workbooks("Master Sheet.xlsm") ' or Set x = ActiveWorkbook since Open will activate it
Workbooks.Open "C:\Users\owner\Documents\ExelatecOutput\transferred cases 03-09-18.xlsx": Set y = Workbooks("transferred cases 03-09-18.xlsx") ' or Set y = ActiveWorkbook since Open will activate it
只需注意,您可以检查工作簿是否已打开,其中包含传递工作簿名称的功能。
Public Function BookOpen(strBookName As String) As Boolean
Dim oBk As Workbook
On Error Resume Next
Set oBk = Workbooks(strBookName)
On Error GoTo 0
If oBk Is Nothing Then
BookOpen = False
Else
BookOpen = True
End If
End Function
如果它返回true
,你可以set x = Workbooks("your workbook name")
使用Workbook
分配Workbooks.Open()
变量时,暗示要打开的工作簿已关闭。否则,如果所有工作簿都已打开,则需要使用Workbooks.Open()
的最后一个打开的工作簿或代码所在的工作簿。
因此,请确保在尝试打开工作簿之前关闭它们。在打开之前,您需要执行以下两个操作:
如果有打开的工作簿,则关闭它:
另一个更快的选择是明确地分配变量,如Vincent G所提到的,这更快,因为你不会关闭已经打开的Excel文件:
Sub TestMe()
Dim x As Workbook
Dim y As Workbook
Dim xPath As String: xPath = "C:\Book1.xlsx"
Dim yPath As String: yPath = "C:\Book2.xlsx"
Workbooks.Open xPath
Set x = Workbooks(Split(xPath, "\")(UBound(Split(xPath, "\"))))
Workbooks.Open yPath
Set y = Workbooks(Split(yPath, "\")(UBound(Split(yPath, "\"))))
Debug.Print x.Name
Debug.Print y.Name
End Sub
代码Split(xPath, "\")(UBound(Split(xPath, "\")))
的一部分由\
获取分裂数组的最后一个元素。