数组可以声明为常量吗?

Chr*_*isB 17 arrays excel vba constants excel-vba

有可能:

  1. 将数组声明为常量

    要么

  2. 使用变通方法声明一个受保护的数组,以防止添加,删除或更改元素,因此在宏的生命周期中功能上保持不变?

我当然可以这样做:

Const myConstant1 As Integer = 2
Const myConstant2 As Integer = 13
Const myConstant3 As Integer = 17
Const myConstant4 ...and so on
Run Code Online (Sandbox Code Playgroud)

...但它失去了使用数组的优雅.我还可以将常量加载到数组中,并在每次使用它们时重新加载它们,但是在使用之前无法使用这些常量值重新加载数组可能会将代码暴露给已更改的"常量"值.

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

小智 26

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

Function ContantArray()
    ContantArray = Array(2, 13, 17)
End Function
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

  • 利用函数调用和数组调用的语法相同/不明确的事实......可爱!虽然应该是`ConstantArray`(错字!)。(PS - 那是邪恶的!) (2认同)
  • @ChrisB FWIW 该函数可能应该相应地命名,即类似`GetFooArray` 的名称,以便它*看起来*像一个函数调用 - 因为它就是这样。否则,如果没有 [Rubberduck](https://github.com/rubberduck-vba/Rubberduck),就无法[从调用站点得知](https://i.stack.imgur.com/JuNxi.png) (< ~ 那是一个截图)你正在查看一个变体返回函数! (2认同)
  • @ChrisB `getRateMultipliers` 会更好。“get”表示一个函数,复数表示一个数组。 (2认同)
  • 来这里是为了了解常量数组并发现了 join() 和 Rubberduck! (2认同)

A.S*_*S.H 6

如何使它成为一个功能?如:

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
Run Code Online (Sandbox Code Playgroud)

没有人可以改变它,调整它或编辑它的内容......而且,你可以只在一行定义你的常量!


S M*_*den 6

如果特定的 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
Run Code Online (Sandbox Code Playgroud)

  • 这是此 Excel VBA 问题的正确答案。它应该拥有最多的票数并成为被接受的答案。 (2认同)

Sou*_*ire 5

我声明了一个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
Run Code Online (Sandbox Code Playgroud)

当我试图使用ReDimReDim PreserveA它没有让我。这种方法的缺点是,即使您不能更改大小,您仍然可以编辑数组的值。