我做了一个课程模块
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
?
我考虑的解决方案看起来很丑陋
我不喜欢这个,因为我不希望用户在尝试调用 do_calc 时为指定正确的工作表而大惊小怪。它始终必须是他们正在使用的工作表。
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
我不喜欢这个,因为我担心当有人执行 Ctrl+Alt+F9(工作簿刷新)或无意中更改工作表名称时代码会中断。
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
Application.ThisCell
或 Application.Caller
(在从工作表调用的函数中)均返回输入 UDF 的单元格。如果您想知道 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