从 Excel 工作表访问类实例

问题描述 投票:0回答:1

假设我制作了一个类模块

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(工作簿刷新)或无意中更改工作表名称时代码会中断。

还有更好的想法吗?

excel vba class module
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.