VBAで100個のWord文書を検索

毎年の恒例業務?で、学生たちのレポートを整理するため、VBAでのプログラミングに挑戦してみました。とはいえ、VBAのプログラムファイルは、vbsという拡張子で保存するんだ!、と言うことも知らないではじめる無謀さ。それでも何とか動いて、100人分あまりのレポートファイルから、1-2行目にある(はずの)レポートタイトルと氏名などを抽出し、テキストファイルに書き出す処理を自動化できました。

100個ものファイルを開いてはコピペする手間を省き、提出者のレポートタイトルを一覧表にできた。前処理やらなにやらで、昨年まで半日かかっていた作業が、わずか30分ほどで終了。なにより精神的に楽チンなのがいい。これは画期的。もっと早くやればよかった。

無駄な記述もいっぱいあるけれど、忘れないために。

path = “文書ファイルのフォルダ(絶対パス)”
WriteFile = “結果書き出しテキストファイル(絶対パス)”
Dim objFileSys
Dim objFolder
Dim objSubFolder
Dim objFile
Dim WriteStream
‘Wordオブジェクト生成&可視化
Set obj = CreateObject(“Word.Application”)
obj.Visible = False
Set objFile = CreateObject(“Scripting.FileSystemObject”)
Set WriteStream = objFile.OpenTextFile(WriteFile, 8, True)
‘第2引数 1:R 2:W 8:Add 第3引数 True:作成 false:しない)
‘ファイルシステムを扱うオブジェクトを作成
Set objFileSys = CreateObject(“Scripting.FileSystemObject”)
‘pathフォルダのオブジェクト取得
Set objFolder = objFileSys.GetFolder(path)
For Each objFile In objFolder.Files
‘文書を開く
returnValue = obj.Documents.Open (path & objFile.Name , ReadOnly)
‘1-2行目を取り出す
Set wds = obj.ActiveDocument.Sentences
msg = wds.Item(1).Text
msg2 = wds.Item(2).Text
‘テキストファイルに書き出し
WriteStream.Write objFile.Name & “,” & msg & “,” & msg2 & vbCrLf
Next
WriteStream.Close
obj.Quit
Set obj = Nothing
Set objFileSys = Nothing
Set objSubFloder = Nothing

このvbaで処理しきれない課題もいくつか。
・wordの文書形式(docxなのに、docで保存されているなど)が違うと開かない
(ちゃんと普通に保存されていればdocでもdocxでもかまわない)
・開かない文書があると、word.exeが異常終了する(タスクマネージャで終了させるしかない)
・1行目にタイトルを書かない学生がいる!(タイトルをヘッダに書いてる!)
・テキストファイルに書き出すため、文字属性(サイズや書体)はわからない
・タイトルや氏名の前後に、無駄なスペースなどがある
・遅い!

ほとんどは”ごく普通”に作成されていれば問題ないのだけど、100人もいると、不可思議な文書を作成する人もいるものです。