VBA中的公共对象模块是什么?

8

我正在尝试在VBA中尽可能接近函数指针/抽象类。

我有一个名为VerificationManager的类,用于验证一些电子表格中的单元格是否匹配。根据使用的信息和电子表格,这将以不同的方式完成。

我想通过指定要调用的方法的字符串来使代码可重复使用,使用Application.Run函数。这样我就可以改写该函数。

如果我使用Java或C#,我将能够扩展抽象类并重写函数的内部。 如果我使用JavaScript,我可以将函数存储在变量中,并将变量传递给类,然后从那里调用它。

在我的类中,我有一个名为"verificationModule"的公共属性,我将其设置为要调用的函数的名称。

Sub VerifyWorkLocations(empLoc As EmployerLocation)
...
    For i = 0 To empLoc.numOfEmp
        Application.Run verificationModule, empLoc.taxdescmatch, empLoc.employees(i)
    Next i
...
End Sub

然而,当我尝试调用Application.Run时,我收到以下错误:

编译错误:

"只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或传递给迟绑定函数"

我已经尝试将我的用户定义类型放置在Class Module中,但它基本上说类模块不是类型的正确位置。

2个回答

8

这个错误来自完整的VB,你可以创建一个ActiveX dll项目,在其中创建一个公共类,并将UDT放入该类中。

在VBA中,当需要强制转换为或从变量中转换时,使用类代替UDT。

因此,只需声明一个包含您UDT中所有字段的类,并删除UDT即可。

或者,可以在VB6中创建一个仅包含类型声明的DLL,并从VBA引用该dll。或者,如果您熟悉IDL,则可以直接创建TLB文件。


-2

要将模块添加到VBA应用程序中,请尝试以下步骤(假设您已经进入了VBA IDE):

  1. 从项目资源管理器中,右键单击您的项目。
  2. 单击“插入...”
  3. 选择“模块”。
  4. 如果不存在模块,则将在VBA / Excel项目中创建一个名为“Modules”的新文件夹,并创建一个名为“Module1”的默认模块。
  5. 双击该模块以在源编辑器中打开它。

这是您必须放置UDT的位置。我相信这是因为VBA内部存储此类类型与声明/操作为类的元素/对象的COM样式结构之间的差异...

enter image description here


好像我创建项目所有模块时就已经这样做了。这里还有什么其他的问题吗? - leeand00
你把UDT放在哪里了?作为一个测试,我只是按照上述描述,在一个模块的顶部放了一个样本UDT,看起来它似乎运行得很好... - David W
我是否误解了问题,您是想将UDT迁移到VBA中的完整类吗? - David W
我只想摆脱错误信息并继续编码... ;) 这主要是一个临时项目,我用它来测试查询的输出。 - leeand00
1
好的,我建议将UDT放入模块中,如上所示/说明,因此我建议您可以尝试这样做或将您的UDT重构为类... - David W
@DavidW 在你的 Sub main() 中添加以下内容:Dim v as variant: v = xxx。当你尝试使用 UDT 参数调用 Application.Run 时也会发生同样的情况。 - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接