可以将VBA模块设置为单独的实例

时间:2013-08-21 20:57:24

标签: excel-vba vba excel

我花了很多时间在一个项目下工作,一本书中的每张表都会使用我正在编写的模块的实例。我有多张相同模板的工作表,但工作表特定于存储的数据类型。然而,在模块中我有setter和getter,我希望给定工作表上的getter只能访问同一工作表(模块实例)上的setter设置的varibles。事实证明,所有的纸张都使用了相同的模块实例,并且制定者彼此重叠,因此只有一张纸具有由模块计算的精确结果。我不想进入TMI,但是setter提供的数据用于格式化getter提供的原始数据。有没有办法让每个工作表都有一个模块实例,而不必编写每个工作表的代码。我的意思是,当操作员有一组新的relults要存储和处理时,他们只需复制excell中的工作表并将数据放在新工作表上。我不希望操作员需要修改代码。我试图解释这一点,但我不确定我是否做得很好。有没有办法制作模块的单独实例?

2 个答案:

答案 0 :(得分:4)

您可以使用类模块而不仅仅是模块来执行此操作。一个区别是,您需要在每个工作表上创建一个与该类相同类型的对象,但每次都要实例化该对象的单独实例。

根据您的范围,这个类(使用Dim)将决定它的可用范围。

这是一个非常好的参考:http://www.cpearson.com/excel/classes.aspx

答案 1 :(得分:1)

如果您有多个相同“类型”的工作表(相同类型的数据和布局等),那么一个好的方法(如其他人所建议的)是将“管理”工作表的代码放入类模块,并且在该类中有一个属性,可以保存对特定工作表的引用(可以是活动表,也可以是您当前使用的工作表)。

例如:一个简单的类clsSheet,其中包含一个映射到特定单元格的“Title”属性:

Option Explicit

Private m_sht As Worksheet

Public Sub Init(sht As Worksheet)
 Set m_sht = sht
End Sub

Public Property Let Title(t As String)
    m_sht.Range("A1").Value = t
End Property

Public Property Get Title() As String
    Title = m_sht.Range("A1").Value
End Property 

用法:

Dim shtObj as New clsSheet

shtObj.Init ActiveSheet
shtObj.Title = "my title"
msgbox shtObj.Title

您现有的代码应该可以很容易地映射到新的类模块中:在使用Ranges等时,您只需要确保引用m_sht而不是(例如)ActiveSheet