使用 VBA 處理 Word 文件

最近工作需要處理到 Word,要把 Word 文件轉成純文字,但要插入正確的頁碼。

我想到的方法是用 VBA 來處理,以前使用 VBA 比較多的情況是用在 Access 和 Excel 上,用 Word 情況還真的很少。

所幸工作的原理差不多,主要是要找出 Word 的物件模型,加上現在的說明檔資料很豐富,在二天的研究之後,終於做出來了。

底下記錄一個簡單的巨集,日後要研究才有線索可尋。

Dim objPage As Page
Dim PageText As String
 
pnc = ActiveDocument.ActiveWindow.Panes.Count
 
For m = 1 To pnc
 
    pc = ActiveDocument.ActiveWindow.Panes(m).Pages.Count
   
    For i = pc To 1 Step -1
    
        Set objPage = ActiveDocument.ActiveWindow.Panes(m).Pages.Item(i)
        
        rc = objPage.Rectangles.Count
       
        For j = 1 To rc
            
            rt = objPage.Rectangles.Item(j).RectangleType
                       
            If (rt <> wdSystem) Then
            
                rs = objPage.Rectangles.Item(j).Range.StoryType
                
                If (rt = wdTextRectangle And rs = wdMainTextStory) Then
                    
                    PageText = vbCrLf + "<p:" + Format(i, "00") + ">" + vbCrLf
                    objPage.Rectangles.Item(j).Range.InsertBefore PageText
                    
                    Exit For
                    
                End If
 
            End If
 
        Next j
   
    Next i
 
Next m
 
 

有幾個重點:

  • 我用到的物件模型層次為
    ActiveDocument / ActiveWindow / Panes / Pages / Rectangles / Range
  • 程式原理是逐一處理 Word 文件中的每一個物件,在每一頁第一個 Range 之前插入頁碼記號。
  • 其中 Panes 不知道是什麼?不過好像只有一個,就不理它了。
  • 一個 Page 會有好幾個 Rectangle,最初不知道如何處理,常有莫名奇妙的錯誤。後來用了二個屬性來判斷,才解決問題。
  • 一個是 RectangleType,一個是 Range.StoryType,只有在 RectangleType == wdTextRectangleRange.StoryType == wdMainTextStory 時,才是本文的 Range,其他可能是頁眉、註腳等位置。
  • 後來也發現,上述的條件下,同一頁也有好幾個符合的 Range,所以程式中才會在第一個符合的 Range 插入頁碼後,就離開迴圈,不繼續處理其他的 Range 了。
  • 因為插入頁碼,會破壞後面文字的位置,所以要從最後一頁做起。
重要度:
文章分類:
電腦標籤:

發表新回應