Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Закрытие файла из которого был запущен макрос - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Закрытие файла из которого был запущен макрос (Макросы/Sub)
Закрытие файла из которого был запущен макрос
ZamoK Дата: Пятница, 02.06.2017, 15:45 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Добрый день!
Есть файл на сервере и копия на рабочей машине. Рабочий файл при открытии проверяет наличие обновления на сервере, и если файл новее, то файл рабочий нужно заменить на версию с сервера по средствам работы макроса запущенного из рабочей копии.
Макрос рабочей копии:
[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
    
    FileCopy sFileName, sNewFileName 'копируем файл
    MsgBox "Файл скопирован", vbInformation, ""
   
    With ActiveWorkbook 'закрываем активную книгу
        .Close False
    End With
    
End Sub
[/vba]

Дело в том, что по отдельности все макросы работают как-бы хорошо, но когда вместе,то при закрытии рабочей книги (Workbooks("Книга1.xls").Close False 'закрываем книгу) работа запущенного из неё макроса другой книги тоже прекращается.
Можно ли как-то исправить?


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Пятница, 02.06.2017, 15:47
 
Ответить
СообщениеДобрый день!
Есть файл на сервере и копия на рабочей машине. Рабочий файл при открытии проверяет наличие обновления на сервере, и если файл новее, то файл рабочий нужно заменить на версию с сервера по средствам работы макроса запущенного из рабочей копии.
Макрос рабочей копии:
[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
    
    FileCopy sFileName, sNewFileName 'копируем файл
    MsgBox "Файл скопирован", vbInformation, ""
   
    With ActiveWorkbook 'закрываем активную книгу
        .Close False
    End With
    
End Sub
[/vba]

Дело в том, что по отдельности все макросы работают как-бы хорошо, но когда вместе,то при закрытии рабочей книги (Workbooks("Книга1.xls").Close False 'закрываем книгу) работа запущенного из неё макроса другой книги тоже прекращается.
Можно ли как-то исправить?

Автор - ZamoK
Дата добавления - 02.06.2017 в 15:45
Roman777 Дата: Пятница, 02.06.2017, 16:06 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, мб Вам просто строчку [vba]
Код
Workbooks("Книга1.xls").Close False 'закрываем книгу
[/vba] перенести в самый конец макроса tt?

а, всё, врубился.


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 02.06.2017, 16:08
 
Ответить
СообщениеZamoK, мб Вам просто строчку [vba]
Код
Workbooks("Книга1.xls").Close False 'закрываем книгу
[/vba] перенести в самый конец макроса tt?

а, всё, врубился.

Автор - Roman777
Дата добавления - 02.06.2017 в 16:06
ZamoK Дата: Пятница, 02.06.2017, 16:08 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Дело в том, что его наверно нужно закрыть и заменить копией с сервера, иначе если он открыт копирование вызовит ошибку


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеДело в том, что его наверно нужно закрыть и заменить копией с сервера, иначе если он открыт копирование вызовит ошибку

Автор - ZamoK
Дата добавления - 02.06.2017 в 16:08
Roman777 Дата: Пятница, 02.06.2017, 16:12 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, тут нужно передавать управление кому-то, иначе кто будет управлять программой, запущенной файлом, который Вы хотите закрыть. Мб как Вариан, сначала создавать в процессе копию книги (или просто пустую книгу) с макросом, который и будет выполнять эту процедуру, не мешая закрыть книгу "Книга1.xls".


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, тут нужно передавать управление кому-то, иначе кто будет управлять программой, запущенной файлом, который Вы хотите закрыть. Мб как Вариан, сначала создавать в процессе копию книги (или просто пустую книгу) с макросом, который и будет выполнять эту процедуру, не мешая закрыть книгу "Книга1.xls".

Автор - Roman777
Дата добавления - 02.06.2017 в 16:12
ZamoK Дата: Пятница, 02.06.2017, 16:17 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Я не очень силён в vba , но как вариант сделать приват в файле Копирование, а в самом фале сделать close falce через паузу, вот только будет ли работать и как реализовать - знаний не хварает


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Пятница, 02.06.2017, 16:17
 
Ответить
СообщениеЯ не очень силён в vba , но как вариант сделать приват в файле Копирование, а в самом фале сделать close falce через паузу, вот только будет ли работать и как реализовать - знаний не хварает

Автор - ZamoK
Дата добавления - 02.06.2017 в 16:17
Roman777 Дата: Пятница, 02.06.2017, 17:00 | Сообщение № 6
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, Вот такое извращение, я имел в виду.

Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно... что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1):
[vba]
Код
    TempWB.ChangeFileAccess Mode:=xlReadOnly
    SetAttr iFullName$, vbNormal: Kill iFullName$
    TempWB.Close saveChanges:=False
[/vba]
К сообщению приложен файл: 6821211.rar (29.8 Kb)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 02.06.2017, 17:09
 
Ответить
СообщениеZamoK, Вот такое извращение, я имел в виду.

Эта часть не моя, она удаляет файл Temp.xls (пока сам не очень понимаю как именно... что-то тут особенное в SetAttr), который собственно и управлял процессом (копия Книги1):
[vba]
Код
    TempWB.ChangeFileAccess Mode:=xlReadOnly
    SetAttr iFullName$, vbNormal: Kill iFullName$
    TempWB.Close saveChanges:=False
[/vba]

Автор - Roman777
Дата добавления - 02.06.2017 в 17:00
Manyasha Дата: Пятница, 02.06.2017, 22:50 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Может попробовать через скрипт 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]
К сообщению приложен файл: ttttt.rar (12.0 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеМожет попробовать через скрипт 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]

Автор - Manyasha
Дата добавления - 02.06.2017 в 22:50
ZamoK Дата: Понедельник, 05.06.2017, 09:12 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, Дошло! и как я сам, то не догадался через "переименование и сохранение" открытого все сделать. Roman777, ну ты и голова!!!

Правда я не понял файл -копия что-то не дорабатывает, там tt-шка процедуру завершает, но даже если завершение обойти я не понял что должно произойти процедура завершается как-то не ожиданно.


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 09:25
 
Ответить
СообщениеRoman777, Дошло! и как я сам, то не догадался через "переименование и сохранение" открытого все сделать. Roman777, ну ты и голова!!!

Правда я не понял файл -копия что-то не дорабатывает, там tt-шка процедуру завершает, но даже если завершение обойти я не понял что должно произойти процедура завершается как-то не ожиданно.

Автор - ZamoK
Дата добавления - 05.06.2017 в 09:12
ZamoK Дата: Понедельник, 05.06.2017, 09:12 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Manyasha, Блин ну такое я вообще вижу впервые, и теперь точно могу сказать , что я ничего вааще не знаю про эти, как их - макросы! Круто ща прикручу их оба к оригиналу, отпишусь.


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 09:21
 
Ответить
СообщениеManyasha, Блин ну такое я вообще вижу впервые, и теперь точно могу сказать , что я ничего вааще не знаю про эти, как их - макросы! Круто ща прикручу их оба к оригиналу, отпишусь.

Автор - ZamoK
Дата добавления - 05.06.2017 в 09:12
Roman777 Дата: Понедельник, 05.06.2017, 09:34 | Сообщение № 10
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, тут принципиально не
"переименование и сохранение"
, а именно функция "Сохранить как" (ну да, под другим именем, разумеется).
И в сообщении №6, если что, макрос "delll()" лишний, остался с моих тестов...
Толи я разучился, толи ограничения тут есть на редактирование старых сообщений, почему-то поправить уже не могу.


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, тут принципиально не
"переименование и сохранение"
, а именно функция "Сохранить как" (ну да, под другим именем, разумеется).
И в сообщении №6, если что, макрос "delll()" лишний, остался с моих тестов...
Толи я разучился, толи ограничения тут есть на редактирование старых сообщений, почему-то поправить уже не могу.

Автор - Roman777
Дата добавления - 05.06.2017 в 09:34
Pelena Дата: Понедельник, 05.06.2017, 09:46 | Сообщение № 11
Группа: Админы
Ранг: Местный житель
Сообщений: 19179
Репутация: 4419 ±
Замечаний: ±

Excel 365 & Mac Excel
ограничения тут есть на редактирование старых сообщений

Ага, сутки со времени публикации


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
ограничения тут есть на редактирование старых сообщений

Ага, сутки со времени публикации

Автор - Pelena
Дата добавления - 05.06.2017 в 09:46
ZamoK Дата: Понедельник, 05.06.2017, 13:02 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, твой вариант работает, это хорошо! Но работает он 4 мин 35 сек, не знаю почему. Может потому, что файл весит 326 мб? А может что в коде поменять надо - незнаю.
Manyasha, пример работает хорошо, но мой файл версии 2003 года и замена xlsx на xls - не помогла. Чего-то ещё надо поменять наверно, и запускать его надо отдельно да? запустить из под открытого файла excel нельзя?


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеRoman777, твой вариант работает, это хорошо! Но работает он 4 мин 35 сек, не знаю почему. Может потому, что файл весит 326 мб? А может что в коде поменять надо - незнаю.
Manyasha, пример работает хорошо, но мой файл версии 2003 года и замена xlsx на xls - не помогла. Чего-то ещё надо поменять наверно, и запускать его надо отдельно да? запустить из под открытого файла excel нельзя?

Автор - ZamoK
Дата добавления - 05.06.2017 в 13:02
ZamoK Дата: Понедельник, 05.06.2017, 13:07 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, может "сохранить как" заменить на "сохранить лист как" чтоб сохранять не все 326 мб, а только выборочно, например удалить все листы кроме Лист1 и потом сохранить как?


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеRoman777, может "сохранить как" заменить на "сохранить лист как" чтоб сохранять не все 326 мб, а только выборочно, например удалить все листы кроме Лист1 и потом сохранить как?

Автор - ZamoK
Дата добавления - 05.06.2017 в 13:07
Roman777 Дата: Понедельник, 05.06.2017, 13:32 | Сообщение № 14
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK,
Попробуйте в Макрос1() заменить строчку
[vba]
Код
    ThisWorkbook.SaveAs Path1 & "Temp.xls"
[/vba]
на[vba]
Код
     ActiveSheet.SaveAs Path1 & "Temp.xls"
[/vba] (тут макрос будет создавать временный файл уже не полноценным 326мб, а только тот лист, который активен во время запуска макроса).


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK,
Попробуйте в Макрос1() заменить строчку
[vba]
Код
    ThisWorkbook.SaveAs Path1 & "Temp.xls"
[/vba]
на[vba]
Код
     ActiveSheet.SaveAs Path1 & "Temp.xls"
[/vba] (тут макрос будет создавать временный файл уже не полноценным 326мб, а только тот лист, который активен во время запуска макроса).

Автор - Roman777
Дата добавления - 05.06.2017 в 13:32
ZamoK Дата: Понедельник, 05.06.2017, 13:57 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
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
[/vba]

Автор - ZamoK
Дата добавления - 05.06.2017 в 13:57
ZamoK Дата: Понедельник, 05.06.2017, 14:01 | Сообщение № 16
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
в конце обработки выдаёт вот такое сообщение (Сохранить изменения перед переключением состояния файла?) Что это?

Да соврал я что быстро, не то копировал :-) Короче 3 мин что один что второй вариант, это время копирования файла с сервера. Туту ничего не сделаешь.


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 14:18
 
Ответить
Сообщениев конце обработки выдаёт вот такое сообщение (Сохранить изменения перед переключением состояния файла?) Что это?

Да соврал я что быстро, не то копировал :-) Короче 3 мин что один что второй вариант, это время копирования файла с сервера. Туту ничего не сделаешь.

