Добрый день! Есть файл на сервере и копия на рабочей машине. Рабочий файл при открытии проверяет наличие обновления на сервере, и если файл новее, то файл рабочий нужно заменить на версию с сервера по средствам работы макроса запущенного из рабочей копии. Макрос рабочей копии: [vba]
Код
Sub Макрос1() Application.Run "'\\192.168.178.17\Книга 1\Копирование.xls'!Module1.tt") End Sub
[/vba] Макрос книги Копирование.xls [vba]
Код
Sub tt() 'копирование файла Dim sFileName As String, sNewFileName As String
Workbooks("Копирование.xls").Activate Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "\\192.168.178.17\Книга 1\Книга1.xls" 'имя файла для копирования sNewFileName = "D:\Книга1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
With ActiveWorkbook 'закрываем активную книгу .Close False End With
End Sub
[/vba]
Дело в том, что по отдельности все макросы работают как-бы хорошо, но когда вместе,то при закрытии рабочей книги (Workbooks("Книга1.xls").Close False 'закрываем книгу) работа запущенного из неё макроса другой книги тоже прекращается. Можно ли как-то исправить?
Добрый день! Есть файл на сервере и копия на рабочей машине. Рабочий файл при открытии проверяет наличие обновления на сервере, и если файл новее, то файл рабочий нужно заменить на версию с сервера по средствам работы макроса запущенного из рабочей копии. Макрос рабочей копии: [vba]
Код
Sub Макрос1() Application.Run "'\\192.168.178.17\Книга 1\Копирование.xls'!Module1.tt") End Sub
[/vba] Макрос книги Копирование.xls [vba]
Код
Sub tt() 'копирование файла Dim sFileName As String, sNewFileName As String
Workbooks("Копирование.xls").Activate Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "\\192.168.178.17\Книга 1\Книга1.xls" 'имя файла для копирования sNewFileName = "D:\Книга1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
With ActiveWorkbook 'закрываем активную книгу .Close False End With
End Sub
[/vba]
Дело в том, что по отдельности все макросы работают как-бы хорошо, но когда вместе,то при закрытии рабочей книги (Workbooks("Книга1.xls").Close False 'закрываем книгу) работа запущенного из неё макроса другой книги тоже прекращается. Можно ли как-то исправить?ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Пятница, 02.06.2017, 15:47
ZamoK, тут нужно передавать управление кому-то, иначе кто будет управлять программой, запущенной файлом, который Вы хотите закрыть. Мб как Вариан, сначала создавать в процессе копию книги (или просто пустую книгу) с макросом, который и будет выполнять эту процедуру, не мешая закрыть книгу "Книга1.xls".
ZamoK, тут нужно передавать управление кому-то, иначе кто будет управлять программой, запущенной файлом, который Вы хотите закрыть. Мб как Вариан, сначала создавать в процессе копию книги (или просто пустую книгу) с макросом, который и будет выполнять эту процедуру, не мешая закрыть книгу "Книга1.xls".Roman777
Я не очень силён в vba , но как вариант сделать приват в файле Копирование, а в самом фале сделать close falce через паузу, вот только будет ли работать и как реализовать - знаний не хварает
Я не очень силён в vba , но как вариант сделать приват в файле Копирование, а в самом фале сделать close falce через паузу, вот только будет ли работать и как реализовать - знаний не хвараетZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Пятница, 02.06.2017, 16:17
Sub Макрос1() Dim ACTWB As Workbook Application.DisplayAlerts = False Path1$ = ThisWorkbook.Path & "\" name1$ = ThisWorkbook.Name ThisWorkbook.SaveAs Path1 & "Temp.xls" Set TempWB = ThisWorkbook ' Application.Run "\D\Test1\Temp.xls'!Module1.tt" Call tt iFullName$ = TempWB.FullName Application.DisplayAlerts = True Set ACTWB = Workbooks.Open(Path1 & name1) TempWB.ChangeFileAccess Mode:=xlReadOnly SetAttr iFullName$, vbNormal: Kill iFullName$ TempWB.Close saveChanges:=False End Sub Sub delll() iFullName$ = "D:\Тест1\Temp.xls" Application.DisplayAlerts = False wb.ChangeFileAccess Mode:=xlReadOnly SetAttr iFullName$, vbNormal: Kill iFullName$ wb.Close saveChanges:=False End Sub
Sub tt() 'копирование файла Dim sFileName As String, sNewFileName As String
' Workbooks("Копирование.xls").Activate ' Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "D:\Тест2\Test2.xls" 'имя файла для копирования" sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
' With ActiveWorkbook 'закрываем активную книгу ' .Close False ' End With
End Sub
[/vba]
Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно... что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1): [vba]
Sub Макрос1() Dim ACTWB As Workbook Application.DisplayAlerts = False Path1$ = ThisWorkbook.Path & "\" name1$ = ThisWorkbook.Name ThisWorkbook.SaveAs Path1 & "Temp.xls" Set TempWB = ThisWorkbook ' Application.Run "\D\Test1\Temp.xls'!Module1.tt" Call tt iFullName$ = TempWB.FullName Application.DisplayAlerts = True Set ACTWB = Workbooks.Open(Path1 & name1) TempWB.ChangeFileAccess Mode:=xlReadOnly SetAttr iFullName$, vbNormal: Kill iFullName$ TempWB.Close saveChanges:=False End Sub Sub delll() iFullName$ = "D:\Тест1\Temp.xls" Application.DisplayAlerts = False wb.ChangeFileAccess Mode:=xlReadOnly SetAttr iFullName$, vbNormal: Kill iFullName$ wb.Close saveChanges:=False End Sub
Sub tt() 'копирование файла Dim sFileName As String, sNewFileName As String
' Workbooks("Копирование.xls").Activate ' Workbooks("Книга1.xls").Close False 'закрываем книгу
sFileName = "D:\Тест2\Test2.xls" 'имя файла для копирования" sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать If Dir(sFileName, 16) = "" Then MsgBox "Нет такого файла", vbCritical, "Ошибка": Exit Sub
' With ActiveWorkbook 'закрываем активную книгу ' .Close False ' End With
End Sub
[/vba]
Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно... что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1): [vba]
Может попробовать через скрипт vbs? Вместо Файла-копии запускать нужно скрипт open file.vbs из папки test2. [vba]
Код
Dim fileOrig, fileCopy Dim oExcel, fso Dim date1, date2
fileOrig = "D:\test1\original.xlsx" fileCopy = "D:\test2\copy.xlsx" Set fso = WScript.CreateObject("Scripting.Filesystemobject")
If Not fso.FileExists(fileOrig) Then msgbox "Файл " & fileOrig & " отсутствует!" WScript.Quit Else
Set date1 = fso.GetFile(fileOrig) Set date2 = fso.GetFile(fileCopy) If date2.DateLastModified < date1.DateLastModified Then fso.CopyFile fileOrig, fileCopy msgbox "Файл обновлен" End If
Set oExcel = WScript.CreateObject("Excel.Application") oExcel.Visible = true oExcel.Workbooks.Open(fileCopy) End If Set oExcel = Nothing Set fso = Nothing
[/vba]
Может попробовать через скрипт vbs? Вместо Файла-копии запускать нужно скрипт open file.vbs из папки test2. [vba]
Код
Dim fileOrig, fileCopy Dim oExcel, fso Dim date1, date2
fileOrig = "D:\test1\original.xlsx" fileCopy = "D:\test2\copy.xlsx" Set fso = WScript.CreateObject("Scripting.Filesystemobject")
If Not fso.FileExists(fileOrig) Then msgbox "Файл " & fileOrig & " отсутствует!" WScript.Quit Else
Set date1 = fso.GetFile(fileOrig) Set date2 = fso.GetFile(fileCopy) If date2.DateLastModified < date1.DateLastModified Then fso.CopyFile fileOrig, fileCopy msgbox "Файл обновлен" End If
Set oExcel = WScript.CreateObject("Excel.Application") oExcel.Visible = true oExcel.Workbooks.Open(fileCopy) End If Set oExcel = Nothing Set fso = Nothing
Roman777, Дошло! и как я сам, то не догадался через "переименование и сохранение" открытого все сделать. Roman777, ну ты и голова!!!
Правда я не понял файл -копия что-то не дорабатывает, там tt-шка процедуру завершает, но даже если завершение обойти я не понял что должно произойти процедура завершается как-то не ожиданно.
Roman777, Дошло! и как я сам, то не догадался через "переименование и сохранение" открытого все сделать. Roman777, ну ты и голова!!!
Правда я не понял файл -копия что-то не дорабатывает, там tt-шка процедуру завершает, но даже если завершение обойти я не понял что должно произойти процедура завершается как-то не ожиданно.ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 09:25
Manyasha, Блин ну такое я вообще вижу впервые, и теперь точно могу сказать , что я ничего вааще не знаю про эти, как их - макросы! Круто ща прикручу их оба к оригиналу, отпишусь.
Manyasha, Блин ну такое я вообще вижу впервые, и теперь точно могу сказать , что я ничего вааще не знаю про эти, как их - макросы! Круто ща прикручу их оба к оригиналу, отпишусь.ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 09:21
, а именно функция "Сохранить как" (ну да, под другим именем, разумеется). И в сообщении №6, если что, макрос "delll()" лишний, остался с моих тестов... Толи я разучился, толи ограничения тут есть на редактирование старых сообщений, почему-то поправить уже не могу.
, а именно функция "Сохранить как" (ну да, под другим именем, разумеется). И в сообщении №6, если что, макрос "delll()" лишний, остался с моих тестов... Толи я разучился, толи ограничения тут есть на редактирование старых сообщений, почему-то поправить уже не могу.Roman777
Roman777, твой вариант работает, это хорошо! Но работает он 4 мин 35 сек, не знаю почему. Может потому, что файл весит 326 мб? А может что в коде поменять надо - незнаю. Manyasha, пример работает хорошо, но мой файл версии 2003 года и замена xlsx на xls - не помогла. Чего-то ещё надо поменять наверно, и запускать его надо отдельно да? запустить из под открытого файла excel нельзя?
Roman777, твой вариант работает, это хорошо! Но работает он 4 мин 35 сек, не знаю почему. Может потому, что файл весит 326 мб? А может что в коде поменять надо - незнаю. Manyasha, пример работает хорошо, но мой файл версии 2003 года и замена xlsx на xls - не помогла. Чего-то ещё надо поменять наверно, и запускать его надо отдельно да? запустить из под открытого файла excel нельзя?ZamoK
Roman777, может "сохранить как" заменить на "сохранить лист как" чтоб сохранять не все 326 мб, а только выборочно, например удалить все листы кроме Лист1 и потом сохранить как?
Roman777, может "сохранить как" заменить на "сохранить лист как" чтоб сохранять не все 326 мб, а только выборочно, например удалить все листы кроме Лист1 и потом сохранить как?ZamoK
Roman777, отлично теперь 25 сек. А попробовал вот этот макрос прикрутил перед сохранением и вообще 10 секунд получилось [vba]
Код
Sub Del3Sheets() Dim s As Object, a As Variant, i As Integer, d As Boolean a = Array("SheetName1", "SheetName2", "SheetName3") Application.DisplayAlerts = False For Each s In Sheets d = True For i = LBound(a) To UBound(a) If s.Name = a(i) Then d = False Next i If d Then s.Delete Next s Application.DisplayAlerts = True End Sub
[/vba]
Roman777, отлично теперь 25 сек. А попробовал вот этот макрос прикрутил перед сохранением и вообще 10 секунд получилось [vba]
Код
Sub Del3Sheets() Dim s As Object, a As Variant, i As Integer, d As Boolean a = Array("SheetName1", "SheetName2", "SheetName3") Application.DisplayAlerts = False For Each s In Sheets d = True For i = LBound(a) To UBound(a) If s.Name = a(i) Then d = False Next i If d Then s.Delete Next s Application.DisplayAlerts = True End Sub
в конце обработки выдаёт вот такое сообщение (Сохранить изменения перед переключением состояния файла?) Что это?
Да соврал я что быстро, не то копировал :-) Короче 3 мин что один что второй вариант, это время копирования файла с сервера. Туту ничего не сделаешь.
в конце обработки выдаёт вот такое сообщение (Сохранить изменения перед переключением состояния файла?) Что это?
Да соврал я что быстро, не то копировал :-) Короче 3 мин что один что второй вариант, это время копирования файла с сервера. Туту ничего не сделаешь.ZamoK
Я не Гуру, но стремлюсь!
Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 14:18
sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
[/vba] чтоб не указывать конкретное место копирования (на каждой машине оно своё), а указать как папка из которой открыт файл или что-то подобное?
Roman777, А можно изменить эту строчку [vba]
Код
sNewFileName = "D:\Тест1\Test1.xls" 'имя копируемого файла. Директория(в данном случае диск D) должна существовать
[/vba] чтоб не указывать конкретное место копирования (на каждой машине оно своё), а указать как папка из которой открыт файл или что-то подобное?ZamoK
ZamoK, если Вы будете пытаться запустить vbs из файла эксель, будет ровно та же ситуация, что и управление макросом из эксель... нужно будет кому-то передавать управление. попробуйте так: [vba]
Код
sNewFileName = thisworkbook.path & "\"
[/vba]
ZamoK, если Вы будете пытаться запустить vbs из файла эксель, будет ровно та же ситуация, что и управление макросом из эксель... нужно будет кому-то передавать управление. попробуйте так: [vba]