首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仍然暂停代码执行的无模型表单

仍然暂停代码执行的无模型表单
EN

Stack Overflow用户
提问于 2013-05-31 13:57:12
回答 3查看 21.9K关注 0票数 5

还有一个用户表单是非模态的,同时仍然像模态表单一样暂停代码执行吗?

我希望显示userform,但仍然允许与父程序进行交互。模态形式与父程序的块交互。非模式表单可以工作,但我希望在窗体运行时代码执行暂停。

为此,我创建了一个无限循环来检查表单是否可见,但这似乎有点麻烦。

代码语言:javascript
复制
Public Sub GetFormInfoAndDoStuff    
  ufForm.show vbModeless

  Do while ufForm.Visible
    DoEvents
  Loop

  ' Do other stuff dependent on form 
End Sub

编辑以澄清.show后的代码存在,该代码必须在用户表单完成后执行

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-31 15:16:26

您应该能够将表单显示为vbModeless,并且只在特殊请求时执行代码,例如来自CommandButton或其他控件的代码。

然后,通过"X“按钮或通过调用UserForm_Terminate事件的另一个控件,将表单保持可见/显示直到它被特别关闭。

为了实现这一点,您可能需要将一些可执行代码移动到另一个子程序和/或模块中,并调用该子例程(例如从CommandButton_Click事件)。

您已经在某个地方有一个子例程,其中包含如下一行:

代码语言:javascript
复制
Sub ShowTheForm()

    UserForm1.Show vbModeless
End Sub

因此,表单将正确显示,以允许用户输入到父应用程序。

您实际上不需要在上面的模块中添加任何其他代码。我们将把其他代码放在其他模块/subs中,然后从用户控件(如命令按钮)调用它。

示例:

获取所有可执行代码,并将其放入另一个子程序(如果适合您的组织偏好,则使用另一个模块),如下所示:

代码语言:javascript
复制
Sub MyMacro(msg$)
    MsgBox msg
End Sub

在UserForm上,添加一个命令按钮,并为它分配以下代码:

代码语言:javascript
复制
Sub CommandButton1_Click()
    MyMacro "hello"
End Sub

现在,表单将显示,直到用户单击"X“按钮。只有当从命令按钮调用时,代码才会运行。

编辑用于澄清

您不需要使用此方法“暂停”执行。一旦表单被无模型显示,并且表单仍然存在,执行就会结束。该对象有一些事件,您可以使用这些事件来触发代码的进一步执行。

票数 6
EN

Stack Overflow用户

发布于 2017-05-03 16:39:09

我就是这么做的。

此示例用于我称为"Find“的表单。代码试图查找几个列标题,但其中一些列的标记可能丢失(标题文本可能被随机覆盖),因此我可能需要暂停并要求用户为我找到(单击)一些标头:

首先,将此声明放入标准模块中。

代码语言:javascript
复制
Public bDlgFindHeaderIsShowingModeless As Boolean

然后,将其放入事件过程中,用于任何取消无模式对话框的按钮或其他控件,例如窗体的OK和Cancel按钮的Click事件:

代码语言:javascript
复制
bDlgFindHeaderIsShowingModeless = False

然后,将它放在代码中要显示的非模态表单的任何位置,同时暂停用户的交互性:

代码语言:javascript
复制
bDlgFindHeaderIsShowingModeless = True 'init
frmFindHeader.Show vbModeless
Do
    If Not bDlgFindHeaderIsShowingModeless Then Exit Do
    DoEvents
Loop

是的,它搅动了CPU,所以如果您使用的是单核处理器,并且有非常重要的后台进程正在运行,那么您可能不想这样做。但是它是有效的;当非模态表单显示时,用户能够轻松、顺利地与Excel交互。用户并不觉得他们在进行无止境的循环。

票数 0
EN

Stack Overflow用户

发布于 2019-10-09 15:23:52

最好的方法是使用两种不同的潜艇。我能够解决这个问题,而不分裂我的分科如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
Private Sub Workbook_Open()
    Mode = False
End Sub

这将再次需要,只有当你使用你的用户名多个子。最后,在按下“继续”按钮时,将此代码添加到您的Userform代码下。

代码语言:javascript
复制
Private Sub Confirm_Click()
    Userform.hide
    if Mode Then
        Call Stuff
    End If 
End Sub

如果您只使用one sub方法,跳过If语句,只需调用sub。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16859038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档