【问题标题】:Excel VBA: Waiting for another application to complete an OLE action when macro tries to open another workbookExcel VBA:当宏尝试打开另一个工作簿时,等待另一个应用程序完成 OLE 操作
【发布时间】:2013-06-13 14:49:25
【问题描述】:

标题的一些背景知识:我编写了一个在工作簿打开时调用的宏。它会在共享目录上打开一个 [shared] 工作簿,并将一些信息提取到用户正在使用的工作簿中。

使用此工作表的任何用户都已将共享目录映射到他们的计算机(并且宏会找到正确的驱动器号)。

我已在我的办公室与用户多次测试此工作表。我还对其进行了测试,让两个人同时打开工作簿,以确认两个用户的宏能够同时从共享工作簿中提取数据。

到目前为止,我没有遇到任何问题。

然后,此工作表已推广到我公司的多个其他用户。总而言之,预计大约有 40 人会使用这张表(不一定同时使用.. 只是总数)。

其中一位用户位于波兰(我位于伦敦)。

当他打开工作簿时,他会收到“Microsoft Excel 正在等待另一个应用程序完成 OLE 操作”的通知。该通知带有一个“确定”按钮。按此按钮似乎没有任何效果,工作簿有效地挂在此通知上。

我在解决这个问题时遇到了很多麻烦,因为我无法复制它。有谁知道为什么会出现这种情况?代码如下:

Sub PreliminaryDataImport()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim x As Variant
Dim usename As String
usename = Environ("USERNAME")
Dim xlo As New Excel.Application
Dim xlw As New Excel.Workbook, wkbk As New Excel.Workbook
Dim xlz As String, regions As String
Dim LRow As Long, LCell As Long, LRow2 As Long
Dim RegionList As String
RegionList = ""


xlz = Sheet1.Range("o1").Value & "\Region Planning\TestDB.xlsx"
Set xlw = xlo.Workbooks.Open(xlz)

If Not Sheet11.Range("S1").Value = xlw.Worksheets("validation") _
    .Range("N1").Value Then
    MsgBox "YOU ARE USING AN OUT OF DATE VERSION" & vbLf & _
        "Please check your inbox or contact xxxx for the current version."
    xlw.Close False
    Set xlo = Nothing
    Set xlw = Nothing
    Call Module7.ProtectSheets
    End
End If

x = CheckValidation(usename, xlw)

'~~ Check to see if User has access to view/modify.
'~~ If they have access, return regions


On Error Resume Next
For i = LBound(x) To UBound(x)
    regions = regions + " --- " & x(i)
    RegionList = RegionList + x(i) & ", "
    Sheet1.Cells(i + 2, 33).Value = x(i)
Next
If Err.Number <> 0 Then
    MsgBox "You do not have access to view or modify any regions."
    xlw.Close False
    Set xlo = Nothing
    Set xlw = Nothing
    End
Else
    MsgBox "You have access to view and modify the following regions:" & vbLf _
        & vbLf & regions & "---"

我相信问题出现在这部分代码的某个地方,因为最后一行的 msgbox 在通知之前没有显示。我无法在他的机器上运行调试,因为他位于远程,这将是一项很大的工作(只有在绝对必要时才应该这样做)。

有人知道为什么这个用户会收到这个错误吗?我特别困惑,因为只有他有问题。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    看起来有点可疑的一件事是您正在创建一个新的 Excel 实例

    Dim xlo As New Excel.Application
    

    通常这样做是为了使用隐藏的 Excel 实例来打开您不想向用户显示的工作簿,但我没有看到任何隐藏第二个实例的代码,即:

    xlo.Visible = False
    

    由于您快速打开和关闭共享工作簿,并且您的主 Excel 实例中有 ScreenUpdating = False,因此您可以在主 Excel 实例中执行此操作,而无需创建新的 Excel 实例。

    您也没有调用 xlo.Quit 来关闭第二个 Excel 实例,因此它可能会在后台徘徊...

    另一种方法是使用 OleDb 从共享工作簿中读取,在这种情况下您根本不需要打开它。

    【讨论】:

    • 感谢乔的回复。我确实在打开一个新实例,以便工作簿保持隐藏状态。没有隐藏第二个实例的代码,因为默认情况下它是隐藏的。我必须输入像xlo.Visible = True 这样的行,以便用户能够看到它。到目前为止,我一直在使用xlo.Close,因为它似乎确实关闭了 Excel 的第二个实例(例如,该进程从任务管理器中消失了)。我有更多评论要添加,所以我将添加另一条评论。
    • 我还打开了一个新的 Excel 实例,因为有代码(此处未包含)将共享目录映射到打开工作簿的用户计算机。在工作簿关闭之前,还有一些代码可以取消映射此共享目录。我无法在同一个 excel 实例中打开远程工作簿,因为这样做会导致尝试取消映射目录的代码出错。在同一个实例中打开会导致 Windows 认为仍有应用程序试图访问共享目录,因此它阻止了取消映射的尝试。
    • @SamWB - 更清楚一点。很难提供帮助,尤其是因为您无法自己重现问题。一个问题:为什么要映射共享目录——为什么不直接使用 UNC 路径打开它?即使您解决了这个问题,您的错误处理看起来也不是很健壮(不喜欢 End 语句并且您在访问共享工作簿时不处理错误)。我肯定会考虑使用 OleDb 从共享工作簿中读取数据。
    • 只要他们有权访问共享目录,打开工作簿就不应该成为问题,因此我的大部分错误检查都围绕着确保映射所述目录正常工作。我没有在我的帖子中包含那部分代码,因为我认为它与问题无关。对于使用 End 语句,您有什么建议?我不熟悉使用 UNC 路径或 OleDb 从工作簿中读取,但我会研究这些。不过,我希望为该员工找到一个临时解决方案,因为使用这些方法需要一些时间来实施。
    猜你喜欢
    • 1970-01-01
    • 2014-10-30
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多