从保存在磁盘中的.cls实例化类

时间:2014-05-13 18:17:09

标签: vba excel-vba code-reuse excel

我有2个不同的VBA项目,它们使用8个相同的类。 如果我将这些类导出到我的磁盘中的目录,有没有办法以编程方式实例化它们以避免代码重复?

我没有看到任何问题,在2个不同的项目中使用相同的代码,但我的老板问是否有可能,到目前为止我还没有找到任何可以引导我在微软在线帮助和在我的一些书中。

3 个答案:

答案 0 :(得分:3)

既然我理解了你的问题,那么各种中央图书馆可能是你最好的选择,还有其他人,但我总是喜欢图书馆。

实现这一目标:

  • 创建一个新工作簿,将所有类模块导入该工作簿中的VBA项目。将项目命名为MyCentralLibrary(与VBAProject不同)
  • 将类模块的Instancing属性设置为PublicNotCreatable (在属性窗口中更改此内容)
  • 现在稍微来了 愚蠢的部分(我从来不是VBA的粉丝)。引用此项目的项目 库将能够查看所有类但从不实例化 它们的新实例。所以你要做的就是你放入图书馆的每个班级, 用类作为返回类型编写一个函数,如下所示:

    Public Function GetMyClass() As MyClass
        Set GetMyClass = New MyClass
    End Function
    
  • 现在,您希望在项目中引用中央库。转到工具 - >引用并从列表中选择您的库名称。现在,您可以在项目中实例化该库中的类,如下所示:

    Public c As MyCentralLibrary.MyClass
    Set c = MyCentralLibrary.GetMyClass()
    

同样,还有其他方法,但我总是支持图书馆(至少在其他语言中)

作为一个注释,如果/当您在计算机之间移动时,您显然必须将工作簿与您的库一起移动并重新执行引用该库的任何项目的引用。新电脑。

我的两分钱,如果这是为了扩展更多我继续前进并获取免费版本的Visual Studio并将其转换为可以从Excel引用的类库。但那只是我和我对VBA不喜欢的事情;)。

答案 1 :(得分:2)

是的,这是可能的,但您必须更改一些安全设置。我在所有的VBA项目中做了类似的事情,所以我可以使用源代码控制。

将类模块导入项目的代码是

ThisWorkbook.VBProject.VBComponents.Import "C:\path\to\myclass.cls"

为了使其正常工作,您必须更改安全设置以允许访问VBA项目对象模型。这是因为过去有些病毒通过这种机制传播开来。该设置位于文件>选项>信托中心>信任中心设置...>宏设置>信任对VBA项目对象模型的访问。

答案 2 :(得分:0)

作为一种解决方法,我将这些类中的方法导出到DLL文件并将其保存在服务器中。每当用户打开.xlsm文件时,就会调用一个方法在他们的计算机中注册DLL,然后我可以使用它中包含的方法和属性,而不会出现进一步的问题。

我也考虑了这个问题的其他答案。但是发送2个文件(一个包含将要使用的数据表和另一个用于库)将不是一个好主意(用户不会理解这是什么原因),因为这些程序将被很多用户使用。