我在工作簿A中打开了代码,并对工作簿B进行了处理。当工作簿A和B是唯一打开的excel文件(或者如果工作簿A是唯一打开的文件)时,代码可以正常运行。但是,如果我打开任何其他工作簿(称为工作簿C),则宏将无法正确运行。它不会引起错误消息,它会运行到完成而无需执行任何应做的“工作”(这些工作基本上是在工作簿B中找到东西并将它们粘贴到工作簿A中)。
FWIW,我已经做了以下简单的实验:
当我进行上述测试时,它甚至没有使工作簿B成为活动工作簿。同样,它不会导致excel引发错误消息,它只会运行并将工作簿C保留为活动工作簿。
编辑:我已经进行了更多的测试,下面的代码应该更改工作簿B中单元格的值,但是将其放入工作簿C中。我非常困惑,因为未以任何方式引用工作簿C(该模块在工作簿A)中
Sub test()
Dim wb As Workbook
Set wb = Workbooks.Open("U:\workbookB.xlsx")
wb.Worksheets("ED").Range("Z1").Value = "TEST"
End Sub
编辑2:当工作簿A和B已打开几个小时,而工作簿C最近已打开时,就会出现此问题。我关闭了工作簿B,然后重新运行了代码,它可以正常工作。这使我相信,在多个excel打开实例中存在某种问题。尽管这希望是低风险的,但我仍然好奇是否有人可以通过某种方式围绕它进行编码以防万一?谢谢!
答案 0 :(得分:3)
您需要提防一个细微的错误(我会毫不犹豫地称呼它,但这就是它的外观)。
如果您试图通过代码打开的工作簿已经打开,那么偶尔您会看到一些意外的行为(例如将Workbooks.Open()
的返回值分配给{{1 }},而不是您期望的文件。
例如,下面的代码在“ Tester.xlsm”中运行并打开“ EmptyTest.xlsx”,但是如果该文件已经打开,则ThisWorkbook
调用无法正确分配{{1 }}变量,最后指向“ Tester.xlsm” 。那会引起问题。
要复制,
测试代码:
Workbooks.Open
在我的系统上完全可复制(win10 / Office 365)
答案 1 :(得分:0)
我认为您的问题是您正在打开工作簿B。您声明,如果关闭并重新打开它,它将起作用。
因此,您对工作簿B所做的任何更改都将丢失,因为它将重新打开原始工作簿。 (“自动保存”实际上并不保存工作簿,而是保存了单独的副本。)
您需要检查工作簿是否已打开,并且仅在当前未打开时才重新打开它。
(非常粗糙的代码)
Sub test()
Dim wb As Workbook
For Each wb In ThisWorkbook.Application.Workbooks
If wb.Path & "\" & wb.Name = "U:\workbookB.xlsx" Then Exit For
Next
If wb.Path & "\" & wb.Name <> "U:\workbookB.xlsx" Then Set wb = ThisWorkbook.Application.Workbooks.Open("U:\workbookB.xlsx")
wb.Worksheets("ED").Range("Z1").Value = "TEST"
End Sub
但是(正如其他人所说的那样),您应该真正检查是否没有其他Excel实例正在运行,并且也要对其进行说明。