还有一个用户表单是非模态的,同时仍然像模态表单一样暂停代码执行吗?
我希望显示userform,但仍然允许与父程序进行交互。模态形式与父程序的块交互。非模式表单可以工作,但我希望在窗体运行时代码执行暂停。
为此,我创建了一个无限循环来检查表单是否可见,但这似乎有点麻烦。
Public Sub GetFormInfoAndDoStuff
ufForm.show vbModeless
Do while ufForm.Visible
DoEvents
Loop
' Do other stuff dependent on form
End Sub编辑以澄清.show后的代码存在,该代码必须在用户表单完成后执行
发布于 2013-05-31 15:16:26
您应该能够将表单显示为vbModeless,并且只在特殊请求时执行代码,例如来自CommandButton或其他控件的代码。
然后,通过"X“按钮或通过调用UserForm_Terminate事件的另一个控件,将表单保持可见/显示直到它被特别关闭。
为了实现这一点,您可能需要将一些可执行代码移动到另一个子程序和/或模块中,并调用该子例程(例如从CommandButton_Click事件)。
您已经在某个地方有一个子例程,其中包含如下一行:
Sub ShowTheForm()
UserForm1.Show vbModeless
End Sub因此,表单将正确显示,以允许用户输入到父应用程序。
您实际上不需要在上面的模块中添加任何其他代码。我们将把其他代码放在其他模块/subs中,然后从用户控件(如命令按钮)调用它。
示例:
获取所有可执行代码,并将其放入另一个子程序(如果适合您的组织偏好,则使用另一个模块),如下所示:
Sub MyMacro(msg$)
MsgBox msg
End Sub在UserForm上,添加一个命令按钮,并为它分配以下代码:
Sub CommandButton1_Click()
MyMacro "hello"
End Sub现在,表单将显示,直到用户单击"X“按钮。只有当从命令按钮调用时,代码才会运行。
编辑用于澄清
您不需要使用此方法“暂停”执行。一旦表单被无模型显示,并且表单仍然存在,执行就会结束。该对象有一些事件,您可以使用这些事件来触发代码的进一步执行。
发布于 2017-05-03 16:39:09
我就是这么做的。
此示例用于我称为"Find“的表单。代码试图查找几个列标题,但其中一些列的标记可能丢失(标题文本可能被随机覆盖),因此我可能需要暂停并要求用户为我找到(单击)一些标头:
首先,将此声明放入标准模块中。
Public bDlgFindHeaderIsShowingModeless As Boolean然后,将其放入事件过程中,用于任何取消无模式对话框的按钮或其他控件,例如窗体的OK和Cancel按钮的Click事件:
bDlgFindHeaderIsShowingModeless = False然后,将它放在代码中要显示的非模态表单的任何位置,同时暂停用户的交互性:
bDlgFindHeaderIsShowingModeless = True 'init
frmFindHeader.Show vbModeless
Do
If Not bDlgFindHeaderIsShowingModeless Then Exit Do
DoEvents
Loop是的,它搅动了CPU,所以如果您使用的是单核处理器,并且有非常重要的后台进程正在运行,那么您可能不想这样做。但是它是有效的;当非模态表单显示时,用户能够轻松、顺利地与Excel交互。用户并不觉得他们在进行无止境的循环。
发布于 2019-10-09 15:23:52
最好的方法是使用两种不同的潜艇。我能够解决这个问题,而不分裂我的分科如下:
Public Mode as Boolean
Sub Stuff()
If Mode Then
Goto Continue
End If
'Code before Userform
Mode = True
Userform.Show vbModeless
Exit Sub
Continue:
Mode = False
'Rest of your code
End Sub我使"Mode“成为一个全局变量,因为我将这个userform用于多个子类。如果您使用的是单个子,您可以在本地使用它。在打开此工作簿时,我还在"ThisWorkbook“选项卡下添加了以下代码,从而使"Mode”为false:
Private Sub Workbook_Open()
Mode = False
End Sub这将再次需要,只有当你使用你的用户名多个子。最后,在按下“继续”按钮时,将此代码添加到您的Userform代码下。
Private Sub Confirm_Click()
Userform.hide
if Mode Then
Call Stuff
End If
End Sub如果您只使用one sub方法,跳过If语句,只需调用sub。
https://stackoverflow.com/questions/16859038
复制相似问题