问题:我建立具有“提交”和“取消”按钮的用户窗体。我想整个造型以清除任何输入的数据并关闭表单,如果用户点击“取消”按钮,但我也正在尝试在相同的功能建立,如果用户点击在右上角的红色“X”。我不清楚,我需要卸载窗体。我现在有它放在btnCancel_Click()
方法中,我能够启动表单,输入一些数据和命中取消,它会关闭表单下来。
但是,当我尝试重新启动形式第二次我得到一个错误(我附上该消息的图片),说
“运行时错误“-2177418105(80010007):自动化错误 - 被叫方(服务器[不服务器应用程序])不可用,消失;所有连接都是无效的调用可能已执行。
如果我从Unload Me
然后取出btnCancel_Click()
形式可以关闭并重新打开就好了,但任何数据我进入第一次仍然会在表格上并没有正确清除。我想知道,如果这是一个错误Unload Me
还是需要重置所有表单控件,当我初始化的形式?
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' how was the form closed?
' vbFormControlMenu = X in corner of title bar
If CloseMode = vbFormControlMenu Then
' cancel normal X button behavior
Cancel = True
' run code for click of Cancel button
btnCancel_Click
End If
End Sub
'******************************************************************
Private Sub btnCancel_Click()
mbCancel = True
Me.Hide
Unload Me
End Sub
'*********************************************************************
Private Sub UserForm_Initialize()
'Populate values for 2 combo boxes
lastEmp = Sheets("Form_Ref").Cells(Rows.Count, 1).End(xlUp).Row
Me.cmbBoxEmpName.List = Sheets("Form_Ref").Range("A2:A" & lastEmp).Value
lastBld = Sheets("Form_Ref").Cells(Rows.Count, 2).End(xlUp).Row
Me.cmbBoxBuildingName.List = Sheets("Form_Ref").Range("B2:B" & lastBld).Value
End Sub
'******************************************************************
Public form As New CheckOutForm
Sub testFormOptions()
'Button pressed within Excel will start program and show the userform
form.Show
End Sub
这是最简单快速和肮脏的解决方案:
从代码中删除Public form As New CheckOutForm
。然后将其添加在testFormOptions()
:
Sub testFormOptions()
Dim form As New CheckOutForm
form.Show
End Sub
有些不是说好VBA书籍/教程甚至会去有点像这样,但这是残酷的:
Sub testFormOptions()
CheckOutForm.Show
End Sub
不管怎样,现在在形式的预定值,问题就解决了。
对于清洁,不那么容易的解决方案,考虑写周围形成一个MVC框架:
如果执行Unload
,你破坏了表单对象。随着换句话说,你(全局)变量form
变得无效,如果你发出新form.show
,你得到的运行时错误。
如果,在另一方面,你只是unhide
表单,表单对象保持有效(这只是目前不可见)和所有控件保持自己的价值。
要么你通过时,显示的形式重置所有控件(使用UserForm_Activate
事件)做一些家务管理,或者你必须创建一个新的表单对象要显示它每一次(我强烈劝告不使用名称form
作为变量名,以避免混淆)。
Sub testFormOptions()
dim myForm as CheckOutForm
myForm.Show
End Sub