【教學】Word - 擷取包含關鍵字的所有段落丟到新文件中



贊助商連結


leonchou
2002-09-13, 01:13 AM
[問題] 自動擷取、另存有關某個指定關鍵字的所有段落, VBA怎麼寫?

這個問題令我想到了Unix/Linux的 grep 指令~
在Linux可以用短短一行指令解決的事,
在Windows竟然要動用到程式~ 真是的... ^^|||
(如果真有這樣的內建指令或功能,
煩請指導, Thanks!!)

Sub 東找西找( )
 Set myRange = ActiveDocument.Content
 找啥 = InputBox("找啥?")
 找到 = myRange.Find.Execute(找啥)
 Do While 找到
  打包 = 打包 & myRange.Paragraphs(1)
  找到 = myRange.Find.Execute(找啥)
 Loop
 If IsEmpty(打包) Then MsgBox "找無!": Exit Sub
 Documents.Add: Selection = 打包
End Sub

這個巨集是用 [尋找] 的方式,收集所有包含關鍵字
的段落,然後一次丟到新文件中。

由於 Word2002 有 [多重選取] 的功能, 或許可以
一次處理, 不須用到迴圈也說不定~~

PS. grep指令應該是只能處理純文字檔案, 想想又覺得
 拿這個來跟 Word / VBA 比較, 似乎有欠公平.. :p

贊助商連結


leonchou
2002-09-25, 01:52 AM
有試過上面巨集的人可能會發現, 若是同一段
的keyword有一個以上, 會被重複處理;
也就是同一段可能會被重複擷取至新文件.
要避免這種情形, 可在 Do...Loop 間插入一行:
myRange.EndOf wdParagraph

Sub 東找西找( )
 Set myRange = ActiveDocument.Content
 找啥 = InputBox("找啥?")
 找到 = myRange.Find.Execute(找啥)
 Do While 找到
  打包 = 打包 & myRange.Paragraphs(1)
  myRange.EndOf wdParagraph
  找到 = myRange.Find.Execute(找啥)
 Loop
 If IsEmpty(打包) Then MsgBox "找無!": Exit Sub
 Documents.Add: Selection = 打包
End Sub

myRange.EndOf wdParagraph 的意思是
把 myRange 改設定至該段落的結尾,
也就是直接從下一段繼續尋找,
即可避免重複處理同一段的keyword.

wdParagraph 是 EndOF 指令(方法)的參數,
指以 段落 為單位. 此參數可指定其他單位,
如 wdCharacter (字元)、wdWord (單字)...
等等, 詳細用法請見 Word VBA 輔助說明~

arti
2002-10-09, 06:20 PM
謝謝教導!偶還要消化、消化,才能理解。