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 模块中工作,上面的代码应该修改如下

  1. 接收器 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
  1. 引发事件的行应该从
RaiseEvent tableChanged(compliance)

RaiseEvent tblPlanning.me_tblCompliance_tableChanged(compliance)

代码必须不像在标准模块中那样调用事件,而是使用 sheet 代码模块完全限定 class(tblPlanning):

那么,事件本身应该被调用 (me_tblCompliance_tableChanged)

请以这种方式进行测试并发送一些反馈。

无论如何,有趣的问题...:)