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我收到以下错误:

编译错误:

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

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

4

2 回答 2

8

该错误来自成熟的 VB,您可以在其中创建一个 ActiveX dll 项目,在那里创建一个公共类并将 UDT 放入该类。

在 VBA 中,当您需要强制转换为变体或从变体强制转换时,您可以使用类而不是 UDT。

因此,只需声明一个包含 UDT 中所有字段的类,然后删除 UDT。

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

于 2012-09-24T20:13:56.163 回答
-2

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

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

这是您必须放置 UDT 的地方。我相信这是因为这些类型在 VBA 内部存储的方式与声明/操作为类的元素/对象的 COM 样式结构不同...

在此处输入图像描述

于 2012-09-24T20:06:26.667 回答