Страницы: 1
RSS
Очередь записи данных в книгу excel, Макрос запускается на нескольких компьютерах в сети. Обеспечить одновременное сохранение?
 
Добрый день!
Есть типовая книга excel (своего рода форма), которой пользуются все сотрудники. Заполнив необходимые ячейки они кнопкой запускают макрос, который переносит все внесенные данные в файл-отчет.
Если пользователи запускают макрос по-очереди, все работает прекрасно... Но возможна ситуация, при которой пользователь запустит макрос в момент выполнения макроса на другом компьютере.
Пробовал делать книгу-отчет общей, для одновременной записи, но при ее сохранении макросом вылазит сообщение о конфликте. Пользователи впадают в ступор. Часть данных в отчет не попадает.
Есть мысль сделать очередь записи в книгу-отчет. Т.е. в макросе проверять доступна ли книга на запись, если нет, то ждать 20 секунд и проверять снова. Делать это до тех пор, пока файл не освободится и данные не будут внесены.

Прошу помочь реализовать это в VBA, а именно:
1) проверить доступен ли файл по заданному полному пути за запись;
2) грамотно реализовать ожидание, чтобы не загружать процессор и не подвешивать процесс excel.

Заранее благодарен за помощь!
Изменено: Challenger - 17.01.2014 12:52:25
 
А если просто проверять - открыт или нет нужный файл? Если открыт - значит с ним кто-то уже работает.
 
Юрий, подскажите, как проверить не открыта ли книга на другом компьютере?
Я не очень силен в 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
щас может быть сделал бы по-другому..
Живи и дай жить..
 
А как вариант, если в начале макроса записи, он взводит какой-нить флаг (например создает какой-то файл), а при завершении работы удаляет этот флаг. Ну и само собой, когда флаг взведен, то макрос завершает свою работу... Пусть пользователь периодически жмет кнопку...
Если автоматизировать бардак, то получится автоматизированный бардак.
Страницы: 1
Наверх