试图发动第二次后最初的“取消”或接近红色的“X”当Excel用户窗体运行时错误

问题描述 投票:1回答:2

问题:我建立具有“提交”和“取消”按钮的用户窗体。我想整个造型以清除任何输入的数据并关闭表单,如果用户点击“取消”按钮,但我也正在尝试在相同的功能建立,如果用户点击在右上角的红色“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

enter image description here

excel vba userform
2个回答
1
投票

这是最简单快速和肮脏的解决方案:

从代码中删除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框架:


1
投票

如果执行Unload,你破坏了表单对象。随着换句话说,你(全局)变量form变得无效,如果你发出新form.show,你得到的运行时错误。 如果,在另一方面,你只是unhide表单,表单对象保持有效(这只是目前不可见)和所有控件保持自己的价值。

要么你通过时,显示的形式重置所有控件(使用UserForm_Activate事件)做一些家务管理,或者你必须创建一个新的表单对象要显示它每一次(我强烈劝告不使用名称form作为变量名,以避免混淆)。

Sub testFormOptions()
    dim myForm as CheckOutForm
    myForm.Show
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.