1

标题的一点背景:我编写了一个在打开工作簿时调用的宏。它在共享目录上打开一个 [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 在通知之前没有显示。我无法在他的机器上运行调试,因为他位于远程,这将是一项巨大的工作(只有在绝对必要时才应该这样做)。

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

4

1 回答 1

1

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

Dim xlo As New Excel.Application

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

xlo.Visible = False

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

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

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

于 2013-06-13T15:06:50.187 回答