一个数组可以声明为常量吗?

27

是否有可能:

  1. 将数组声明为常量

    或者

  2. 使用解决方法来声明一个数组,使其受到保护,以防止添加、删除或更改元素,在宏的生命周期内从而实现函数常量?

当然我可以这样做:

Const myConstant1 As Integer = 2
Const myConstant2 As Integer = 13
Const myConstant3 As Integer = 17
Const myConstant4 ...and so on

...但这样做失去了使用数组的优雅之处。我也可以将常量加载到一个数组中,并在每次使用它们时重新加载,但是如果在使用之前未能重新加载该数组以使用这些常量值,可能会暴露代码中已更改的“常量”值。

任何可行的答案都可以,但理想的答案是一次设置就可以,当修改其他代码时不需要进行任何更改/维护。

11个回答

40
你可以使用一个函数来返回数组,并将该函数用作数组。
Function ContantArray()
    ContantArray = Array(2, 13, 17)
End Function

enter image description here

enter image description here


6
利用函数调用和数组调用的语法相同/模糊的事实... 很棒!不过应该是“ConstantArray”(笔误!)。(PS - 那很邪恶!) - Mathieu Guindon
1
我会避免在公共成员中使用下划线,但是确实需要以动词开头的描述性内容。否则这只会产生误导(和邪恶!) - Mathieu Guindon
2
@ChrisB 更好的方法是使用 getRateMultipliersget 暗示了一个函数,而复数则暗示了一个数组。 - user6432984
1
太棒了!(我从来不知道在即时窗口中可以运行For循环) - SlowLearner
4
来这里了解常量数组,发现了join()和Rubberduck! - PC_Goldman - SE is rotting
显示剩余7条评论

10

将其制作为一个函数如何?例如:

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

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


8

我声明了一个String类型的常量,值为"1,2,3,4,5",然后使用Split方法创建了一个新数组,代码如下:

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上使用ReDimReDim Preserve时,它不允许我这样做。这种方法的缺点是,即使您无法更改大小,仍然可以编辑数组的值。

如果你使用 Dim A() As String,之后可以使用 ReDimReDim Preserve 进行重新定义。这需要你对 Const myArray As String = "1,2,3,4,5" 进行强类型定义。 - David Zemens
多年来一直困扰我的问题终于有了天才的解决方案。谢谢!我很失望自己没有想到它。 :-( 每个人都建议使用函数而不是常量,但我希望能够像在C/C++中设计时那样维护我的数组。 - SixSigmaGuy

8
如果特定的VBA环境是Excel-VBA,那么可以使用Excel应用程序的Evaluate方法提供的一种简洁的语法,可以缩短为方括号。请看下面这个例子:
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

1
这是这个Excel VBA问题的正确答案。它应该拥有最多的投票并被接受为答案。 - Excel Hero
我喜欢这种公式风格的语法!但是,可悲的是,它不能用于常量 const x = [{1,2,3}] - johny why

3

数组可以声明为常量吗?不可以。

解决方法 - 我能想到的最简单的方法是使用分隔符定义一个常量,然后使用 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

3

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

Private Function MyConstants()
    Static constants As Variant

    If IsEmpty(constants) Then
        constants = Array(2, 13, 17)
    End If

    MyConstants = constants
End Function

2
我知道这是一个旧问题,但是这些档案经常被扫描多年后发布,因此我认为随时添加内容并没有问题。
创建一个类,其中包含只读属性以返回“数组”值如何?您可以使用与数组索引相同的语法指定参数,并且仅定义GET属性可使其成为只读属性。在类内部定义常量值,它将像常量数组一样工作,即使实际构造不同。

2
最初的回答:这个问题太简单了吗?
这个问题是否太过简单?
PUBLIC CONST MyArray = "1,2,3,4"

最初的回答
之后在一个模块中:
Dim Arr as Variant

SET Arr = split(MyArray,",")

这个简单的解决方案对我很有效。也可以将Arr定义为字符串数组(Dim Arr() as string)。 - Tony M

0

3
如果您在答案中展示了这样一个函数,最好使用问题中提供的示例数据,并链接到该主题,我会给您点赞;) - Andrew Morton
这不是我的工作;它可能不值得点赞 :-). 只需要30秒谷歌搜索! - Tragamor

0

利用上述信息,我得出了以下的工作解决方案,用于比较一个月的短文本信息,独立于使用德语的Excel:

Const MONATE = ",Jän,Feb,März,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez"

... 稍后在代码中:

    If StringToCompare = Split(MONATE, ",")(Month(dt)) Then

注意:由于Split-Array从索引0开始,我在开头添加了逗号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接