У меня есть макрос в Outlook 2010. Он проверяет, открыт ли файл другим пользователем, если нет, тогда откройте его, заполните его данными, сохраните и закройте.Ошибка при открытии файла excel из Outlook: несколькими пользователями. Автоматизация
Когда пользователи используют его одновременно, более быстрый ПК, похоже, победит, а другой пользователь заблокирован, что приведет к ошибке и даже заморозит Outlook.
Сначала я пытался незащищенные рабочие книги, так что каждый может использовать макросы в то же время (я не делал isworkbookopen функции тогда), но это привело к ошибке автоматизации:
ошибка времени выполнения " -2147418111 (80010001) ':
ошибка автоматизации
Вызов был отклонен вызываемым когда отлажена, она подчеркнула wb.open strpath часть
Вот часть моего кода прямо сейчас:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliSeconds As Long)
Function IsWorkBookOpen(FileName As String)
Dim ff As Long, ErrNo As Long
On Error Resume Next
ff = FreeFile()
Open FileName For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0
Select Case ErrNo
Case 0: IsWorkBookOpen = False
Case 70: IsWorkBookOpen = True
Case Else: Error ErrNo
End Select
End Function
Public Sub test()
Sleep 1000
End Sub
Sub Sample()
Dim xlApp As Object
Dim xlWB As Object
Dim xlSheet As Excel.Worksheet
Dim xlApp2 As Object
Dim xlWB2 As Object
Dim xlSheet2 As Excel.Worksheet
Const strpath As String = "P:\Head\....xls"
Const strpath2 As String = "P:\Head\....xls"
Dim Ret
Dim Ret2
Z = 0
0:
Ret = IsWorkBookOpen(strpath) 'the path of the workbook
Ret2 = IsWorkBookOpen(strpath2)
If Ret = False Then
GoTo masodikif
Else
GoTo elseag
masodikif:
If Ret2 = False Then
GoTo ifvege
Else
GoTo elseag
elseag: Call test
Z = Z + 1
If Z = 50 Then
MsgBox "Please try again in a few second!"
End
Exit Sub
End If
GoTo 0:
End If
End If
ifvege:
If Application.ActiveExplorer.Selection.Count = 0 Then
MsgBox "No Items selected!", vbCritical, "Error"
Exit Sub
End If
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application")
If Err <> 0 Then
Application.StatusBar = "Please wait while Excel source is opened ... "
Set xlApp = CreateObject("Excel.Application")
bXStarted = True
End If
On Error GoTo 0
'Open the workbook to input the data
Set xlWB = xlApp.workbooks.Open(strpath)
Set xlSheet = xlWB.sheets("Munka1")
If Application.ActiveExplorer.Selection.Count = 0 Then
MsgBox "No Items selected!", vbCritical, "Error"
Exit Sub
End If
On Error Resume Next
Set xlApp2 = GetObject(, "Excel.Application")
If Err <> 0 Then
Application.StatusBar = "Please wait while Excel source is opened ... "
Set xlApp2 = CreateObject("Excel.Application")
bXStarted = True
End If
On Error GoTo 0
'Open the workbook to input the data
Set xlWB2 = xlApp2.workbooks.Open(strpath2)
Set xlSheet2 = xlWB2.sheets("Munka1")
Много кода снова
xlWB2.Save
xlWB2.Close savechanges:=True
xlWB.Save
xlWB.Close savechanges:=True
Set xlApp = Nothing
Set xlWB = Nothing
Set xlSheet = Nothing
Set xlApp2 = Nothing
Set xlWB2 = Nothing
Set xlSheet2 = Nothing
Я думаю, что ваша проблема может быть связана с методом, который вы используете, чтобы проверить, открыта ли рабочая книга. Любой пользователь может открыть книгу с сетевого диска в Excel в любое время. Единственная проблема заключается в том, имеет ли этот пользователь права на чтение и запись одновременно. Я попытался бы проверить это, используя 'xlWB.readOnly'. Если другой пользователь имеет чтение/запись в книгу в то время, когда он открыт, это вернет «True», если нет, оно вернет «False». Я бы упростил ваш код, чтобы использовать этот метод для проверки. Я отправлю ответ о том, как я буду делать то же самое. – MattB