Добрый день! Есть типовая книга excel (своего рода форма), которой пользуются все сотрудники. Заполнив необходимые ячейки они кнопкой запускают макрос, который переносит все внесенные данные в файл-отчет. Если пользователи запускают макрос по-очереди, все работает прекрасно... Но возможна ситуация, при которой пользователь запустит макрос в момент выполнения макроса на другом компьютере. Пробовал делать книгу-отчет общей, для одновременной записи, но при ее сохранении макросом вылазит сообщение о конфликте. Пользователи впадают в ступор. Часть данных в отчет не попадает. Есть мысль сделать очередь записи в книгу-отчет. Т.е. в макросе проверять доступна ли книга на запись, если нет, то ждать 20 секунд и проверять снова. Делать это до тех пор, пока файл не освободится и данные не будут внесены.
Прошу помочь реализовать это в VBA, а именно: 1) проверить доступен ли файл по заданному полному пути за запись; 2) грамотно реализовать ожидание, чтобы не загружать процессор и не подвешивать процесс excel.
Юрий, подскажите, как проверить не открыта ли книга на другом компьютере? Я не очень силен в VBA, пока могу лишь проверить, не открыта ли книга на компьютере, на котором выполняется макрос. Делаю это функцией:
Код
'Проверяем не открыт ли файл отчета. Если нет - открываем
If Not IsBookOpen(ReportName) Then
Workbooks.Open (ReportPath & ReportName)
End If
Код
Function IsBookOpen(wbName As String) As Boolean
'эта Функция просматривает все открытые книги и если находит среди них книгу с указанным именем, то функция возвращает True.
Dim wbBook As Workbook
For Each wbBook In Workbooks
If wbBook.Name <> ThisWorkbook.Name Then
If Windows(wbBook.Name).Visible Then
If wbBook.Name = wbName Then IsBookOpen = True: Exit For
End If
End If
Next wbBook
End Function
On Error Resume Next
Dim ex As Excel.Application, exw As Worksheet, operator$, dt&, lr&, lc&, i&, ras&, lt&, s$, sum
Set ex = CreateObject("excel.application")
'ex.Visible = True
Dim t!
Application.DisplayAlerts = False
lp: t = Timer
Do
If Dir(endpath) <> "" Then Set exw = ex.Workbooks.Open(endpath).Worksheets(1)
Loop While (exw Is Nothing) And (t + 1) > Timer
If exw Is Nothing Then
If MsgBox("общий файл занят или отсутствует доступ. Повторить обращение?", vbYesNo, "Attention,please!") = vbYes Then
GoTo lp
Else
GoTo ex
End If
Else
With exw.Parent
If .ReadOnly Then
ex.DisplayAlerts = False
.Close
If MsgBox("общий файл занят или отсутствует доступ. Повторить обращение?", vbYesNo, "Attention,please!") = vbYes Then
GoTo lp
Else
GoTo ex
End If
End If
End With
End If
А как вариант, если в начале макроса записи, он взводит какой-нить флаг (например создает какой-то файл), а при завершении работы удаляет этот флаг. Ну и само собой, когда флаг взведен, то макрос завершает свою работу... Пусть пользователь периодически жмет кнопку...
Если автоматизировать бардак, то получится автоматизированный бардак.