VBA:用户定义的类型作为 public 对象模块中的事件参数
VBA: User defined type as event parameter in public object module
在我的 excel 工作簿中,我想实现事件发送方 <> 接收方概念 (OOP)。
这通常有效,但我无法将用户定义类型 (UDT) 作为事件参数从一个 public sheet class 传递给另一个。
UDT (tCompliance) 在标准模块中定义为 public:
Option Explicit
Public Type tCompliance
deliverable As String
businessObject As String
process As String
instruction As String
classification As String
End Type
发件人 sheet“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
接收器 sheet“tblPlanning”具有以下代码:
Option Explicit
Private WithEvents me_tblCompliance As tblCompliance
Private Sub me_tblCompliance_tableChanged(compliance As tCompliance)
// Stuff here
end Sub
我收到的错误消息组合起来意义不大。
第一个错误显示 “只有在 PUBLIC 对象模块中定义的用户定义类型......才能传递给运行时函数。”
显然,解决方案是将 UDT 定义放入 PUBLIC 对象模块中。
我将其放入 PUBLIC OBJECT MODULE“thisWorkbook”并再次尝试编译代码。
但随后我收到第二条错误消息:A public 定义的类型无法在对象模块中定义
所以我尝试将 UDT 放入 class 模块中,我在 VBE 属性部分创建了“2 - PublicNotCreatable”。
但随后我收到相同的错误消息:无法在对象模块中定义 public 用户定义类型
VBA这里好像很矛盾
为了在 sheet 模块中工作,上面的代码应该修改如下
- 接收器 sheet 代码应按以下方式进行调整:
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)
代码必须不像在标准模块中那样调用事件,而是使用 sheet 代码模块完全限定 class(tblPlanning
):
那么,事件本身应该被调用 (me_tblCompliance_tableChanged
)
请以这种方式进行测试并发送一些反馈。
无论如何,有趣的问题...:)
在我的 excel 工作簿中,我想实现事件发送方 <> 接收方概念 (OOP)。
这通常有效,但我无法将用户定义类型 (UDT) 作为事件参数从一个 public sheet class 传递给另一个。
UDT (tCompliance) 在标准模块中定义为 public:
Option Explicit
Public Type tCompliance
deliverable As String
businessObject As String
process As String
instruction As String
classification As String
End Type
发件人 sheet“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
接收器 sheet“tblPlanning”具有以下代码:
Option Explicit
Private WithEvents me_tblCompliance As tblCompliance
Private Sub me_tblCompliance_tableChanged(compliance As tCompliance)
// Stuff here
end Sub
我收到的错误消息组合起来意义不大。
第一个错误显示 “只有在 PUBLIC 对象模块中定义的用户定义类型......才能传递给运行时函数。”
显然,解决方案是将 UDT 定义放入 PUBLIC 对象模块中。 我将其放入 PUBLIC OBJECT MODULE“thisWorkbook”并再次尝试编译代码。
但随后我收到第二条错误消息:A public 定义的类型无法在对象模块中定义
所以我尝试将 UDT 放入 class 模块中,我在 VBE 属性部分创建了“2 - PublicNotCreatable”。
但随后我收到相同的错误消息:无法在对象模块中定义 public 用户定义类型
VBA这里好像很矛盾
为了在 sheet 模块中工作,上面的代码应该修改如下
- 接收器 sheet 代码应按以下方式进行调整:
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)
代码必须不像在标准模块中那样调用事件,而是使用 sheet 代码模块完全限定 class(tblPlanning
):
那么,事件本身应该被调用 (me_tblCompliance_tableChanged
)
请以这种方式进行测试并发送一些反馈。
无论如何,有趣的问题...:)