Mat*_*ttB 2 user-controls automation vba class
我又回来了,我希望这是一个相当容易的问题.
我正在尝试在VBA中创建用户表单.用户将在表单中输入某些信息,然后关闭表单.我希望用户表单保留用户关闭后输入的数据.我将它视为一个类模块,因为它本身就是技术,或者至少我理解它.这是我正在使用的代码:
在显示用户表单的主要子中:
Sub NonACATMemo()
Dim UserInput As MemoReasons
Set UserInput = New MemoReasons
UserInput.Show
Run Code Online (Sandbox Code Playgroud)
...然后在用户表单中关闭它...
Private Sub UserForm_Terminate()
MemoReasons.Hide
End Sub
Run Code Online (Sandbox Code Playgroud)
我也从表单上的命令按钮调用此子.我遇到的问题是,当我使用这种方法时,我得到一个错误"运行时错误'402':必须首先关闭或隐藏最顶层的模态形式." 如果我使用卸载我,当我尝试从表单中获取数据时,它被清除,我得到一个"服务器不可用"错误或类似的东西.
那么,关于隐藏用户表单但保留数据的任何想法?
最后几个笔记:这是项目中唯一的用户表单,这里是一个示例,说明我是如何使用Public Property Get方法从中获取数据的:
Debug.Print UserInput.EmailFlag
Debug.Print UserInput.ContraFirm
Debug.Print UserInput.MemoReason
Run Code Online (Sandbox Code Playgroud)
好吧,如果有人有任何建议,我会全力以赴.
我之前没见过这种做法.通常,我只是通过以下方式实例化表单:
MemoReasons.Show
事实上,该_Terminate()事件正在消除表格中的数据.因此解决方案是不_Terminate()通过按钮单击调用事件.相反,只需隐藏表单,例如:
Sub ShowMemoReasons()
'In a normal code module, this calls the form
' could be run from the macros menu or attached to
' a shape/button/etc on the worksheet.
MemoReasons.Show
End Sub
Run Code Online (Sandbox Code Playgroud)
把它们放在MemoReasons代码模块中:
Private Sub CommandButton1_Click() '<-- Rename to handle your button's click event
MemoReasons.Hide '## Hides the form but does not release it from memory
End Sub
Private Sub UserForm_Terminate()
'Any events pertaining to the termination of the form object
' otherwise, all form control data will be wiped out when
' this object releases from memory
End Sub
Run Code Online (Sandbox Code Playgroud)
执行这些操作后,如果使用按钮隐藏表单,则可以调用该表单,ShowMemoReasons()并且应该重新显示表单,同时保留先前在表单中输入的数据.
如果您使用红色的"X"按钮或某个其他事件触发Terminate事件,您将丢失表单数据.有必要进行验证并通过QueryClose事件防止这种情况.
更新
我认为您不需要Dim用户表单的实例(例外情况是您可能同时显示多个表单).否则,声明UserInput为公共变量是多余和混乱的.
不经意间,这就是你得到错误的原因:Must close or hide topmost modal form first.如果你必须以这种方式实现它,而不是MemoReasons.hide你应该使用Me.Hide.
只要您只显示表单的一个实例,就可以始终引用MemoReasons.property因为MemoReasons是公共对象,就像ThisWorkbook或ActiveWorksheet等等.
相反,您应该能够MemoReasons在任何子例程中引用此对象(是一个对象),例如创建另一个未从前一个子节点调用的对象.运行sub以显示表单,输入一些数据,然后隐藏表单.隐藏表单,然后运行此子例程,您应该从表单中看到结果数据.
Sub Test2()
Debug.Print MemoReasons.EmailFlag
End Sub
Run Code Online (Sandbox Code Playgroud)
这是一个古老的话题……希望有人对此有所帮助。
您可以执行以下操作:
1-放置一个“关闭/取消”按钮(您可以将“取消”属性设置为“真”)
2-将以下代码附加到 Click事件
Private Sub btnClose_Click()
'Do some stuff if necessary
Me.Hide
End Sub
Run Code Online (Sandbox Code Playgroud)
3-将此代码附加到 QueryClose事件
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then 'vbFormControlMenu = 0 ([X] button on top right), see MSDN
Cancel = True 'Don't fire Terminate event...
btnClose_Click '...instead, call my close event handler
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
您可以通过在UserForm_Initialize事件中放置调试器断点来检查结果,并且应该仅在第一次显示UserForm并因此授予UserForm状态保留时才触发该断点。