Страницы: 1
RSS
Макрос открытия, изменения и сохранения файла несколькими пользователями
 
Здравствуйте.  
Прошу помощи клуба в дописании макроса.  
Вкратце: есть несколько файлов, один из которых является "собирающим" данные из других книг. При этом сам этот "собирающий" файл ничего не собирает - его открывает макрос, записанный во всех остальных книгах, вставляет данные, сохраняет и закрывает "собирающий" файл.  
 
Вот этот макрос:    
Private Sub CommandButton1_Click()  
Dim ipath As String, iipath As String  
ipath = ThisWorkbook.Path  
iipath = ipath + "\Собирающий.xlsx"  
Range("A1:H1").Copy  
Workbooks.Open (iipath)  
Range("Paste1").Select  
   ActiveSheet.Paste  
   Application.CutCopyMode = False  
ActiveWindow.Close True  
End Sub  
 
Paste1 - это имя в "собирающем" файле, адресующее в первую незаполненную строку диапазона =СМЕЩ(Лист1!$A$1;СЧЁТЗ(Лист1!$A$1:$A$1000);0)  
 
Проблема в следующем: т.к. с файлами-поставщиками данных одновременно может работать несколько пользователей, нужно предупредить появление ошибки открытия и сохранения файла, уже кем-то открытого. Предполагаю, тут нужен какой-то цикл, повторяющий действие до тех пор, пока "собирающий" файл освободится, но как его написать - не приложу ума. Помогайте, друзья!
 
Может быть не цикл, а что-то другое, что позволит повторять попытку открытия "собирающего" файла вплоть до момента, пока файл не освободится? По идее, время ожидания этого момента будет коротким, т.к. другой пользователь, занимающий "собирающий" файл, в свою очередь ожидает завершения работы макроса.  
Есть соображения на этот счёт? Или отправьте меня в нужном направлении, т.е. к нужной функции/процедуре.  
Спасибо
 
{quote}{login=The_Prist}{date=14.12.2011 09:03}{thema=}{post}Мысленно представил себе, как Ваш макрос работает сутки напролет из-за того, что кто-то файл открыл, но забыл закрыть и заболел...  
 
{/post}{/quote}  
 
Дмитрий, добрый день. Спасибо за отзыв.  
"Собирающий" файл не может быть открыт сутки напролёт, т.к. он закрывается макросом сразу же после записи данных.    
Просто хочу избежать ошибки одновременного открытия файла двумя и более пользователями - в этом случае сохранить записанные данные сможет только тот, кто открыл "собирающий" файл первым, а у всех последующих возникнет ошибка. Да там и время-то записи в районе 3 секунд, но вероятности, что пользователи пересекутся, всё же не исключаю.  
При этом раскладе поможет Workbooks.Open iipath, , True ?
 
Опа! Пока писал разъяснения, Дмитрий накидал кучу предложений. Сейчас попробую разобраться.  
Спасибо!
 
Дмитрий, я немного изменил твой макрос (убрал rRng), но требуется твоё указание, на каком этапе поставить Application.OnTime Now + TimeValue("00:00:05"), "CommandButton1_Click".    
Будь добр, подскажи.  
 
Private Sub CommandButton1_Click()  
Dim iipath As String  
iipath = ThisWorkbook.Path & "\"Собирающий.xlsx"  
Range("A1:H1").Copy  
Do Until IsOpen(iipath) = False  
DoEvents  
Loop  
Workbooks.Open (iipath)  
Sheets("Лист1").Select  
If Range("A2").Value = "" Then  
Range("A2").Select  
Else  
Range("A1").Select  
Selection.End(xlDown).Select  
ActiveCell.Offset(1).Select  
End If  
   ActiveSheet.Paste  
   Application.CutCopyMode = False  
ActiveWorkbook.Close True  
End Sub  
 
Function IsOpen(sFileName As String) As Boolean  
Dim FN%  
FN = FreeFile  
On Error Resume Next  
Open sFileName For Random Access Read Write Lock Read Write As #FN  
Close #FN  
IsOpen = Err  
End Function
 
Я думаю, что iipath нужно через GetObject() открывать. И вероятно можно так скрытым и сохранять - если надо будет просматривать глазами - тогда можно вручную или кодом окно отобразить.  
А то так может что-то поломаться, если вдруг в непредсказуемый момент через 5-10 секунд Workbooks.Open (iipath) случится...
 
Нет, я не об этом - просто заменить Workbooks.Open (iipath) на with getobject(iipath)  
Чтоб книга неожиданно не возникла на экране в неподходящий момент.
Страницы: 1
Читают тему
Наверх