Может ли массив быть объявлен константой?

возможно ли либо:

  1. объявить массив как константа

    или

  2. использовать обходной путь для объявления массива, защищенного от добавления, удаления или изменения элементов и, следовательно, функционально постоянного в течение жизни макроса?

конечно, я мог бы это сделать:

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

...но он теряет элегантность работы с массивами. Я также могу загрузить константы в массив и перезагружать их каждый раз, когда я их использую, но любая неспособность перезагрузить массив с этими постоянными значениями перед использованием может подвергнуть код "постоянному" значению, которое изменилось.

любой работоспособный ответ приветствуется, но идеальным ответом является тот, который может быть настроен один раз и не требует каких-либо изменений/обслуживания при изменении другого кода.

6 ответов


вы можете использовать функцию для возврата массива и использовать функцию в качестве массива.

Function ContantArray()
    ContantArray = Array(2, 13, 17)
End Function

enter image description here

enter image description here


Как насчет того, чтобы сделать его функцией? Например:

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

никто не может изменить его, изменить его размер или изменить его содержимое... Кроме того, вы можете определить свои константы на одной строке!


заявил 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

когда я пытался использовать ReDim или ReDim Preserve on A он мне не позволил. Недостатком этого метода является то, что вы все равно можете редактировать значения массива, даже если вы не можете изменить размер.


можно ли объявить массив константой? Нет.

обходные пути-самый простой, который я могу придумать, это определить константу с 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

нет - массивы не могут быть объявлены как константы, но вы можете использовать обходной путь.

вы можете создать функцию, которая возвращает массив, который вы хотите

http://www.vbaexpress.com/forum/showthread.php?1233-Solved-Declare-a-Constant-Array


Если конкретной средой 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