Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop VBA中的公共对象模块是什么?_Oop_Vba_Excel - Fatal编程技术网

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

Oop VBA中的公共对象模块是什么?,oop,vba,excel,Oop,Vba,Excel,我试图在VBA中尽可能接近函数指针/抽象类 我有一个名为VerificationManager的类,用于验证两个电子表格中的一组单元格是否匹配。这将以不同的方式完成,具体取决于所使用的信息和电子表格 我希望通过使用Application.Run函数指定要在字符串中调用的方法,使代码可以重用。所以我可以重写改变的函数 现在,如果我使用Java或C,我将能够扩展一个抽象类,并将内部代码重写为函数。如果我使用JavaScript,我可以将函数存储在变量中,并将变量传递给类,然后从那里调用它 在我的类中

我试图在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时,我收到以下错误:

编译错误:

只能选择在公共对象模块中定义的用户定义类型 强制到变量或从变量强制到变量,或传递到后期绑定函数


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

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

在项目浏览器中,右键单击项目。 点击插入。。。 选择模块。 如果不存在模块,将在VBA/Excel项目中创建一个新文件夹,命名为模块,并创建一个默认名称为Module1的模块。 双击该模块以在源代码编辑器中打开它。 这是你必须放置UDT的地方。我相信这是因为VBA内部存储这些类型的方式与作为类声明/操作的元素/对象的COM样式结构不同


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

在VBA中,当需要向变量强制或从变量强制时,使用类而不是UDT

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


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

在我看来,这就是我为项目创建所有模块时所做的。我还缺什么吗?你把UDT放在哪里了?作为测试,我只是将一个示例UDT放在如上所述创建的模块顶部,它似乎工作得很好……或者我误解了这个问题,您想将UDT迁移到VBA中的完整类中吗?我只是想消除错误消息并继续编码;这主要是一个一次性项目,我正在使用它来测试查询的输出。好吧,我只提供我可以在模块中放置一个UDT,如上图所示/所示,所以我提供给您一个尝试,或者将UDT作为类进行修改。。。