heavenchou - 週一, 2016/09/26 - 01:35
最近工作需要處理到 Word,要把 Word 文件轉成純文字,但要插入正確的頁碼。
我想到的方法是用 VBA 來處理,以前使用 VBA 比較多的情況是用在 Access 和 Excel 上,用 Word 情況還真的很少。
所幸工作的原理差不多,主要是要找出 Word 的物件模型,加上現在的說明檔資料很豐富,在二天的研究之後,終於做出來了。
底下記錄一個簡單的巨集,日後要研究才有線索可尋。
Dim objPage As PageDim PageText As Stringpnc = ActiveDocument.ActiveWindow.Panes.CountFor m = 1 To pncpc = ActiveDocument.ActiveWindow.Panes(m).Pages.CountFor i = pc To 1 Step -1Set objPage = ActiveDocument.ActiveWindow.Panes(m).Pages.Item(i)rc = objPage.Rectangles.CountFor j = 1 To rcrt = objPage.Rectangles.Item(j).RectangleTypeIf (rt <> wdSystem) Thenrs = objPage.Rectangles.Item(j).Range.StoryTypeIf (rt = wdTextRectangle And rs = wdMainTextStory) ThenPageText = vbCrLf + "<p:" + Format(i, "00") + ">" + vbCrLfobjPage.Rectangles.Item(j).Range.InsertBefore PageTextExit ForEnd IfEnd IfNext jNext iNext m
有幾個重點:
-
我用到的物件模型層次為
ActiveDocument / ActiveWindow / Panes / Pages / Rectangles / Range - 程式原理是逐一處理 Word 文件中的每一個物件,在每一頁第一個 Range 之前插入頁碼記號。
- 其中 Panes 不知道是什麼?不過好像只有一個,就不理它了。
- 一個 Page 會有好幾個 Rectangle,最初不知道如何處理,常有莫名奇妙的錯誤。後來用了二個屬性來判斷,才解決問題。
- 一個是 RectangleType,一個是 Range.StoryType,只有在 RectangleType == wdTextRectangle 且 Range.StoryType == wdMainTextStory 時,才是本文的 Range,其他可能是頁眉、註腳等位置。
- 後來也發現,上述的條件下,同一頁也有好幾個符合的 Range,所以程式中才會在第一個符合的 Range 插入頁碼後,就離開迴圈,不繼續處理其他的 Range 了。
- 因為插入頁碼,會破壞後面文字的位置,所以要從最後一頁做起。
重要度:
文章分類:
- 瀏覽次數:11480
發表新回應