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

Вход

Регистрация

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

 

= Мир MS Excel/Закрыть Excel, если нет открытых файлов - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Закрыть Excel, если нет открытых файлов
Закрыть Excel, если нет открытых файлов
DZAZ Дата: Четверг, 08.08.2019, 10:53 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 1
Репутация: 0 ±
Замечаний: 0% ±

Excel 2016
Всем добрый день!

Столкнулся с решением вопроса по теме поста.
Исходные параметры работы моего макроса:
Запускаем LAB.xlsm - открывается userform, активная книга Excel скрыта.
Из userform по кнопке запрашиваю отдельный 346.xlsx (name файла разный, поэтому сохраняю каждый раз) с исходными данными для работы по их обогащению.
346.xlsx закрывается сам ,а данные из него вставляются в текущую активную книгу самого макроса (называю ее временной таблицей).
Далее используя userform дополняю данные во временной таблице.
По окончании закрываю userform стандартной кнопкой окна (крестик).
Запускается процедура:

[vba]
Код
Private Sub UserForm_Terminate()

Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
If Process.Caption Like "weigher_web_service*" Then ' ищу терминальную программу, которую запустил дополнительно макросом в самом начале работы
Label11.Caption = "Терминал INFOSCAN остановлен"
Process.Terminate ' завершаю процесс терминальной программы
End If
If Not Process.Caption Like "weigher_web_service*" Then
End If
Next

Call Module1.SaveChangesToSourceFile ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично

Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit

' Dim WSH As Object
' Set WSH = VBA.CreateObject("WScript.Shell")
' WSH.Run "TASKKILL /F /IM excel.exe /T"

End Sub
[/vba]

Процедура, которая вызывается внутри - для переноса данных из временной таблицы в файл с исходными данными, чтобы записать сделанные изменения в данных.
После чего временная таблица очищается перед закрытием.

[vba]
Код
Sub SaveChangesToSourceFile()

If ThisWorkbook.Sheets("Buffer").Range("file_address").Value = "" Then Exit Sub 'если ячейка с адресом файла пуста, то выход из процедуры
Dim SFile As String
SFile = ThisWorkbook.Sheets("Buffer").Range("file_address").Value
Dim SourceTab()
If ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count < 2 Then
Exit Sub
End If
SourceTab = ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Resize(ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Rows.Count, ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count - 1).Value
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=SFile, UpdateLinks:=0, ReadOnly:=False)
Dim RowsCount, ColumnsCount
RowsCount = UBound(SourceTab, 1)
ColumnsCount = UBound(SourceTab, 2)

wb.Sheets("Данные").Cells.Delete

wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).NumberFormat = "@"
wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).Value = SourceTab

Application.DisplayAlerts = False
wb.Close SaveChanges:=True
Application.DisplayAlerts = True

ThisWorkbook.Sheets("Buffer").Columns(2).ClearContents
ThisWorkbook.Sheets("TempTab").Cells.Delete

End Sub
[/vba]

Открытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:

[vba]
Код
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit
[/vba]

Исполняет, но результат - остается видимым стандартное окно приложения Excel пустое, то есть без отображения листа в нем. И нужно закрыть ручками окно в итоге.
Поэтому добрался до того, что в первом куске кода закомментировал, то есть жестко закрыть excel на компе. Все закрывает без вопросов, но это влияет на любые другие Excel файлы открытые в этот момент, путем их закрытия. И что самое еще плохое, то после закрытия таким кодом и открытия любого файла Excel в левой панели видишь восстановленный файл того где собственно макрос. Получается файл был поврежден при закрытии, но попытка увидеть элементы поврежденные, пишет что их нет и все норм. Но в результате сколько раз макрос запускал - столько восстановленных версий будет видно в левой панели любого потом открытого фала Excel.

Использование комбинации:

[vba]
Код
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Dim WSH As Object
Set WSH = VBA.CreateObject("WScript.Shell")
WSH.Run "TASKKILL /F /IM excel.exe /T"
[/vba]

Когда после вроде всего закрытого самим макросом открываешь любой файл Excel в нем есть панель с восстановленным файлом макроса.

Если есть мысли, как победить, чтобы процедура закрывала Excel с макросом без появления восстановленной версии и без влияния на другие открытые Excel файлы, то буду благодарен.


Сообщение отредактировал DZAZ - Четверг, 08.08.2019, 11:20
 
Ответить
СообщениеВсем добрый день!

