2013-03-11 53 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 } } 

,正確地產生「6」第1頁,「7」第2頁等上..

無論我嘗試什麼,我都無法使用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 

編輯:如果PreserveFormatting設置爲False前面的代碼纔有效。如果PreserveFormatting設置爲True,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

那麼,我的查找方法沒有自動選擇文本,所以沒有成功的蝙蝠。然後我修改了你的代碼,首先執行'storyRange.Select',但即便如此,所有代碼最終都是在純文本中插入兩個空白字段,導致{\ * MERGEFORMAT} = {+ * * MERGEFORMAT} PAGE – Alain 2013-03-11 12:47:03

+0

好的,你只需要在'storyRange.Select'後面添加第一個字段後,將'Selection'移動到Field Code內部。沒有看到你的文檔有點難,但像'Selection.MoveLeft Unit:= wdCharacter,Count:= 1'。它可能沒有工作,因爲'\ * MERGEFORMAT',讓我看看。 – CuberChase 2013-03-11 12:51:07

+0

請參閱最新的答案。我相信如果現在使用'storyRange.Select',這應該可以工作。 – CuberChase 2013-03-11 12:54:16