gpt4 book ai didi

excel - 通讯错误?两次打开工作簿会导致引用损坏

转载 作者:行者123 更新时间:2023-12-04 21:43:23 26 4
gpt4 key购买 nike

归功于 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?!

最佳答案

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

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

(出乎意料地)工作方式与

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

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

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

关于excel - 通讯错误?两次打开工作簿会导致引用损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48426974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com