如何解决VBA:用户定义的类型作为公共对象模块中的事件参数
在我的 excel 工作簿中,我想实现一个事件发送方 接收方概念 (OOP)。
这通常有效,但我无法将用户定义类型 (UDT) 作为事件参数从一个公共工作表类传递到另一个。
UDT (tCompliance) 在标准模块中定义为公共:
Option Explicit
Public Type tCompliance
deliverable As String
businessObject As String
process As String
instruction As String
classification As String
End Type
发件人表“tblCompliance”具有以下代码:
Option Explicit
Public Event tableChanged(compliance As tCompliance)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lr As ListRow,compliance As tCompliance
If Not Intersect(Target,table.DataBodyRange) Is nothing Then
Set lr = getListRow(table,Target)
With compliance
.deliverable = lr.Range(1,1).value
.process = lr.Range(1,2).value
.instruction = lr.Range(1,3).value
.classification = lr.Range(1,4).value
End With
RaiseEvent tableChanged(compliance)
End If
End Sub
接收器表“tblPlanning”具有以下代码:
Option Explicit
Private WithEvents me_tblCompliance As tblCompliance
Private Sub me_tblCompliance_tableChanged(compliance As tCompliance)
// Stuff here
end Sub
我收到的错误消息组合起来没有多大意义。
第一个错误说“只有在 PUBLIC OBJECT MODULES ... 中定义的用户定义类型才能传递给运行时函数。”
显然,解决方案是将 UDT 定义放入公共对象模块中。 我把它放到公共对象模块“thisWorkbook”中,再次尝试编译代码。
但是我收到第二条错误消息:公共定义的类型不能在对象模块中定义
因此,我尝试将 UDT 放入我在 VBE 属性部分创建的“2 - PublicNotCreatable”类模块中。
但后来我收到相同的错误消息:不能在对象模块中定义公共用户定义的类型”
VBA 在这里似乎很不一致。
解决方法
为了在工作表模块中工作,上面的代码应该修改如下
- 接收器表代码应按以下方式调整:
Option Explicit
Private WithEvents me_tblCompliance As tblCompliance 'tblCompliance should be the sheet code module class
Public Sub me_tblCompliance_tableChanged(compliance As tCompliance) 'Mandatory to be Public
''' Stuff here
MsgBox compliance.deliverable & " - " & compliance.instruction
End Sub
- 引发事件的行应该从
RaiseEvent tableChanged(compliance)
在
RaiseEvent tblPlanning.me_tblCompliance_tableChanged(compliance)
代码必须不像在标准模块中那样调用事件,而是使用工作表代码模块类(tblPlanning
)完全限定:
然后,事件本身应该被调用 (me_tblCompliance_tableChanged
)
请以这种方式进行测试并发送一些反馈。
无论如何,有趣的问题... :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。