Search code examples
vbafieldskip

VBA Macro to skip a macro that has already run


I have a text form field in a protected word 2011 for mac document, that triggers a macro to run upon exit. The macro populates the form with various information but is not dependent on the test that is entered into this particular form field. I have two ideas to solve this problem. The first option would be best if it can be done, otherwise the second option would be a reasonable work-around. Can someone please help find a macro that does one of the following?

a. Will prevent the macro from running a second time if the form field is entered into again and edited?

b. Checks to see upon entry of the form field, if there is text in the field already, and if there is, prevents editing and moves to the next form field without running the upon exit macro again?

I am very new to VBA, but I think I have a handle on the basics. Here is what i have come up with for the b. solution but it does not work.

A macro that checks to see if there is text in form field names "text9", if there is, then unprotect from, go to bookmark "text10" and protect form. else, allow the user to fill in the form field and run the macro upon exit.

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

Solution

  • I think the easiest approach to your problem is to use a global variable that answers the question "has the macro already run?".

    Let's say that you have a macro like follows:

    Sub myMacro()
        'your stuff here
    End Sub
    

    You don't want this macro to run twice. Then, you can define a global variable on the top of your module:

    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.
    

    And then embed a check into your macro:

    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
    

    This should allow you not to change the structure of your code or executing check on the data, but at the same time executing the macro only once. You can follow this direction to elaborate more the execution conditions: execute it only twice, only if something happened etc.

    PLEASE NOTE: you better set hasRun = True at the very end of your macro's code, in order to make sure that the value hasRun will not be True if the execution didn't arrive until the end of your desired code.