Как создать экземпляр именованного объекта Excel.Application, чтобы разрешить сборку мусора после макроса после непредвиденного - PullRequest
2 голосов
/ 21 января 2012

Я относительный новичок в VBA и занимаюсь разработкой довольно сложного макроса, который может работать от 10 секунд до 10 минут, который выполняет большую часть своей работы в другом невидимом экземпляре Excel, созданном Dim appDatabaseInstance = New Excel.Application.Есть целый ряд функций и подпрограмм, которые используются в ходе выполнения кода, и хотя я приложил все усилия, чтобы гарантировать, что appDatabaseInstance.Quit вызывается всякий раз, когда что-то не так предсказуемо, есть одна вещь, которую я не могу контролировать- пользователь.

В частности, если пользователь решит, что программа завершилась сбоем и удерживает escape, VBA прервет выполнение, и из-за того, как произошел разрыв, ни одна из моих процедур сборки мусора (я думаю) не завершится.происходит.

Таким образом, я был бы намного счастливее, если бы мог как-то назвать экземпляр, который я создаю, предсказуемым образом, а затем попытался бы, прежде чем создать новый, найти существующий и разобраться с ним.это соответственно.Таким образом, даже если неудачный экземпляр приложения останется открытым, он закроется, как только пользователь попробует что-нибудь еще, связанное с программой (а если нет, то один экземпляр вряд ли вызовет слишком много головных болей в контексте).

У кого-нибудь есть предложения?

Ответы [ 2 ]

6 голосов
/ 21 января 2012

Вы можете использовать свойство EnableCancelKey объекта Application, чтобы определить, что произойдет, когда пользователь прервет ваш код

Предлагаю вам посмотреть эту запись на EnableCancelKey в блоге Дика.

В итоге, EnableCancelKey имеет три возможных параметра:

  • xlDisable - Запрещает пользователю прерывать код
  • xlInterrupt - Нормальная работа. Отладчик показан, и код находится в режиме отладки в той строке, в которой он находился, когда был прерван.
  • xlErrorHandler - Вызывает ошибку № 18 и реагирует так же, как и любая другая ошибка. Если у вас настроена обработка ошибок, она называется.
3 голосов
/ 21 января 2012

Раньше мне приходилось делать нечто подобное в VBA.Метод follow закроет все другие процессы Excel, кроме того, который в данный момент выполняет код. Пожалуйста, не забудьте сохранить ваши вещи, прежде чем пытаться запустить этот код!

Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Sub CloseOtherInstances()

  Dim currentId As Long
  Dim wmiObj As Object
  Dim process As Object
  Dim processes As Object

  currentId = GetCurrentProcessId

  Set wmiObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

  Set processes = wmiObj.ExecQuery("select * from win32_process where name ='EXCEL.exe'")

  For Each process In processes
    If process.ProcessId <> currentId Then process.Terminate
  Next process

End Sub
...