Ms access 动态创建控件的事件处理程序导致Access VBA崩溃
我有一个表单,在其中我创建了一些复选框。这些复选框是动态创建的,用户每次打开表单时,它们的编号可能不相同。尽管我的事件侦听器完全按照我想要的方式工作,但当我按下“X”按钮关闭表单时,MS Access崩溃。它没有挂起,它崩溃了。我尝试过反编译和重新编译,我也尝试过其他步骤,但都没有解决问题。当我注释负责事件处理程序的代码行时,崩溃停止 下面是我的班级模块的代码。类模块的名称为EventClassMs access 动态创建控件的事件处理程序导致Access VBA崩溃,ms-access,vba,Ms Access,Vba,我有一个表单,在其中我创建了一些复选框。这些复选框是动态创建的,用户每次打开表单时,它们的编号可能不相同。尽管我的事件侦听器完全按照我想要的方式工作,但当我按下“X”按钮关闭表单时,MS Access崩溃。它没有挂起,它崩溃了。我尝试过反编译和重新编译,我也尝试过其他步骤,但都没有解决问题。当我注释负责事件处理程序的代码行时,崩溃停止 下面是我的班级模块的代码。类模块的名称为EventClass Option Compare Database Public WithEvents ct As Ac
Option Compare Database
Public WithEvents ct As Access.CheckBox
Public Sub ct_Click()
MsgBox ct.Name & "pressed"
End Sub
以下是表格的代码:
Option Compare Database
Private listenerCollection As New Collection
Private Sub Form_Load()
DoCmd.SetWarnings False
Dim listener As EventClass
For Each ctrl In Forms("test").TestTab.Pages(0).Controls
If (TypeName(ctrl) = "CheckBox") Then
'the created checkboxes should not be checked by default
ctrl.Value = 0
Set listener = New EventClass
Set listener.ct = ctrl
listener.ct.OnClick = "[Event Procedure]"
listenerCollection.Add listener
End If
Next
End Sub
下面是生成复选框的代码(它属于另一个窗体,在创建控件之前,关闭,,导致问题的窗体显示):
碰撞信息:
问题签名:
问题事件名称:APPCRASH
应用程序名称:MSACCESS.EXE
应用程序版本:15.0.4665.1000
应用程序时间戳:54339a95
故障模块名称:MSACCESS.EXE
故障模块版本:15.0.4665.1000
故障模块时间戳:54339a95
异常代码:c0000005
异常偏移量:0000000000 3796F5
操作系统版本:6.1.7601.2.1.0.256.48
有时应用程序事件名称显示为BEX64
这个问题已经开始让我非常沮丧,因为我搜索过的任何地方都没有合适的解决方案。
代码反编译不起作用,DEP关闭不起作用,vba编辑器中的引用正常。
我真的不知道该怎么办。我实际上没有设法解决这个问题,但它似乎与表单的“X”按钮有关。 于是我做了如下操作:我禁用了X按钮,并在表单中插入了一个自定义按钮。 下面你可以看到它的“点击”子菜单
碰撞停止。您有两种表格吗?一个是动态控件(test),另一个是添加监听器(其代码如上所示)?因为你只说表单,所以我不知道哪个表单的关闭导致了崩溃。如果有两种形式,请在问题中列出它们。如果这都是一个表单,请添加创建复选框的代码。第一段代码是类模块。第二段代码是导致崩溃的表单。@pteranodon我添加了生成复选框的代码。希望它能有所帮助。顺便说一句,谢谢您的时间。
DoCmd.Close
DoCmd.OpenForm "test", acDesign, , , acFormEdit, acHidden
'delete the previously created controls
again:
For Each ctrl In Forms("test").TestTab.Pages(0).Controls
DeleteControl "test", ctrl.Name
Next
'ensure that all the controls have been deleted
If (Forms("test").TestTab.Pages(0).Controls.Count > 0) Then GoTo again
Dim q As CheckBox
Dim usr As Label
Dim db As Database
Dim rs As Recordset
Top_ = 500
Left_ = 1000
'create new controls
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT USERNAME FROM T_USERS", dbOpenSnapshot)
With rs
Do While Not .EOF
Set usr = CreateControl("test", acLabel, acDetail, "Page1", , 0, Top_, 1100, 1000)
usr.Caption = rs.Fields("USERNAME")
Set q = CreateControl("test", acCheckBox, acDetail, "Page1", , 1500, Top_, 200, 200)
Top_ = Top_ + 500
Set q = Nothing
Set usr = Nothing
.MoveNext
Loop
.Close
End With
Set rs = Nothing
Set db = Nothing
'and here,the form which causes the problem shows up
DoCmd.OpenForm "test"
Private Sub CloseButton_Click()
DoCmd.Close
End Sub