Ключевое слово Dim
объявляет локальную переменную . При использовании на уровне модуля он объявляет переменную private с областью действия модуля, т. Е. Точно так же, как если бы она была объявлена с ключевым словом Private
. По этой причине предпочитайте использовать Dim
для локальных и Private
для переменных модуля.
ThisWorkbook
- это особый вид модуля - это модуль документа , который является классом , который наследует членов от базового класса - в этом кейс Excel.Workbook
класс. ThisWorkbook
также является глобальным идентификатором, который ссылается на экземпляр класса ThisWorkbook
, который доступен глобально в вашем проекте VBA.
Будучи модулем класса , любые члены Public
могут быть доступны извне этого модуля, учитывая экземпляр класса. Поскольку существует глобальная переменная объекта, названная в честь этого класса, ее члены Public
могут быть доступны с помощью ThisWorkbook.MemberName
.
Таким образом, вы можете объявить KeyArrTrans
с помощью ключевого слова Public
, фактически сделав его глобальным (т. Е. Фактически объявив его общедоступным в стандартном модуле и получив доступ к нему с именем модуля).
Проблема, которую это создает, заключается в том, что теперь любому коду в любом месте проекта разрешено принимать эту переменную и указывать ее где-то еще .
Скорее всего, что вам нужно / нужно, это не иметь возможность изменять фактический указатель массива из других модулей, а просто получать доступ к его содержимому. Если вам нужно представить содержимое массива в виде данных только для чтения, вам нужно написать свою собственную структуру данных ... и это, вероятно, очень излишне.
Таким образом, вместо этого вы можете инкапсулировать указатель массива и выставлять его как свойство только для получения , сохраняя объявление закрытым (Dim
/ Private
), и добавление члена Public Property Get
к ThisWorkbook
:
Public Property Get AllTheKeys() As Variant
AllTheKeys = KeyArrTrans
End Property
Таким образом (т.е. без предоставления мутатора Public Property Let
) другой код может читать массив и записывать его элементы, но они не могут назначаться самому массиву - и эта защита обеспечивается компилятором!
Теперь вы можете получить доступ к массиву через свойство AllTheKeys
, доступное для ThisWorkbook
:
Debug.Print UBound(ThisWorkbook.AllTheKeys, 1)