Макрос VBA, чтобы пропустить макрос, который уже запущен

У меня есть поле текстовой формы в защищенном документе Word 2011 для Mac, которое запускает макрос при выходе. Макрос заполняет форму различной информацией, но не зависит от теста, введенного в это конкретное поле формы. У меня есть две идеи по решению этой проблемы. Первый вариант был бы лучшим, если бы его можно было сделать, в противном случае второй вариант был бы разумным обходным путем. Может кто-нибудь помочь найти макрос, который выполняет одно из следующих действий?

а. Предотвратит ли запуск макроса во второй раз, если поле формы снова будет введено и отредактировано?

б. Проверяет при входе в поле формы, есть ли уже текст в поле, и если есть, предотвращает редактирование и переходит к следующему полю формы без повторного запуска макроса при выходе?

Я новичок в VBA, но думаю, что знаю основы. Вот что я придумал для б. решение, но оно не работает.

Макрос, который проверяет, есть ли текст в именах полей формы "text9", если есть, то снимает защиту, переходит в закладку "text10" и защищает форму. в противном случае позвольте пользователю заполнить поле формы и запустить макрос при выходе.

Sub TestSkipField()
'
' TestSkipField Macro
'
'
With GetCurrentFF
If Len(.Result) = Null Then
End If
Else
            If ActiveDocument.ProtectionType <> wdNoProtection Then
            ActiveDocument.UnProtect
            End If
            Selection.GoTo What:=wdGoToBookmark, Name:="Text10"
                With ActiveDocument.Bookmarks
                .DefaultSorting = wdSortByName
                .ShowHidden = False
            End With
        ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
End If
End With
End Sub

person BHW    schedule 17.01.2015    source источник


Ответы (1)


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

Допустим, у вас есть макрос следующего вида:

Sub myMacro()
    'your stuff here
End Sub

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

Dim hasRun As Boolean 'this will be False by default
Sub myMacro()
    'your stuff here
End Sub
Sub myOtherMacro()
    'some other stuff here
End Sub
'etc.

А потом встроить чек в свой макрос:

Sub myMacro()
    If hasRun = False Then 'if hasRun is still False, it means we never ran this code yet
        'do your stuff here
        hasRun = True 'set hasRun = True, so from now we know that this code has already been executed once
    End If
End Sub

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

ВНИМАНИЕ: вам лучше установить hasRun = True в самом конце кода вашего макроса, чтобы убедиться, что значение hasRun не будет True, если выполнение не будет достигнуто до конца желаемого кода. .

person Matteo NNZ    schedule 17.01.2015
comment
Спасибо, Маттео, я попробовал это, но макрос все еще запускается во второй раз, если поле формы редактируется. Вот что я сделал. Может я ошибся? Я создал новый модуль (Module2) и ввел следующий код: Dim hasRun as Boolean, Sub myMacro(), If hasRun = False then (мой материал), hasRun = True, End If, End Sub. Затем я устанавливаю модуль для запуска при выходе из поля формы. Однако, когда я повторно ввожу поле формы, модуль2 все равно снова запускается. - person BHW; 18.01.2015
comment
Я просто заставил его работать, изменив его на глобальную переменную следующим образом: Global hasRun as boolean. Большое спасибо!! - person BHW; 18.01.2015
comment
Теперь еще один вопрос. Приведенное выше решение отлично работает, однако, чтобы сбросить hasRun на False для следующего документа, мне нужно выйти из Word и снова открыть шаблон. Как я могу установить hasRun обратно в false, когда документ закрывается. так что, когда я открываю новый документ, макрос снова будет работать правильно? Я попытался вставить скрипт hasRun = False для запуска в Private sub Document_Close(), но он ничего не делает. - person BHW; 19.01.2015
comment
@BHW, когда документ закрывается, вся память очищается, поэтому вам не нужно устанавливать hasRun = False, потому что так будет по умолчанию. Однако вы можете просто установить его таким (если вам это действительно нужно), написав его после последней строки кода, где вам действительно нужно знать его значение. Обратите внимание: переполнение стека работает следующим образом: если пользователь задает вопрос, и кто-то дает ответ, который работает, этот пользователь должен пометить данный ответ. Это поможет будущему пользователю в той же ситуации понять, что это правильный путь. Не стесняйтесь спрашивать, если вам нужно узнать больше. - person Matteo NNZ; 19.01.2015