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

Вход

Регистрация

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

 

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

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир 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
Группа: Админы
Ранг: Местный житель
Сообщений: 19176
Репутация: 4413 ±
Замечаний: ±

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


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

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

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