Могут ли значения переменных массива сохраняться после завершения макроса VBA - PullRequest
0 голосов
/ 12 февраля 2019

Могут ли значения переменных массива сохраняться после завершения макроса?Я объявил глобальную переменную:

Option Explicit
Public Arr2D As Variant

Public Sub ReadDataToArr()
    Arr2D = [MyNamedRange].Value
End Sub

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

Обновление .Почему я думаю, что это пусто?Добавить переменную Watch для Arr2D.

Когда я нахожусь в режиме отладки макроса выше (нажимая F8), я вижу это: enter image description here

Когда я прихожус ударами F8 до конца макроса, тогда я вижу это: enter image description here

Обновите снова. Я заметил что-то странное для меня.Когда я запускаю вышеупомянутый макрос во второй раз в режиме отладки (после инициализации значений и после того, как переменная вышла из контекста), то сразу же в самой первой строке макроса переменная становится «заполненной» значениями, и в контексте,Так что, возможно, именно поэтому возникли разногласия в комментариях.

1 Ответ

0 голосов
/ 12 февраля 2019
Option Explicit

Public test As Variant

Sub a()
    test = 5
End Sub

Sub b()
    MsgBox test
End Sub

Первый запуск a, затем запуск b, он выдаст 5, как и ожидалось.

Переменная test будет сохраняться до тех пор, пока вы не запустите End или не нажмете stopкнопка в VBE.


Обратите внимание, что в каждой процедуре вы должны проверять, была ли инициализирована ваша переменная test.

, например,

Option Explicit

Public Arr2D As Variant

Sub InitArr2D()
    Arr2D = [MyNamedRange].Value
End Sub

Sub ProcedureUsingArr2D()
    If Arr2D Is Nothing Then
        InitArr2D
    End If

    Debug.Print Join(WorksheetFunction.Transpose(Arr2D), ",")
End Sub

Если вы нене проверяйте, что ваша переменная может быть Nothing после того, как во время выполнения произошла ошибка и вы нажали End.Таким образом, он автоматически переинициализируется.

...