COM错误?两次打开工作簿会导致参考文献被破坏

时间:2018-01-24 16:14:01

标签: excel vba com

感谢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 '<------------- !!!

立即窗口中的结果输出:(类似于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?!

1 个答案:

答案 0 :(得分:1)

这确实是一个错误。显然这一行:

Set a2 = Application.Workbooks.Open("H:\a.xlsx") 

(意外地)与

一样
Application.Workbooks.Open "H:\a.xlsx"
Set a2 = ActiveWorkbook

因为a.xlsx已经打开b.xlsx是(并且仍然是)activeworkbook,所以a2获得对b.xlsx的引用。

为了防止问题发生,您应该在尝试再次打开之前测试工作簿是否已在Excel中打开。