Excel VBA:当宏尝试打开另一个工作簿时,等待另一个应用程序完成OLE操作

时间:2013-06-13 14:49:25

标签: excel vba excel-vba

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

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

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

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

然后这张表被推广到我公司的其他多个用户。总而言之,预计约有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在通知之前没有出现。我无法在他的机器上进行调试,因为他位于远程,这将是一项很大的努力(只有在绝对必要的情况下才能完成)。

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

1 个答案:

答案 0 :(得分:1)

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

Dim xlo As New Excel.Application

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

xlo.Visible = False

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

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

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