Arrays 数组是否可以声明为常量?

Arrays 数组是否可以声明为常量?,arrays,excel,vba,constants,Arrays,Excel,Vba,Constants,是否可以: 将数组声明为常量 或 使用变通方法声明一个数组,该数组不受添加、删除或更改元素的保护,因此在宏的生命周期内功能保持不变 我当然可以这样做: Const myConstant1 As Integer = 2 Const myConstant2 As Integer = 13 Const myConstant3 As Integer = 17 Const myConstant4 ...and so on …但它失去了使用阵列的优雅。我还可以将常量加载到数组中,并在每次使用它们时重新加载

是否可以:

  • 将数组声明为常量

  • 使用变通方法声明一个数组,该数组不受添加、删除或更改元素的保护,因此在宏的生命周期内功能保持不变

  • 我当然可以这样做:

    Const myConstant1 As Integer = 2
    Const myConstant2 As Integer = 13
    Const myConstant3 As Integer = 17
    Const myConstant4 ...and so on
    
    …但它失去了使用阵列的优雅。我还可以将常量加载到数组中,并在每次使用它们时重新加载它们,但如果在使用之前未能使用这些常量值重新加载数组,则可能会使代码暴露于已更改的“常量”值


    任何可行的答案都是受欢迎的,但理想的答案是可以设置一次,并且在修改其他代码时不需要任何更改/维护。

    数组可以声明为常量吗?没有

    解决方法-我能想到的最简单的方法是用delim定义一个常量,然后使用
    Split
    函数创建一个数组

    Const myConstant = "2,13,17"
    
    Sub Test()
        i = Split(myConstant, ",")
    
        For j = LBound(i) To UBound(i)
            Debug.Print i(j)
        Next
    End Sub
    
    Function ContantArray()
        ContantArray = Array(2, 13, 17)
    End Function
    

    否-数组不能声明为常量,但可以使用变通方法

    您可以创建一个返回所需数组的函数


    我声明了一个
    字符串
    常量
    “1,2,3,4,5”
    ,然后使用
    拆分
    创建一个新数组,如下所示:

    Public Const myArray = "1,2,3,4,5"
    
    Public Sub createArray()
    
            Dim i As Integer
            A = Split(myArray, ",")
    
            For i = LBound(A) To UBound(A)
                    Debug.Print A(i)
            Next i
    
    End Sub
    

    当我试图在
    A
    上使用
    ReDim
    ReDim Preserve
    时,它不允许我使用。这种方法的缺点是,即使不能更改数组的大小,您仍然可以编辑数组的值。

    将其作为函数如何?例如:

    Public Function myConstant(ByVal idx As Integer) As Integer
        myConstant = Array(2, 13, 17, 23)(idx - 1)
    End Function
    
    Sub Test()
        Debug.Print myConstant(1)
        Debug.Print myConstant(2)
        Debug.Print myConstant(3)
        Debug.Print myConstant(4)
    End Sub
    

    没有人可以更改它、调整它的大小或编辑它的内容。。。此外,您可以在一行上定义常量

    可以使用函数返回数组并将函数用作数组

    Const myConstant = "2,13,17"
    
    Sub Test()
        i = Split(myConstant, ",")
    
        For j = LBound(i) To UBound(i)
            Debug.Print i(j)
        Next
    End Sub
    
    Function ContantArray()
        ContantArray = Array(2, 13, 17)
    End Function
    


    如果特定的VBA环境是Excel VBA,则Excel应用程序的求值方法提供了一种很好的语法,可以将其缩短为方括号

    看看这个

    Sub XlSerialization1()
        Dim v
        v = [{1,2;"foo",4.5}]
    
        Debug.Assert v(1, 1) = 1
        Debug.Assert v(1, 2) = 2
        Debug.Assert v(2, 1) = "foo"
        Debug.Assert v(2, 2) = 4.5
    
        '* write all cells in one line
        Sheet1.Cells(1, 1).Resize(2, 2).Value2 = v
    End Sub
    

    如果每次不需要新实例,可以使用
    静态
    局部变量来避免多个对象的创建和初始化:

    Private Function MyConstants()
        Static constants As Variant
    
        If IsEmpty(constants) Then
            constants = Array(2, 13, 17)
        End If
    
        MyConstants = constants
    End Function
    

    这是不是太简单了

    PUBLIC CONST MyArray = "1,2,3,4"
    
    然后在后面的模块中:

    Dim Arr as Variant
    
    SET Arr = split(MyArray,",")
    

    不知道这是何时更改的,但在Excel 365中,这是有效的(或者至少不会生成编译器错误):


    我知道这是一个老问题,但这些档案在发布后经常会被扫描很多年,所以我认为在原始日期之后很久再添加内容没有问题


    创建一个只读属性返回“array”值的类怎么样?可以使用与数组索引相同的语法指定参数,并且仅定义GET属性可以有效地使其成为只读的。在类中定义常量值,它将像常量数组一样工作,即使实际构造不同。

    如果您在回答中显示了这样一个函数,最好使用问题中的样本数据,并链接到该线程,我会给您一个向上投票;)这不是我的工作;它可能不值得投票:-)。谷歌30秒!如果
    ReDim()为字符串
    ,则可以
    ReDim
    ReDim保存它。这要求您以String=“1,2,3,4,5”
    的形式强烈键入Const myArray。这是我多年来遇到的一个问题的天才解决方案。非常感谢。我对自己没有想到这一点感到失望-(每个人都建议使用函数而不是常量,但我希望在设计时能够像在C/C++中一样维护我的数组。利用函数调用和数组调用的语法相同/不明确这一事实……很好!应该是
    ConstantArray
    (拼写错误!)。(PS-这太糟糕了!)@ChrisB FWIW该函数可能应该相应地命名,即类似于
    GetFooArray
    ,这样它看起来像一个函数调用-因为它就是这样。否则,如果没有它,就没有办法(我会避免在公共成员中使用下划线,但是是的,是的,一些以动词开头的描述性的东西。否则它只是误导(还有邪恶!)@ChrisB
    getRateMultipliers
    会更好。
    get
    表示函数,复数表示数组。来这里是为了了解常量数组和发现join()还有Rubberduck!这是这个Excel VBA问题的正确答案。它应该拥有最多的票数,并且是公认的答案。不幸的是,即使没有范围参考,它也无法在Office 2016(我的是32位的)(使用Excel、Outlook和Access进行测试)。