2016-12-08 2 views
9

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

  1. Объявляем массив как константа

    ИЛИ

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

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

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

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

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

ответ

11

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

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

enter image description here

enter image description here

+0

Принимая во внимание тот факт, что синтаксис вызовов функций и вызовов массивов идентичен/неоднозначен ... симпатичный! Вероятно, это будет 'ConstantArray' (опечатка!). (PS - это зло!) –

+0

Упс! вам нужно добавить наводящее название Rubberduck ... lol –

+0

Это великолепно! – ChrisB

0

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

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

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

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

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

+3

Если вы показали такую ​​функцию в своем ответе, предпочтительно с использованием выборочных данных в вопросе, а также связанные с этой темой, я бы дал вам upvote;) –

+0

Это не моя работа; он, вероятно, не заслуживает повышения :-). 30 секунд с Google! – Tragamor

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

+0

Если вы 'Dim A() As String', вы можете' ReDim' или 'ReDim Preserve' позже. Это требует, чтобы вы строго написали свой 'Const myArray As String =" 1,2,3,4,5 "'. –

3

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

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 

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

Смежные вопросы