Мой вопрос: используя VBA в Excel 2013, как я могу изящно закрыть весь экземпляр Excel, когда пользователь решает, что он не хочет заполнять пользовательскую форму, и нажимает кнопку «Выход» или «Отмена»?
В настоящее время, если пользователь нажимает «выход» или «отмена», я проверяю, является ли мой экземпляр единственным открытым. Если это не так, я могу использовать ThisWorkbook.Close, и я думаю, что все будет в порядке. Однако, если это так, я не хочу, чтобы приложение все еще присутствовало, поэтому я использовал Application.Quit. Это, тем не менее, пытается завершить выполнение макроса, выдает ошибки (первоначально «несоответствие типов», потому что я выгружаю форму) и закрывается только после того, как я нажимаю «Отладка» или «Конец» (что он делает так быстро, я не могу на самом деле отлаживать). Я пока игнорирую первый случай и просто пытаюсь выйти из всего приложения. Это очень длинный макрос с множеством подпрограмм и функций, поэтому для отладки и публикации здесь я его сократил. Ошибка несоответствия типов больше не возникает, но я считаю, что это было следствием фактической ошибки: код, выполняемый после вызова команды для закрытия приложения.
Во-первых, вот код, который запускает все:
Private Sub CommandButton1_Click()
Call form_variables
frm_REQUEST.Show
Call a_REQUEST_main
End Sub
Подпрограмма
form_variables
это подпрограмма, которая создает общедоступные переменные, поэтому я могу хранить данные из пользовательской формы.
frm_REQUEST.Show
инициализирует (включая вызов функции, которая находит другую книгу, извлекает список, выполняет некоторое форматирование, закрывает книгу и вводит список в раскрывающийся список пользовательских форм) и показывает форму, и, наконец,
a_REQUEST_main
использует общедоступные переменные (где хранятся данные пользовательской формы) и делает свое дело (но не должен ничего делать, если пользовательская форма закрыта).
Код, который выполняется при вызове .Show:
Private Sub UserForm_Initialize()
' Get job numbers from other workbook
Dim job_selection_list As Variant
job_selection_list = get_job_list()
With frm_REQUEST.Job_Number_ComboBox
.List = job_selection_list
End With
' set focus on Job Numbers
JN_combobox.SetFocus
End Sub
Private Sub cancel_button_Click()
Set job_selection_list = Nothing
Unload Me
Application.Quit
End Sub
Private Sub submit_button_Click()
' Values from userform saved as global (?) variables so other subroutines can access.
End Sub
Я прошел через программу и увидел, что после вызова Application.Quit в пользовательской форме макрос в основной подпрограмме выполняет шаги для
Call a_REQUEST_main
но на самом деле он должен просто закрыть все. Я пытался выполнять команды «сохранить» и изменять порядок вещей, и читал об объектах, которые не нужно устанавливать ни на что (отсюда и настройка job_selection_list, которая создается при инициализации выпадающего списка), но я не могу получить это, чтобы работать, или найти что-нибудь в Интернете. Может ли кто-нибудь дать некоторые рекомендации или сообщить мне о лучшем способе закрытия экземпляра Excel? Помоги мне Stack-Overflow Кеноби, ты моя единственная надежда!
Спасибо.
QueryClose
и/илиTerminate
, если они у вас есть. Я думаю, вы делаете это излишне сложным, пытаясь воспроизвести встроенный обработчик событий с помощью кнопки. - person David Zemens   schedule 21.06.2014Call cancel_button_Click
в блок кодаQueryClose
, но, как я объясню в ответ на ваш комментарий ниже, я не думаю, что все это действительно имело значение... - person TenaciousSisyphus   schedule 21.06.2014QueryClose
на самом деле необходим только в том случае, если вам нужно перехватить какое-то условие, из-за которогоTerminate
не произойдет. Если у вас нет ничего существенного в этом случае, просто используйте обработчикTerminate
сам по себе :) - person David Zemens   schedule 21.06.2014