可以打开多个Excel实例导致VBA问题吗?

时间:2019-06-26 20:31:15

标签: excel vba

我在工作簿A中打开了代码,并对工作簿B进行了处理。当工作簿A和B是唯一打开的excel文件(或者如果工作簿A是唯一打开的文件)时,代码可以正常运行。但是,如果我打开任何其他工作簿(称为工作簿C),则宏将无法正确运行。它不会引起错误消息,它会运行到完成而无需执行任何应做的“工作”(这些工作基本上是在工作簿B中找到东西并将它们粘贴到工作簿A中)。

FWIW,我已经做了以下简单的实验:

  1. 打开所有3个工作簿(A,B和C)
  2. 选择工作簿C,使其处于活动状态,并选择前窗口
  3. 运行代码workbookB.sheet1.activate(这不是逐字记录的,我知道编写的代码会失败)

当我进行上述测试时,它甚至没有使工作簿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打开实例中存在某种问题。尽管这希望是低风险的,但我仍然好奇是否有人可以通过某种方式围绕它进行编码以防万一?谢谢!

2 个答案:

答案 0 :(得分:3)

您需要提防一个细微的错误(我会毫不犹豫地称呼它,但这就是它的外观)。

如果您试图通过代码打开的工作簿已经打开,那么偶尔您会看到一些意外的行为(例如将Workbooks.Open()的返回值分配给{{1 }},而不是您期望的文件。

例如,下面的代码在“ Tester.xlsm”中运行并打开“ EmptyTest.xlsx”,但是如果该文件已经打开,则ThisWorkbook调用无法正确分配{{1 }}变量,最后指向“ Tester.xlsm” 。那会引起问题。

要复制,

  • 打开Excel
  • 打开“ EmptyTest.xlsx”
  • 打开“ 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实例正在运行,并且也要对其进行说明。