VBA:用户定义的类型作为公共对象模块中的事件参数

如何解决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 在这里似乎很不一致。

解决方法

为了在工作表模块中工作,上面的代码应该修改如下

  1. 接收器表代码应按以下方式调整:
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)

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

然后,事件本身应该被调用 (me_tblCompliance_tableChanged)

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?