2013-03-11 2 views
1

큰 문서를 템플릿으로 조각하고 있습니다. 각 템플릿에는 바닥 글에 #OVERALLPAGENUMBER#이라는 키워드가 있습니다.이 바닥 글은 Excel VBA를 프로그래밍 방식으로 필드로 대체합니다. 이 코드를 테스트 한VBA를 사용하여 Word에서 중첩 된 필드 설정

Dim storyRange As Object 'Word.Range 
For Each storyRange In oDoc.StoryRanges 
    Do 
     With storyRange.Find 
      .Text = "#OVERALLPAGENUMBER#" 
      .Wrap = 1 'wdFindContinue 
      .Execute 
      While .found 
       storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True 
       .Execute 
      Wend 
     End With 
     On Error Resume Next 
     Set storyRange = storyRange.NextStoryRange 
     On Error GoTo 0 
    Loop While Not storyRange Is Nothing 
Next 

를, 그리고 성공적으로 바닥 글에 페이지 번호를 박았 : 내가 필요한 모든 해당 문서의 페이지 번호 인 경우

, 다음은 충분합니다. 그러나 내가 원하는 것은 중첩 된 (수식) 필드로 고정 된 번호를 페이지 번호에 추가하여 여러 문서에 페이지 수를 표시 할 수 있습니다. 내 솔루션, 내가 (Ctrl + F9를 사용하여) 수동으로 할 경우, 다음과 같이 필드 코드를 제공합니다

{ = 5 + { PAGE } } 

을 올바르게 등 2 페이지에 "7", 1 페이지의 "6"생산을 ..

아무리 노력해도 VBA를 사용하여 이러한 유형의 필드 중첩을 복제 할 수 없습니다. (매크로 레코더는 여기서는 쓸모가 없다.) 누구든지 프로그래밍 방식으로이 필드를 만드는 방법을 찾을 수 있습니까?


솔루션

내 문제는 PreserveFormatting:=True을 갖는 다른 내에서 둥지에 내 시도의 방법으로 하나 개의 필드를 받고 있었다이었다. 이제 다음의 간단한 솔루션은 작동합니다

With storyRange.Find 
    .Text = "#POLICYPAGENO#" 
    .Wrap = 1 'wdFindContinue 
    .Execute 
    While .found 
     storyRange.Select 
     With oDoc.ActiveWindow 
      .Selection.Fields.Add Range:=.Selection.Range, Type:=-1, Text:="PAGE", PreserveFormatting:=False 
      .Selection.MoveLeft Unit:=1, Count:=1, Extend:=1 
      .Selection.Fields.Add Range:=.Selection.Range, Type:=-1, PreserveFormatting:=False 
      .Selection.TypeText Text:="= " & OverallPageNumber & " +" 
     End With 
     .Execute 
    Wend 
End With 

답변

1

나는 당신의 방법을 찾아 텍스트 #OVERALLPAGENUMBER#를 선택합니다 교체 할 때마다 그것을 통해 루프 것을 확신합니다. 이런 경우 당신은 단순히 현재의 선택에 당신의 필수 코드를 배치합니다 다음과 storyRange.Fields.Add Range:=storyRange, Type:=-1, Text:="PAGE", PreserveFormatting:=True을 대체 할 수

Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False 
Selection.TypeText Text:="= 5 +" 
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False 
Selection.TypeText Text:="PAGE" 
Selection.Fields.Update 

편집 : PreserveFormattingFalse로 설정되어있는 경우 앞의 코드는 작동합니다. PreserveFormattingTrue으로 설정된 경우 Word에서 빈 필드 코드를 업데이트하는 것처럼 보입니다. 다음을 사용하여 서식을 유지하도록 선택 항목을 탐색 할 수 있습니다. 외부 필드에 대해서만 PreserveFormatting해야합니다.

Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=True 
Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend 
Selection.Fields.ToggleShowCodes 
Selection.MoveLeft Unit:=wdCharacter, Count:=1 
Selection.MoveRight Unit:=wdCharacter, Count:=1 
Selection.TypeText Text:="= 5 +" 
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, PreserveFormatting:=False 
Selection.TypeText Text:="PAGE" 
Selection.Fields.Update 
+0

글쎄, 내 find 메서드는 텍스트를 자동으로 선택하지 않았으므로 배트에서 작동하지 않았습니다. 그런 다음 처음에'storyRange.Select'를 실행하도록 코드를 수정했으나 그 코드는 모두 평범한 텍스트 주위에 두 개의 빈 필드를 삽입하여 {{* * MERGEFORMAT} = 5 + {\ * MERGEFORMAT} PAGE' – Alain

+0

이제 'storyRange.Select' 다음에 첫 번째 필드가 추가 된 후에 필드 코드 안에'Selection'을 옮겨 놓기 만하면됩니다. 문서를 보지 않고서는 조금 어렵지만'Selection.MoveLeft Unit : = wdCharacter, Count : = 1'과 같은 것입니다. '\ * MERGEFORMAT' 때문에 작동하지 않을 수도 있습니다. – CuberChase

+0

업데이트 된 답변을 참조하십시오. 이제'storyRange.Select'를 사용하면 이것이 효과가 있다고 생각합니다. – CuberChase