こんにちは! Word VBAの世界へようこそ。
マクロの記録ボタンを押して「動いたはいいけれど、中身が全然読めない……」と頭を抱えていませんか? 大丈夫、みんな最初はそこからスタートします。
今回は、Word文書の中に散らばる「行頭文字(箇条書きや段落番号)」をごっそり回収して、外部のテキストファイルにきれいに書き出すという、実務でめちゃくちゃ使えるテクニックを解説します。
ここをクリアすれば、Word文書を「読む」だけでなく「データ化して活用する」という、VBAの本当の楽しさと実用性にグッと近づけますよ。さあ、一緒に扉を開けてみましょう!
—
1. なぜ「行頭文字の抽出」がVBAの登竜門なのか?
Word文書は、人間が目で見て読む分にはとても自由で美しいレイアウトが作れます。しかし、それを「データ」として集計しようとすると、途端に厄介な相手に変貌します。
特に、箇条書き(・)や段落番号(1. 2. 3……)は、見た目は文字のように見えても、実はWordが自動で表示している「書式(お化粧)」であることが多いのです。
「見た目の文字」ではなく「Wordが裏側で管理している箇条書きの記号」をどうやって引っ張り出すか? ここにWord VBAの基礎と本質が詰まっています。
—
2. 全体像を把握しよう(処理の流れ)
今回作成するプログラムの設計図は、こうです。
1. 対象の文書を開く(またはアクティブな文書をターゲットにする)。
2. 文書内のすべての段落を上から順にペロリとめくっていく。
3. 「おっ、この段落は箇条書き(または段落番号)だな?」と判定する。
4. その中身(テキスト)をメモリ(頭の中)に一時的に記憶する。
5. 最後に、パソコンのデスクトップなどに「リスト.txt」というファイルを作って、一気に書き出す。
たったこれだけです。人間がやったら1時間かかる作業も、VBAなら0.5秒で終わります。
—
3. 実装コード(コピペで動く実用マクロ)
それでは、実際に動くコードを見てみましょう。
WordのVBAエディタ(`Alt + F11` で開けます)を表示し、標準モジュールに以下のコードを貼り付けてみてください。
Sub ExportBulletListToText()
Dim doc As Document
Dim para As Paragraph
Dim fso As Object
Dim ts As Object
Dim filePath As String
Dim extractedText As String
Dim count As Long
‘ 1. 処理対象の文書をアクティブ文書に設定
Set doc = ActiveDocument
‘ 2. 保存先のファイルパスを設定(デスクトップに “BulletList.txt” を作成)
filePath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\BulletList.txt”
‘ 3. ファイルシステムオブジェクト(FSO)を使ってテキストファイルを作成・オープン
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 第2引数の「True」は、既存のファイルがあったら上書きするという意味です
Set ts = fso.CreateTextFile(filePath, True)
count = 0
‘ 4. 文書内のすべての段落を上から順番にループ(巡回)する
For Each para In doc.Paragraphs
‘ 【重要】「箇条書き」または「段落番号」が設定されているかをチェック
‘ ListFormat.ListType が wdListNoNumbering 以外であれば、何らかのリスト形式です
If para.Range.ListFormat.ListType <> wdListNoNumbering Then
‘ 行頭の記号や番号を含めたテキストを取得し、改行コードを取り除く
extractedText = Trim(para.Range.Text)
‘ テキストファイルに書き込む
ts.WriteLine extractedText
count = count + 1
End If
Next para
‘ 5. 後片付け(ファイルとメモリを閉じる)
ts.Close
Set ts = Nothing
Set fso = Nothing
‘ 完了メッセージ
If count > 0 Then
MsgBox count & “件のリストを抽出しました!” & vbCrLf & “保存先: ” & filePath, vbInformation, “処理完了”
Else
MsgBox “対象となる箇条書き・段落番号が見つかりませんでした。”, vbExclamation, “お知らせ”
End If
End Sub
—
4. コードの注目ポイントを噛み砕き解説!
初心者のうちは、見慣れない英単語が並んでいるだけでクラッとしてしまいますよね。でも、重要なポイントはたったの3つです。
① `For Each para In doc.Paragraphs` (段落の全なめループ)
Word VBAで最もよく使う鉄板の構文です。「文書(doc)の中にあるすべての段落(Paragraphs)を、先頭から順番に `para` という変数に代入して処理してね」という意味になります。本を1ページずつめくるような感覚です。
② `para.Range.ListFormat.ListType` (ここがプロの技!)
初心者が一番ハマるのが、「ただの段落」と「箇条書きの段落」の見分け方です。
Wordでは、箇条書きの「・」や「1.」は自動付与されていることが多いため、ただ文字を読むだけでは判定できません。そこで `ListFormat.ListType`(リスト形式の種類)というプロパティを使います。「もし番号なし(wdListNoNumbering)ではないなら、それはリストだ!」と判定しているわけです。
③ `FileSystemObject` によるファイルの書き込み
Word VBAから外部のテキストファイル(`.txt`)を操作するとき、昔ながらの `Open` ステートメントを使うよりも、`Scripting.FileSystemObject`(通称FSO)を使う方が現代的でエラーが少ないです。
コード中の `CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)` という部分は、「ユーザーのデスクトップの場所を自動で特定する」というちょっとスマートな技を使っています。これなら、誰のパソコンで実行してもエラーになりません。
—
5. 初心者が陥りやすい「よくあるエラー」と対策
プログラムを動かしたときに、もしかしたらこんな壁にぶつかるかもしれません。
- エラー「オブジェクト変数または With ブロック変数が見つかりません。」
- 原因: 変数の宣言忘れや、`Set` 忘れが原因であることが多いです。コードの冒頭に `Dim` が正しく書かれているか確認しましょう。
- 「実行時エラー:ファイルを開くことができません」
- 原因: すでにデスクトップにある `BulletList.txt` をメモ帳などで開いたままマクロを実行していませんか? ファイルがロックされていると書き込めないので、メモ帳を閉じてから再度実行してください。
- 何も抽出されない
- 原因: Wordの「箇条書き」機能を使わず、手動で「・」や「1.」とキーボードで打っているだけの段落は、VBAからはリストとして認識されません。Word標準の箇条書き・段落番号ボタンで作られた段落であることを確認してください。
—
おわりに:ここをクリアすれば、Word VBAは怖くない!
お疲れ様でした!
今回は、段落の構造を判定し、外部ファイルへデータを吐き出すという、実務に直結するスマートなプログラムを解説しました。
「文書を目で見て手でコピペする」という苦行から解放され、プログラムに仕事をさせる快感を味わっていただけたならエンジニアとしてこれ以上の喜びはありません。
ここをクリアしたあなたなら、表のデータを抽出したり、特定のキーワードを置換したりする応用も、もうすぐ手の届くところにあります。
ぜひ、あなたの業務の自動化にこのコードを役立ててくださいね。それでは、また次の冒険でお会いしましょう!
