【发布时间】:2021-02-23 22:18:47
【问题描述】:
在我的 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 定义放入公共对象模块中。 我把它放到了 PUBLIC OBJECT MODULE "thisWorkbook" 中,并再次尝试编译代码。
但随后我收到第二条错误消息:无法在 OBJECT MODULE 中定义公共定义类型
所以我尝试将 UDT 放入我在 VBE 属性部分中创建“2 - PublicNotCreatable”的类模块中。
但随后我收到相同的错误消息:无法在 OBJECT MODULE 中定义公共用户定义类型”
VBA 在这里似乎很不一致。
【问题讨论】:
-
UDT 有点像 VBA 中的红鲱鱼。可以在模块/类内使用,但在其他方面有问题。快速而肮脏的替换是一个变体(包含一个数组)和一个与您的 UDT 字段匹配的公共枚举,或者您将 UDT 转换为类的适当工作。
-
我也有这个想法,并切换到这个解决方案。它似乎工作。至少提到的错误消息消失了。类模块必须是“2 - PublicNotCreatable”才能工作。
-
它也可以在工作表模块中工作,但需要进行一些小调整...