首页 > 解决方案 > VBA - 试图了解如何调用类模块

问题描述

我正在通过 Google、YouTube 等学习 VBA。我遇到了 Class Modules。

我有一个Tracker Template.
每隔几天我就会收到一份报告("Ice cream FG Inv.xlsm"

Class Modules在试图WBIceCreamFGINVxlsm理解Ice Cream FG Inv.xlsm Workbook.

例子:

Public Property Get wsinventory() As Worksheet
    Set wsinventory = Workbook.Worksheets("Inventory")
End Property

在我的模块中,我想引用wsinventory,但不完全了解如何“调用”类模块..

两个工作簿都是打开的。

我试着从:

Dim Data As Variant
    Data = wsinventory.Range("A1").CurrentRegion.Value   (**Variable not Defined**)

然后我尝试了:

Dim wsinventory As Worksheets
With wsinventory
    Dim Data As Variant
        Data = .Range("A1").CurrentRegion.Value (**Object variable or With variable not set**)
End With

我还需要使用:

Dim DataSource As Workbook
Set DataSource = Workbooks("Ice Cream FG Inv.xlsm")
    With DataSource.Worksheets("Inventory")
    End With

如果是这样,使用类模块的原因是什么?

标签: excelvba

解决方案


您需要先创建一个类对象,然后才能访问该类的属性。

假设你有这个类并命名它TestClass

Private pwsinventory As Worksheet

Public Sub init()
    Set pwsinventory = Worksheets("Inventory")
End Sub

Public Property Set wsinventory(lwsinventory As Worksheet)
    Set pwsinventory = lwsinventory
End Property

Public Property Get wsinventory() As Worksheet
    Set wsinventory = pwsinventory
End Property

您可以像这样设置/获取属性:

Sub test()
    Dim datacls As TestClass
    Dim data As Worksheet
    
    Set datacls = New TestClass
    Set datacls.wsinventory = Worksheets("inventory")
    Set data = datacls.wsinventory
    
    Debug.Print data.Name
End Sub

然而,这有点奇怪,当你有一个不想设置的属性(你需要传递一个参数)时,你应该使用一个启动函数。不幸的是,如果不在创建类对象后手动调用该 sub,我就无法做到这一点。

Sub Test2()
    Dim datacls As TestClass
    
    Set datacls = New TestClass
    
    datacls.init
    
    Debug.Print datacls.wsinventory.Name
End Sub

我使用类的最常见情况是更好的容器。通常在数组/字典中存储许多相同的类类型,所以很清楚我在调用什么,特别是如果我需要为每个实例以相同的方式修改数据。


推荐阅读