Как очистить статическую переменную в Excel VBA? - PullRequest
4 голосов
/ 17 июля 2011

У меня есть статическая переменная, определенная в Sub:

Private Sub assignVars()
' Use this function to assign default values

    Static isSet As Integer

    If isSet <> 1 Then
        ' do something

        isSet = 1
    End If

End Sub

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

Ответы [ 4 ]

3 голосов
/ 17 июля 2011

Самый простой способ сделать это - выполнить оператор End в ближайшем окне.

Однако это уничтожит все сохраненные состояния - т.е. все ваши переменные уровня модуля, все статические переменные во всех процедурах.и т. д. И это круто;Unload и Terminate события не запускаются и т. Д.:

http://msdn.microsoft.com/en-us/library/gg251671.aspx

(я отредактировал материал ниже после того, как перечитал ваш вопрос ...)

Чтобы вызвать потерю состояния только в одной подпрограмме, вы можете вручную закомментировать объявление isSet, а затем восстановить его.В VBE есть настройка, которую вы можете установить в меню Инструменты ... Параметры, вкладка Общие, которая будет уведомлять вас о таких случаях потери состояния.(Однако он не предупреждает о вызове End, вероятно, потому, что в этом случае вам не нужно никакого предупреждения.)

Вы не просили об этом, но если вы хотите бытьв состоянии сбросить одну статическую переменную в одной процедуре без редактирования какого-либо кода , вам придется сделать что-то нехорошее, например:

Public Sub assignVars(Optional reset As Boolean)
    Static isSet As Integer

    If reset Then
        isSet = 0

        Exit Sub
    End If

    If isSet <> 1 Then
        isSet = 1
    End If
End Sub

Обратите внимание, что мне пришлось сделать вашу процедуруPublic, чтобы вы могли вызывать его из непосредственного окна с параметром True, когда хотите сбросить.

Если вам нужно какое-то состояние, доступное извне вашей процедуры,в этом случае для возможности его ручного сброса вы можете рассмотреть переменную уровня модуля , а не Static процедуру уровня один.Тогда ваша подпрограмма может остаться на Private, ее интерфейс не будет испорчен для сброса, и вы можете вручную связываться с переменной уровня модуля.

1 голос
/ 08 февраля 2012

Привет, я не знаю, может ли кто-нибудь еще написать свою «функцию поиска», но я обнаружил, что хочу собрать несколько слов из одной ячейки, разделить запятыми, а затем искать в строках используя встроенную функцию InStr. В любом случае, я хотел сделать это для всех слов, поэтому мне приходилось очищать собранное слово после каждого использования InStr. Чтобы сделать это, я установил для строки значение «Пусто».

1 голос
/ 17 июля 2011

Э-э-э ... Как насчет очистки переменной до того, что вы хотите? Его значение по умолчанию равно нулю:

isSet = 0

Редактор VBA также позволяет остановить («Завершить») выполнение макроса и перезапустить его («Выполнить»).

0 голосов
/ 25 июля 2014

Вот подход, использующий точку останова и непосредственное окно.

  1. Напишите следующую подпрограмму и запустите ее несколько раз, чтобы загрузить статическую переменную N.

    Sub sub_with_static_var ()

    Static N As Long:     N = N + 1
    
    Debug.Print N
    

    End Sub

  2. Установите точку останова в Sub и запустите ее снова, остановившись в точке останова.

  3. Введите N = 0 в «Немедленном окне», затем перетащите стрелку «Следующая строка для запуска» в конец вспомогательной строки и выполните до конца.

Если выТеперь запустите эту подпрограмму, она выведет 1 (т. е. N было 0 и увеличилось как обычно).

Это должно соответствовать вашим требованиям и не повлиять на то, как вы пишете свой код.(Если ваша подпрограмма имеет аргументы, вам, возможно, придется применить ее через Immediate Window с некоторыми фиктивными аргументами, чтобы применить этот метод.)

...