2013-05-31 4 views
1

Есть ли в любом случае пользовательская форма, которая действует немодально, но все же приостанавливает выполнение кода как модальную форму?Форма моделирования, которая все еще приостанавливает выполнение кода

Я бы хотел, чтобы пользовательская форма отображалась, но все же допускает взаимодействие с родительской программой. Модальные формы блокируют взаимодействие с родительской программой. Могущественная форма работала бы, но я хотел бы, чтобы выполнение кода приостанавливалось, пока форма была вверх.

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

Public Sub GetFormInfoAndDoStuff  
    ufForm.show vbModeless 

    Do while ufForm.Visible 
    DoEvents 
    Loop 

    ' Do other stuff dependent on form 
End Sub 

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

+1

Я понимаю, что вы хотите, чтобы код выполнялся после закрытия UF, я просто предполагаю, что метод, который вы используете для этого, неверен. Поместите исполняемый код в другой модуль и вызовите его из события UserForm_Terminate. –

ответ

3

Вы должны быть в состоянии отобразить форму, как vbModeless и только выполнить код, когда конкретно просил, т.е. от CommandButton или другого элемента управления.

Вы оставляете форму видимой/показанной до тех пор, пока она не будет закрыта специально, с помощью кнопки «X» или с помощью другого элемента управления, который вызывает событие UserForm_Terminate.

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

У вас уже есть где-то подпрограмма, которая содержит строку:

Sub ShowTheForm() 

    UserForm1.Show vbModeless 
End Sub 

Таким образом, форма отображается должным образом, чтобы разрешить ввод пользователя в родительском приложении.

Вам действительно не нужно помещать какой-либо другой код в указанный выше модуль. Мы поместим другой код в другие модули/субтитры, а затем вызовем его из пользовательских элементов управления, таких как командные кнопки.

Пример:

Принимайте весь исполняемый код, и поместить его в другой подпрограмме (и, если это подходит для вашей организации предпочтения, другой модуль), например:

Sub MyMacro(msg$) 
    MsgBox msg 
End Sub 

На UserForm , добавьте командную кнопку и назначьте ей следующий код:

Sub CommandButton1_Click() 
    MyMacro "hello" 
End Sub 

Теперь форма будет отображаться до тех пор, пока пользователь не нажмет кнопку кнопку «X». Код будет запускаться только при вызове из командной кнопки.

редактирования.К РАЗЪЯСНЕНИИ

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

+0

Если я не читаю вас неправильно, это работает, но только в том случае, если основному модулю больше нечего делать. В основном модуле я делаю много действий в своем основном модуле после отображения формы. Если я просто использую немодальную форму, код ниже .show выполняется сразу после отображения формы. – lfrandom

+0

Думаю, вам нужно переориентировать свой код. В настоящее время у меня есть приложение с примерно 50 модулями кода, несколькими сотнями подпрограмм и функций, 6 пользовательских форм с сотнями полей форм, распространенных в этих формах, и модулем классов для событий. Все в моем приложении зависит от формы ** как входов ** для выполнения других подпрограмм и функций. Философия заключается в том, чтобы форма была формой и использовала другие подпрограммы и функции для выполнения операций над вашей книгой и т. Д. –

+0

** Если я просто использую немодальную форму, код ниже .show выполняется сразу после отображения формы. ** Именно поэтому вам нужно отправить свой * исполняемый * код в другие модули и подпрограммы и только при необходимости вызовите эти подпрограммы. –

0

Вот что я делаю.

Этот пример предназначен для формы, которую я назвал «Find Header».Код пытается найти несколько заголовков столбцов, но маркеры для некоторых из них могут отсутствовать (и текст заголовка может быть перезаписан каким-то случайным), поэтому мне может потребоваться приостановить и попросить пользователя найти (нажмите) некоторые из заголовков для меня:

во-первых, поставить эту декларацию в стандартном модуле в :

Public bDlgFindHeaderIsShowingModeless As Boolean 

Затем поместите это в процедуре события для любой кнопки или другого элемента управления, увольняет немодальную диалог, такие как события Click для кнопок формы и отмена:

bDlgFindHeaderIsShowingModeless = False 

Затем поместите это везде, где в вашем коде вы хотите показать немодальную форму во время паузы для интерактивности:

bDlgFindHeaderIsShowingModeless = True 'init 
frmFindHeader.Show vbModeless 
Do 
    If Not bDlgFindHeaderIsShowingModeless Then Exit Do 
    DoEvents 
Loop 

Да, он штампует процессор, так что вы не можете сделать это, если вы на одноядерном процессоре, и есть критически важные фоновые процессы. Но это работает; пользователь может легко и плавно взаимодействовать с Excel, пока отображается немощная форма. Пользователь не чувствует, что они борются с бесконечным циклом.