假设我制作了一个类模块
ComplicatedCalculation
。我有几个工作表,每个工作表都需要有自己的 ComplicatedCalculation
实例,每个工作表中的参数初始化为略有不同。每个 ComplicatedCalculation
都有一个函数 function do_calc(rng as Range)
,它根据工作表中的其他输入输出答案。
Public cc_for_Sheet1 as New ComplicatedCalculation
Public cc_for_Sheet2 as New ComplicatedCalculation
Public cc_for_Sheet3 as New ComplicatedCalculation
每个工作表访问自己的
cc
的最佳方式是什么?
我考虑过的解决方案,但它们看起来都有点难看
Function do_calc(rng as Range, ws_name as String)
Dim cc as ComplicatedCalculation
if ws_name = "Sheet1" then
cc = cc_for_Sheet1
elif...
end if
do_calc = cc.do_calc(rng)
End Function
我不喜欢这个,因为我不希望用户在尝试调用 do_calc 时必须为指定正确的工作表而大惊小怪。它始终必须是他们正在使用的工作表。
Function do_calc(rng as Range)
Dim cc as ComplicatedCalculation
if Application.ActiveSheet.name = "Sheet1" then
cc = cc_for_Sheet1
elif
end if
do_calc = cc.do_calc(rng)
end function
我不喜欢这个,因为我担心当有人执行 Ctrl+Alt+F9(工作簿刷新)或无意中更改工作表名称时代码会中断。
还有更好的想法吗?
Application.ThisCell
(在从工作表调用的函数中)返回输入 UDF 的单元格。如果您想知道您从哪个工作表接到电话,则应该始终使用它,而不是 ActiveSheet
。
如果将计算对象存储在与每个工作表相关的全局字典中,则可以执行以下操作
Public calcs As Object
'Set up calculation class instances
Sub InitCalcs()
Dim cc as ComplicatedCalculation
Set calcs = CreateObject("scripting.dictionary") 'initialize dictionary
'Initialize and configure each instance of `cc` and
' store in the dictionary like
calcs.add ws, cc
'where ws is the associated worksheet reference and cc the configured object
End Sub
'UDF called from worksheet
Function do_calc(rng As Range)
Dim ws As Worksheet
Set ws = Application.ThisCell.Worksheet 'calling worksheet
If calcs.Exists(ws) Then 'calculation object for this sheet exists?
do_calc = calcs(ws).docalc(rng)
Else
do_calc = "not configured!"
End If
End Function