感谢fuglede提出这个我注意:
这是一个COM错误吗?
我打开Excel工作簿A,然后打开工作簿B(两个都在单元格A1中有一些标识文本).
然后我再次尝试打开工作簿A并将该引用保存在一个新变量中a2.但a2现在指向工作簿B!
使用win32com在Python中重现了这种完全相同的行为.所以这不是一个特别的VBA问题,而是更普遍的COM问题.(也就是说,也可能是在C#等,但尚未确认.)
到底是怎么回事?
VBA代码:( Python win32com代码类似.)
'Open a couple of workbooks
Dim a As Workbook, b As Workbook, a2 As Workbook
Debug.Print "Set a = a.xlsx..."
Set a = Application.Workbooks.Open("H:\a.xlsx")
Debug.Print "a: " & a.Name
Debug.Print "Set b = b.xlsx..."
Set b = Application.Workbooks.Open("H:\b.xlsx")
Debug.Print "b: " & b.Name
Debug.Print "a: " & a.Name
'Attempt to re-open workbook a.xlsx and keep reference in a new variable
Debug.Print "Set a2 = a.xlsx..."
Set a2 = Application.Workbooks.Open("H:\a.xlsx") '<---- should open A, right?
Debug.Print "a2: " & a2.Name '<------------------------------------------------ !!!
Debug.Print "b: " & b.Name
Debug.Print "a: " & a.Name
'Read workbook content
Debug.Print "Contents of cell A1..."
Debug.Print "From a: " & a.Sheets("Sheet1").Range("A1").Value
Debug.Print "From b: " & b.Sheets("Sheet1").Range("A1").Value
Debug.Print "From a2: " & a2.Sheets("Sheet1").Range("A1").Value '<------------- !!!
Run Code Online (Sandbox Code Playgroud)
立即窗口中的结果输出:(类似于Python控制台)
Set a = a.xlsx...
a: a.xlsx
Set b = b.xlsx...
b: b.xlsx
a: a.xlsx
Set a2 = a.xlsx...
a2: b.xlsx <--------------- WTF?!
b: b.xlsx
a: a.xlsx
Contents of cell A1...
From a: I'm in A
From b: I'm in B
From a2: I'm in B <--------------- WTF?!
Run Code Online (Sandbox Code Playgroud)
小智 1
这确实是一个错误。显然这一行:
Set a2 = Application.Workbooks.Open("H:\a.xlsx")
Run Code Online (Sandbox Code Playgroud)
(出乎意料)与以下内容相同
Application.Workbooks.Open "H:\a.xlsx"
Set a2 = ActiveWorkbook
Run Code Online (Sandbox Code Playgroud)
由于 a.xlsx 已打开,b.xlsx 是(并且仍然是)活动工作簿,因此 a2 获得对 b.xlsx 的引用。
为了防止出现此问题,您应该在尝试再次打开工作簿之前测试该工作簿是否已在 Excel 中打开。
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |