【问题标题】:Why, after launching a userform from a userform, does unloading the 2nd userform close both?为什么从用户表单启动用户表单后,卸载第二个用户表单会关闭两者?
【发布时间】:2019-11-29 22:32:41
【问题描述】:

工作表上的一个按钮会启动一个宏,该宏会打开一个用户表单(例如,userform1)。 Userform1 以非模式加载,以便用户同时使用 userform1 和工作表(即单击单元格)进行输入。 userform1 上有一个按钮,单击该按钮会打开另一个用户表单(例如,userform2)。 Userform2 是模态的。单击 userform2 上的 Cancel 按钮会按预期卸载 userform2;但是,由于某种原因,它也会卸载我不想要的 userform1。如果我将 userform1 设为模态,则卸载 userform2 不会卸载 userform1;但是,用户不能再使用(即单击)工作表中的单元格。我找不到任何信息可以让我知道为什么卸载一个用户窗体会同时卸载两者。

【问题讨论】:

  • Form 2 究竟是如何关闭的?什么命令/语法?你在使用“Unload.Me”吗?
  • 啊,我重现了这个问题,做了一些研究,在tech-archive.net/Archive/Excel/… 找到了一个建议,在“卸载 Form2”之前和之后以及“Form2.Show”之前和之后添加了“DoEvents”!!我很确定你不需要所有这些 DoEvents,但你试一试......
  • 我正在阅读您建议的网站,提交者说他关闭并重新启动了他的 Excel 应用程序并解决了问题。我这样做了,现在一切正常。这似乎表明使用 DoEvents (如您所建议的)可能会奏效。感谢您的帮助(尽管我希望我对真正发生的事情有更好的了解)。
  • 我刚刚做的有趣的测试...我注释掉了 DoEvents,关闭,然后重新打开 Excel 文件,并且返回了不想要的结果 - 它再次关闭了两个表单。我只将“DoEvents”添加到“Form2.show”之后的行中,问题就消失了。希望这会有所帮助..
  • 我刚刚做了同样的测试,结果也返回了我不想要的结果。我把'DoEvents'放在你建议的地方,它确实有效。我仍然不确定为什么会这样,但是......不要与成功争论。感谢您的帮助

标签: excel vba modal-dialog userform


【解决方案1】:

我很高兴我偶然发现了这个旧线程。

我发现当 VBA 编辑器窗口关闭时问题就消失了。你真的必须关闭它,最小化窗口是不够的。窗口是否在同一屏幕上打开也没有关系。只有关闭它对我有用。我发现,一旦 Form2 被卸载,VBA 编辑器就会显示 Form2,无论我刚才在哪个代码模块中。

我的目标是在 TestWorkbook.xlsm 中隔离问题(查看下面的代码)。我在 Form2.Show 之后尝试了 DoEventsa line of code 的建议,两者都有帮助。在我的 DevelopmentAddIn.xlam 他们没有帮助,第一种形式仍然关闭。所以问题可能仍然存在于我的 AddIn 的更复杂的代码中。

但就像我说的,关闭 VBA 编辑器窗口可以解决问题,尽管我仍然不明白为什么。

TestWorkbook.xslm(两个用户窗体Form1Form2以及一个代码模块mLoad

mLoad:

Option Explicit
Public Changed As Integer

'***Load the 1st form
Public Sub LoadFirstForm()
    Load Form1

    'allow user to change the active workbook
    Form1.Show vbModeless
End Sub

'***Load a 2nd form (from Form1)
Public Sub LoadSecondForm()
    Dim a  As Integer

    Load Form2

    'continue after 2nd form closes
    Form2.Show vbModal

    'suggestions
    a = 1
    DoEvents

    '2nd form was changed
    If Changed = 1 Then
        Form1.InfoBox.Value = "Changed"

        'process changes

    '2nd form is unchanged
    Else
        Form1.InfoBox.Value = "Unchanged"
    End If
End Sub

Form1(带有按钮 cmdLoad 和文本框 InfoBox

'***Load the 2nd form (from Form1)
Private Sub cmdLoad_Click()
    LoadSecondForm
End Sub

Form2:(带有按钮cmdOK

Option Explicit

'***Initial status is 'unchanged'
Private Sub UserForm_Initialize()
    Changed = 0
End Sub

'***Status is 'changed'
Private Sub cmdOk_Click()
    Changed = 1

    'close 2nd form and continue
    Unload Me
End Sub

【讨论】:

    【解决方案2】:

    UserForm2.显示

    a = 1 ' 只需要多执行 1 行代码

    这样就可以了。至少这对我有同样的问题...

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多