Закрытие пользовательской формы с помощью Unload Me не работает

Мне нужно закрыть пользовательскую форму Excel с помощью VBA, когда пользователь нажал кнопку отправки и были выполнены операции.

Как я могу закрыть пользовательскую форму от самой себя?

Я пробовал это, но он возвращает ошибку 361.

Unload Me

person Kian    schedule 28.02.2012    source источник
comment
Откуда вы звоните Unload Me?   -  person Cutter    schedule 29.02.2012
comment
Нужно больше информации. DoCmd — это команда MS-Access, а не команда MS-Excel. Вы пытаетесь закрыть пользовательскую форму Excel из Access?   -  person Siddharth Rout    schedule 29.02.2012
comment
@SiddharthRout Я так думал, когда проводил исследование - просто это было предложено на нескольких форумах.   -  person Kian    schedule 29.02.2012
comment
@Cutter Конец обработчика btnSubmit_Click   -  person Kian    schedule 29.02.2012
comment
Можете ли вы объяснить немного подробнее, что именно вы пытаетесь сделать?   -  person Siddharth Rout    schedule 29.02.2012
comment
После того, как пользователь отправляет данные в форму (нажимает кнопку отправки), я хочу, чтобы форма закрылась   -  person Kian    schedule 29.02.2012
comment
Если вы делаете это с помощью пользовательской формы Excel, то «Выгрузить меня» — правильный способ сделать это. Должна быть какая-то другая причина. Можете ли вы поделиться полным кодом для btnSubmit_Click?   -  person Siddharth Rout    schedule 29.02.2012
comment
давайте продолжим обсуждение в чате   -  person Kian    schedule 29.02.2012
comment
Пожалуйста, не редактируйте ответ на вопрос. Вместо этого опубликуйте его как отдельный ответ ниже и примите его.   -  person Matt    schedule 09.11.2015


Ответы (4)


Как указано в верхнем ответе, я использовал следующее в коде кнопки управления.

Private Sub btnClose_Click()
    Unload Me
End Sub

При этом он не будет пытаться выгрузить элемент управления, а скорее выгрузит пользовательскую форму, в которой находится элемент управления кнопки. Ключевое слово «Я» относится к объекту пользовательской формы, даже когда вызывается из элемента управления в пользовательской форме. Если вы получаете ошибки с этой техникой, есть несколько возможных причин.

  1. Возможно, вы вводите код не в том месте (например, в отдельном модуле).

  2. Возможно, вы используете более старую версию Office. Я использую Office 2013. Я заметил, что VBA со временем меняется.

По моему опыту, использование метода DoCmd.... более специфично для функций макросов в MS Access, но обычно не используется в Excel VBA.

В нормальных (из коробки) условиях приведенный выше код должен работать нормально.

person user4059073    schedule 19.09.2014
comment
Рекомендуем прочитать статью UserForm1.Show?, объясняющую, почему это < i>не лучше всего использовать Unload Me (а также экземпляр UserForm по умолчанию :-). - person T.M.; 20.11.2019

Не видя вашего полного кода, невозможно ответить с уверенностью. Ошибка обычно возникает, когда вы пытаетесь выгрузить элемент управления, а не форму.

Убедитесь, что в скобках нет «я».

Кроме того, если вы можете опубликовать полный код пользовательской формы, это очень поможет.

person SWa    schedule 04.03.2012
comment
Извините, полный код был опубликован здесь. Я обновлю вопрос, чтобы включить его - person Kian; 04.03.2012
comment
Но также я написал, что код Unload Me вернул ошибку 361. - person Kian; 04.03.2012
comment
Привет, Киан, это не полный код пользовательской формы, это код кнопки отправки — у вас есть объявления на уровне класса и т. д. Можете ли вы опубликовать полный код пользовательской формы, включая «Выгрузить меня», который не работай? - person SWa; 04.03.2012
comment
Никаких объявлений уровня класса или чего-то еще; но он внезапно начал работать, поэтому я понятия не имею, в чем проблема. - person Kian; 04.03.2012
comment
хм, mdlRegex для меня подозрительно похож на класс... Рад, что он работает :) - кстати, ваша проверка регулярного выражения не работает для электронных писем - person SWa; 04.03.2012
comment
Ну, это определенно не вызвало никаких ошибок, и когда вы сказали объявления класса уровня, я предположил, что вы имели в виду переменные, которые были объявлены на уровне класса, а не только определения классов. - person Kian; 04.03.2012
comment
Он не объявлен в подразделе, поэтому должен быть объявлен в верхней части класса формы? - person SWa; 04.03.2012
comment
Нет, это только в проекте excel - person Kian; 04.03.2012
comment
Ах, хорошо, лучше не объявлять глобальные переменные, если вам это действительно не нужно, по моему опыту, они могут вызвать больше проблем, чем вызывают, и обычно они не нужны :) - person SWa; 04.03.2012
comment
Я знаю, что это старый ответ, но у меня было «Я» в скобках, и это никогда не работало. Я прочитал это, вынул и все работает. Почему это? Я думал, что функции/процедуры можно вводить как со скобками, так и без них, так какая разница? - person Mike; 07.12.2016

Unload Me работает только тогда, когда он вызывается из пользовательской формы. Если вы хотите закрыть форму из кода другого модуля (или пользовательской формы), вам нужно использовать функцию «Выгрузить» + имя пользовательской формы для закрытия.

Я надеюсь, что это поможет

person Tomamais    schedule 29.02.2012
comment
Вызывается из пользовательской формы. - person Kian; 29.02.2012
comment
Можете ли вы пролить свет на то, почему это не работает? Потому что я уже знал, что Unload Me работает только тогда, когда он вызывается из пользовательской формы, которую вы хотите закрыть. - person Kian; 03.03.2012
comment
Киан, а как насчет Unload Userform1, например? - person Tomamais; 10.08.2012

Следует также отметить, что если у вас есть кнопки, сгруппированные вместе в вашей пользовательской форме, она может связать ее с другой кнопкой в ​​группе, несмотря на то, что вы намеревались щелкнуть.

person SamG    schedule 20.11.2019