Столкнулся с решением вопроса по теме поста. Исходные параметры работы моего макроса: Запускаем 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 ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично
' 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)
Открытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:
Исполняет, но результат - остается видимым стандартное окно приложения 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 файлы, то буду благодарен.
Всем добрый день!
Столкнулся с решением вопроса по теме поста. Исходные параметры работы моего макроса: Запускаем 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 ' сохраняем данные из временной таблицы активной книги в исходник откуда данные были взяты первично
' 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)
Открытие файла исходника данных макросом, перенос в него данных из временной таблицы - происходит отлично и незаметно для пользователя. Но не могу побороть проблему с закрытием самой активной книги с макросом без косяков после. А именно использование стандартного:
Исполняет, но результат - остается видимым стандартное окно приложения 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
Сообщение отредактировал DZAZ - Четверг, 08.08.2019, 11:20