我正试图在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
中,但它基本上说类模块是类型的错误位置。
答案 0 :(得分:8)
错误来自成熟的VB,您可以在其中创建ActiveX DLL项目,在那里创建公共类并将UDT放入该类中。
在VBA中,当您需要强制转换变体时,可以使用类而不是UDT。
所以只需声明一个包含UDT中所有字段的类,然后删除UDT。
或者,在VB6中创建一个DLL,它只包含该类型的声明,并从VBA引用该DLL。或者,如果您对IDL感到满意,只需直接创建TLB文件即可。
答案 1 :(得分:-2)
要将模块添加到VBA应用程序,请尝试以下步骤(假设您已进入VBA IDE):
这是你必须放置UDT的地方。我相信这是因为VBA相对于作为类声明/操作的元素/对象的COM样式结构在内部存储这些类型的方式不同......