Excel 是否有更简单/更好的方法使用预定义词典?

Excel 是否有更简单/更好的方法使用预定义词典?,excel,vba,Excel,Vba,我有一本日期对应的数字字典。我不得不想象有一种比存储所有日期然后回忆它们更好的方法 换句话说,我可以创建一个通用的字典,然后代码中的其他部分可以访问它,这样我就不会在函数中隐藏全局字典了吗 Function Get_Val_Date(Val_Date_Key As Long) Dim Date_Dict As Scripting.Dictionary Set Date_Dict = New Scripting.Dictionary Date_Dict.Add

我有一本日期对应的数字字典。我不得不想象有一种比存储所有日期然后回忆它们更好的方法

换句话说,我可以创建一个通用的字典,然后代码中的其他部分可以访问它,这样我就不会在函数中隐藏全局字典了吗

 Function Get_Val_Date(Val_Date_Key As Long)
        Dim Date_Dict As Scripting.Dictionary

    Set Date_Dict = New Scripting.Dictionary
    Date_Dict.Add 1, "9/30/1997"
    Date_Dict.Add 2, "9/30/1998"
    Date_Dict.Add 3, "9/30/1999"
    Date_Dict.Add 4, "9/30/2000"
    Date_Dict.Add 10, "9/30/2001"
    Date_Dict.Add 11, "9/30/2002"
    Date_Dict.Add 12, "9/30/2003"
    Date_Dict.Add 13, "9/30/2004"
    Date_Dict.Add 14, "9/30/2005"



    Get_Val_Date = Date_Dict(Val_Date_Key)

 End Function

第一次使用时只需缓存即可:

 'Module level
 Private Date_Dict As Scripting.Dictionary

 Function Get_Val_Date(Val_Date_Key As Long)
    If Date_Dict Is Nothing Then
        Set Date_Dict = New Scripting.Dictionary
        Date_Dict.Add 1, "9/30/1997"
        Date_Dict.Add 2, "9/30/1998"
        Date_Dict.Add 3, "9/30/1999"
        Date_Dict.Add 4, "9/30/2000"
        Date_Dict.Add 10, "9/30/2001"
        Date_Dict.Add 11, "9/30/2002"
        Date_Dict.Add 12, "9/30/2003"
        Date_Dict.Add 13, "9/30/2004"
        Date_Dict.Add 14, "9/30/2005"
    End If

    Get_Val_Date = Date_Dict(Val_Date_Key)

 End Function
如果要在其他函数中使用相同的字典,可以将初始值设定项拆分为自己的
,如下所示:

Function Get_Val_Date(Val_Date_Key As Long)
   InitializeDateLookup
   Get_Val_Date = Date_Dict(Val_Date_Key)
End Function

Sub InitializeDateLookup()
    If Date_Dict Is Nothing Then
        Set Date_Dict = New Scripting.Dictionary
        Date_Dict.Add 1, "9/30/1997"
        Date_Dict.Add 2, "9/30/1998"
        Date_Dict.Add 3, "9/30/1999"
        Date_Dict.Add 4, "9/30/2000"
        Date_Dict.Add 10, "9/30/2001"
        Date_Dict.Add 11, "9/30/2002"
        Date_Dict.Add 12, "9/30/2003"
        Date_Dict.Add 13, "9/30/2004"
        Date_Dict.Add 14, "9/30/2005"
    End If
End Sub

然后,任何需要它的过程都可以调用一行程序
InitializeDateLookup

,或者,如果字典不需要在其他任何地方使用,您可以将其声明为
静态
本地。或者,将其缓存在
属性Get
过程中。第三种选择是将其包装在预先声明的类模块中。有很多方法可以剥下这只猫的皮。我实际上是想摆脱类模块——旧版本在类模块中,让每个人都头疼。我不认为“后期绑定”意味着你认为它的作用。任何声明为对象的
或声明为变量的
都只能在运行时解析-这都是“延迟绑定”的意思。我的印象是,“后期绑定”意味着库被声明为对象的一部分,这意味着即使关闭了引用,它也能够找到并提取正确的引用。“早期绑定”永远不会出现在代码中,因此提到它。无论如何绑定,您都可以从对象获取类型库。这只是COM工作原理的一个基本部分。早期绑定只是意味着可以在编译过程中使用类型库中的信息,而不必在运行时对其求值(这通常比较慢-早期绑定让您提前支付开销)