Ответ 1
Вы можете использовать функцию для возврата массива и использовать функцию в виде массива.
Function ContantArray()
ContantArray = Array(2, 13, 17)
End Function
Возможно ли это:
Объявить массив как константу
ИЛИ
Использовать обходной путь для объявления массива, который защищен от добавления, удаления или изменения элементов и, следовательно, функционально постоянных в течение жизни макроса?
Конечно, я мог бы сделать это:
Const myConstant1 As Integer = 2
Const myConstant2 As Integer = 13
Const myConstant3 As Integer = 17
Const myConstant4 ...and so on
... но он теряет элегантность работы с массивами. Я мог бы также загружать константы в массив и перезагружать их каждый раз, когда я их использую, но любой отказ перезагрузки массива с этими постоянными значениями перед использованием может привести к изменению значения "постоянное" кода.
Любой работоспособный ответ приветствуется, но идеальным ответом является тот, который может быть настроен один раз и не требует каких-либо изменений/обслуживания при изменении другого кода.
Вы можете использовать функцию для возврата массива и использовать функцию в виде массива.
Function ContantArray()
ContantArray = Array(2, 13, 17)
End Function
Как сделать его функцией? Например:
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
на A
, это не позволяло мне. Падение этого метода заключается в том, что вы все равно можете редактировать значения массива, даже если вы не можете изменить размер.
Если конкретной средой 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
Можно ли объявить массив как константу? Нет.
Обходные пути. Самый простой способ - определить константу с 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
Если вам не нужен новый экземпляр каждый раз, вы можете использовать Static
локальную переменную, чтобы избежать создания и инициализации нескольких объектов:
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 это работает (или, по крайней мере, не генерирует ошибку компилятора): Const table1Defs As Variant = Array ("значение 1", 42, диапазон ("A1: D20"))