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

时间:2012-09-24 19:27:09

标签: oop vba excel-vba excel

我正试图在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 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:-2)

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

  1. 在Project Explorer中,右键单击您的项目。
  2. 点击“插入...”
  3. 选择“模块”。
  4. 如果不存在任何模块,将创建VBA / Excel项目中的新文件夹,名为“模块”,并将创建一个默认名称为“Module1”的模块。
  5. 双击模块以在源编辑器中打开它。
  6. 这是你必须放置UDT的地方。我相信这是因为VBA相对于作为类声明/操作的元素/对象的COM样式结构在内部存储这些类型的方式不同......

    enter image description here