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

Возможно ли это:

  • Объявить массив как константу

    ИЛИ

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

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

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

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

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

Ответ 1

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

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

введите описание изображения здесь

введите описание изображения здесь

Ответ 2

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

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

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

Ответ 3

Я объявил константу 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 на A, это не позволяло мне. Падение этого метода заключается в том, что вы все равно можете редактировать значения массива, даже если вы не можете изменить размер.

Ответ 4

Если конкретной средой VBA является Excel-VBA, то из метода Excel Application 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

Ответ 5

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

Обходные пути. Самый простой способ - определить константу с 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

Ответ 7

Если вам не нужен новый экземпляр каждый раз, вы можете использовать Static локальную переменную, чтобы избежать создания и инициализации нескольких объектов:

Private Function MyConstants()
    Static constants As Variant

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

    MyConstants = constants
End Function

Ответ 8

Это слишком упрощенно?

PUBLIC CONST MyArray = "1,2,3,4"

потом в модуле:

Dim Arr as Variant

SET Arr = split(MyArray,",")

Ответ 9

Не знаю, когда это изменилось, но в Excel 365 это работает (или, по крайней мере, не генерирует ошибку компилятора): Const table1Defs As Variant = Array ("значение 1", 42, диапазон ("A1: D20"))