2015-01-17 1 views
0

종료 할 때 매크로가 실행되도록하는 mac 문서의 2011 보호 텍스트에 텍스트 양식 필드가 있습니다. 매크로는 양식을 다양한 정보로 채우지 만이 특정 양식 필드에 입력 된 테스트에 종속되지 않습니다. 이 문제를 해결하기위한 두 가지 아이디어가 있습니다. 첫 번째 옵션은 수행이 가능할 때 가장 좋으며, 그렇지 않으면 두 번째 옵션은 합리적인 해결 방법입니다. 누군가가 다음 중 하나를 수행하는 매크로를 찾도록 도와 줄 수 있습니까?이미 실행 된 매크로를 건너 뛰는 VBA 매크로

a. 양식 필드를 다시 입력하고 편집하면 매크로가 다시 실행되지 않습니까?

b. 이미 필드에 텍스트가있는 경우 양식 필드 입력시 확인하고, 존재할 경우 편집 후 exit 매크로를 다시 실행하지 않고 다음 양식 필드로 이동합니다.

저는 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 

답변

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 설정 실행이 원하는 코드의 끝까지 도착하지 않으면값이 True가 아닐 것입니다.

+0

감사합니다. Matteo,이 시도했지만 양식 필드를 편집 할 경우 매크로 여전히 두 번째 실행됩니다. 여기 내가 한 일이있다. 어쩌면 내가 실수 한거야? 새로운 모듈 (Module2)을 생성하고 다음과 같이 코드를 입력했습니다. 부울, 부제 myMacro(), hasRun = False이면 (내 물건), hasRun = True, End If, End Sub와 같이 Dim hasRun을 입력하십시오. 그런 다음 양식 필드를 종료 할 때 모듈이 실행되도록 설정합니다. 그러나 양식 필드를 다시 입력하면 module2가 계속 실행됩니다. – BHW

+0

방금 ​​다음과 같이 전역 변수로 변경하여 작동하도록했습니다. 전역 hasRun을 부울로 사용. 정말 고맙습니다!! – BHW

+0

이제 또 다른 질문입니다. 위의 해결 방법은 훌륭합니다. 그러나 hasRun을 False로 재설정하려면 다음 문서에서 단어를 종료하고 템플릿을 다시 열어야합니다. 문서를 닫을 때 hasRun을 false로 다시 설정하려면 어떻게해야합니까? 그래서 새 문서를 열면 매크로가 다시 정상적으로 실행됩니까? 나는 개인 하위 Document_Close()에서 실행하기 위해 hasRun = False scrip을 삽입하려고했지만 아무 것도하지 않습니다. – BHW

관련 문제