Автор - ZamoK
Дата добавления - 05.06.2017 в 14:01
ZamoK Дата: Понедельник, 05.06.2017, 14:21 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Manyasha, можно ли всё же запустить скрипт vbs из под excel перед закрытием? ( через таймер например?)


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеManyasha, можно ли всё же запустить скрипт vbs из под excel перед закрытием? ( через таймер например?)

Автор - ZamoK
Дата добавления - 05.06.2017 в 14:21
ZamoK Дата: Понедельник, 05.06.2017, 14:27 | Сообщение № 18
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, А можно изменить эту строчку
[vba]
Код
sNewFileName = "D:\Тест1\Test1.xls"    'имя копируемого файла. Директория(в данном случае диск D) должна существовать
[/vba]
чтоб не указывать конкретное место копирования (на каждой машине оно своё), а указать как папка из которой открыт файл или что-то подобное?


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеRoman777, А можно изменить эту строчку
[vba]
Код
sNewFileName = "D:\Тест1\Test1.xls"    'имя копируемого файла. Директория(в данном случае диск D) должна существовать
[/vba]
чтоб не указывать конкретное место копирования (на каждой машине оно своё), а указать как папка из которой открыт файл или что-то подобное?

Автор - ZamoK
Дата добавления - 05.06.2017 в 14:27
Roman777 Дата: Понедельник, 05.06.2017, 15:05 | Сообщение № 19
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
ZamoK, если Вы будете пытаться запустить vbs из файла эксель, будет ровно та же ситуация, что и управление макросом из эксель... нужно будет кому-то передавать управление.
попробуйте так:
[vba]
Код
sNewFileName = thisworkbook.path & "\"
[/vba]


Много чего не знаю!!!!
 
Ответить
СообщениеZamoK, если Вы будете пытаться запустить vbs из файла эксель, будет ровно та же ситуация, что и управление макросом из эксель... нужно будет кому-то передавать управление.
попробуйте так:
[vba]
Код
sNewFileName = thisworkbook.path & "\"
[/vba]

Автор - Roman777
Дата добавления - 05.06.2017 в 15:05
ZamoK Дата: Понедельник, 05.06.2017, 15:11 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Roman777, тогда тут тоже надо что-то менять, ругается !
[vba]
Код
FileCopy sFileName, sNewFileName 'копируем файл
[/vba]


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Понедельник, 05.06.2017, 15:13
 
Ответить
СообщениеRoman777, тогда тут тоже надо что-то менять, ругается !
[vba]
Код
FileCopy sFileName, sNewFileName 'копируем файл
[/vba]

Автор - ZamoK
Дата добавления - 05.06.2017 в 15:11
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Закрытие файла из которого был запущен макрос (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!