我花了相当多的时间在一个项目上工作,假设 Excel 书中的每张纸都会使用我正在编写的模块的一个实例。我有多个工作表都是相同的模板,但这些工作表特定于所存储的数据类型。但是,在模块中,我有 setter 和 getter,我期望给定工作表上的 getter 只能访问同一工作表(模块的实例)上的 setter 设置的变量。事实证明,所有工作表都使用模块的相同实例,并且设置器相互覆盖,因此只有一张工作表具有模块计算的准确结果。我不想进入 TMI,但 setter 提供的数据用于格式化 getter 提供的原始数据。有没有办法让每张纸都有一个模块的实例,而不必对每张纸进行编码。我的意思是,当操作员有一组新的结果要存储和处理时,他们只需将工作表复制到 Excel 中并将数据放在新工作表上。我不希望操作员需要修改代码。我试图解释这一点,但我不确定我是否能正确解释它。有没有办法制作模块的单独实例?
问问题
137 次
2 回答
4
你可以用一个类模块而不是一个模块来做到这一点。一个区别是您需要在每个工作表上创建一个与类相同类型的对象,但每次都实例化该对象的一个单独实例。
根据您对此类的范围(使用 Dim)确定它的可用位置。
这是一个很好的参考: http ://www.cpearson.com/excel/classes.aspx
于 2013-08-21T21:02:59.370 回答
1
如果您有多个相同“类型”的工作表(相同类型的数据和布局等),那么一个好方法(正如其他人在这里所建议的那样)是将“管理”工作表的代码放入类模块中,并拥有该类中的一个属性,它可以保存对特定工作表(可能是活动表,或您当前正在使用的工作表)的引用。
clsSheet
例如:具有映射到特定单元格的单个“标题”属性的简单类:
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
于 2013-08-21T23:17:18.843 回答