Столкнулся с решением вопроса по теме поста.
Исходные параметры работы моего макроса:
Запускаем LAB.xlsm - открывается userform, активная книга Excel скрыта.
Из userform по кнопке запрашиваю отдельный 346.xlsx (name файла разный, поэтому сохраняю каждый раз) с исходными данными для работы по их обогащению.
346.xlsx закрывается сам ,а данные из него вставляются в текущую активную книгу самого макроса (называю ее временной таблицей).
Далее используя userform дополняю данные во временной таблице.
По окончании закрываю userform стандартной кнопкой окна (крестик).
Запускается процедура:

[vba]
Код
Private Sub UserForm_Terminate()

Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
If Process.Caption Like "weigher_web_service*" Then ' ищу терминальную программу, которую запустил дополнительно макросом в самом начале работы
Label11.Caption = "Терминал INFOSCAN остановлен"
Process.Terminate ' завершаю процесс терминальной программы
End If
If Not Process.Caption Like "weigher_web_service*" Then
End If
Next

Call Module1.SaveChangesToSourceFile ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично

Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit

' Dim WSH As Object
' Set WSH = VBA.CreateObject("WScript.Shell")
' WSH.Run "TASKKILL /F /IM excel.exe /T"

End Sub
[/vba]

Процедура, которая вызывается внутри - для переноса данных из временной таблицы в файл с исходными данными, чтобы записать сделанные изменения в данных.
После чего временная таблица очищается перед закрытием.

[vba]
Код
Sub SaveChangesToSourceFile()

If ThisWorkbook.Sheets("Buffer").Range("file_address").Value = "" Then Exit Sub 'если ячейка с адресом файла пуста, то выход из процедуры
Dim SFile As String
SFile = ThisWorkbook.Sheets("Buffer").Range("file_address").Value
Dim SourceTab()
If ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count < 2 Then
Exit Sub
End If
SourceTab = ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Resize(ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Rows.Count, ThisWorkbook.Sheets("TempTab").Cells(1, 1).CurrentRegion.Columns.Count - 1).Value
Dim wb As Workbook
Set wb = Workbooks.Open(Filename:=SFile, UpdateLinks:=0, ReadOnly:=False)
Dim RowsCount, ColumnsCount
RowsCount = UBound(SourceTab, 1)
ColumnsCount = UBound(SourceTab, 2)

wb.Sheets("Данные").Cells.Delete

wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).NumberFormat = "@"
wb.Sheets("Данные").Range(Cells(1, 1).Address, Cells(RowsCount, ColumnsCount).Address).Value = SourceTab

Application.DisplayAlerts = False
wb.Close SaveChanges:=True
Application.DisplayAlerts = True

ThisWorkbook.Sheets("Buffer").Columns(2).ClearContents
ThisWorkbook.Sheets("TempTab").Cells.Delete

End Sub
[/vba]

Открытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:

[vba]
Код
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Application.Quit
[/vba]

Исполняет, но результат - остается видимым стандартное окно приложения Excel пустое, то есть без отображения листа в нем. И нужно закрыть ручками окно в итоге.
Поэтому добрался до того, что в первом куске кода закомментировал, то есть жестко закрыть excel на компе. Все закрывает без вопросов, но это влияет на любые другие Excel файлы открытые в этот момент, путем их закрытия. И что самое еще плохое, то после закрытия таким кодом и открытия любого файла Excel в левой панели видишь восстановленный файл того где собственно макрос. Получается файл был поврежден при закрытии, но попытка увидеть элементы поврежденные, пишет что их нет и все норм. Но в результате сколько раз макрос запускал - столько восстановленных версий будет видно в левой панели любого потом открытого фала Excel.

Использование комбинации:

[vba]
Код
Application.DisplayAlerts = False
Excel.ActiveWorkbook.Saved = False
Dim WSH As Object
Set WSH = VBA.CreateObject("WScript.Shell")
WSH.Run "TASKKILL /F /IM excel.exe /T"
[/vba]

Когда после вроде всего закрытого самим макросом открываешь любой файл Excel в нем есть панель с восстановленным файлом макроса.

Если есть мысли, как победить, чтобы процедура закрывала Excel с макросом без появления восстановленной версии и без влияния на другие открытые Excel файлы, то буду благодарен.

Автор - DZAZ
Дата добавления - 08.08.2019 в 10:53
Pelena Дата: Четверг, 08.08.2019, 13:42 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 14327
Репутация: 3132 ±
Замечаний: ±

Excel 2010, 2016 & Mac Excel
DZAZ, прочитайте до конца эту тему
Возможно, это то, что Вы ищете


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеDZAZ, прочитайте до конца эту тему
Возможно, это то, что Вы ищете

Автор - Pelena
Дата добавления - 08.08.2019 в 13:42
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Закрыть Excel, если нет открытых файлов
  • Страница 1 из 1
  • 1
Поиск:

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