こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押してコードを眺めてみたものの、「なんだこの呪文書は…」「思ったところで動いてくれない…」と挫折しかけていませんか?
大丈夫、安心してください。今日あなたにご紹介するのは、Word VBAの心臓部とも言える「Findオブジェクトの挙動の真髄」と、実務でめちゃくちゃ使える「特定のキーワードの直後に画像を爆速で挿入する自動化ツール」の作り方です。
ここをクリアすれば、あなたはもう「マクロの記録者」から「Word自動化エンジニア」へとステップアップできますよ。それでは、知的でエキサイティングなVBAの旅に出発しましょう!
—
なぜ「検索して画像を挿入する」でみんな躓くのか?
実務でこんな要望はありませんか?
- 「ドキュメント内の `[社印]` という文字を見つけたら、そこに社判の画像をポンと挿入したい」
- 「商品名の後ろに、対応する製品画像を自動で差し込みたい」
これを手動でやると、検索して、マウスを右クリックして、画像を選んで…と発狂しそうな作業ですよね。だからVBAで自動化したいわけです。
しかし、初心者がやりがちなのが、`Selection`(選択範囲)を画面上でカチカチ動かして処理するコードです。
画面がチラつき、処理が遅く、予期せぬ場所を選択してエラーが起きる――。これが「動かないVBA」の典型例です。
私たちが目指すべきは、画面を一切動かさず、メモリ上で高速に文字列を捉え、その瞬間に差し込む「プロの作法」です。
—
秘伝の技:`Find.Range.Collapse` の正体
Wordの検索機能(`Find`)は、文字を見つけると「その単語全体を選択状態(Range)」にします。
ここでイメージしてください。
`[社印]` という文字を検索した場合、Wordの内部カーソルは `[` の直前から `]` の直後までをガッチリと掴んでいます。この状態で画像を挿入しようとすると、`[社印]` という文字そのものが画像に上書きされて消えてしまうのです。文字を残したまま、その「直後」に画像を置きたいのに!
ここで登場するのが、今回の主役である`Collapse`(折りたたみ)メソッドです。
.Find.Execute
‘ 見つかった瞬間のRangeを、末尾側に「ペチャンコ」に折りたたむ!
.Collapse Direction:=wdCollapseEnd
- `wdCollapseStart`:見つかった文字列の「直前」にカーソルを折りたたむ
- `wdCollapseEnd`:見つかった文字列の「直後」にカーソルを折りたたむ
この「ペチャンコにする」という感覚を掴むだけで、Word VBAの文字列操作の9割は制覇したも同然です。文字を消さずに、その一歩先を狙い撃ちできる。これがプロの技術です。
—
【実践】特定の文字の直後に画像を挿入するマクロ
お待たせしました。実際の現場でそのままコピペして使える、洗練された実用コードをプレゼントします。
デスクトップ等にテスト用の画像(例: `sample.png`)を用意し、Wordファイル内の適当な場所に `[INSERT_IMG]` と書き込んで試してみてください。
Sub InsertImageAfterKeyword()
Dim rngTarget As Range
Dim imagePath As String
‘ 1. 挿入したい画像のフルパスを指定してください(環境に合わせて変更)
imagePath = “C:\Users\YourUserName\Desktop\sample.png”
‘ 2. ファイルが存在するかどうかの安全チェック
If Dir(imagePath) = “” Then
MsgBox “指定されたパスに画像が見つかりません。” & vbCrLf & imagePath, vbCritical, “エラー”
Exit Sub
End If
‘ 3. 文書全体を対象とするRangeオブジェクトを作成
Set rngTarget = ActiveDocument.Content
‘ 4. 検索条件の設定(Withブロックでスマートに記述)
With rngTarget.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = “[INSERT_IMG]” ‘ 検索するキーワード
.Forward = True
.Wrap = wdFindStop
.MatchWholeWord = True
‘ 5. ループ処理で文書内の該当箇所をすべて網羅する
Do While .Execute
‘ ★ここが核心!見つかった文字列の「直後」に範囲を折りたたむ
rngTarget.Collapse Direction:=wdCollapseEnd
‘ 6. 折りたたんだその場所に画像を挿入
‘ LinkToFile:=False (画像ファイルを文書内に埋め込む)
‘ SaveWithDocument:=True (文書と一緒に保存する)
ActiveDocument.InlineShapes.AddPicture _
FileName:=imagePath, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Range:=rngTarget
‘ 7. 画像を挿入したことでRangeが伸びてしまうのを防ぎ、
‘ 次の検索を「挿入した画像のさらに後ろ」から再開させるための再定義
rngTarget.Collapse Direction:=wdCollapseEnd
rngTarget.End = ActiveDocument.Content.End
Loop
End With
MsgBox “画像の挿入が完了しました!”, vbInformation, “完了”
End Sub
—
コードのここがポイント!
1. `ActiveDocument.Content` の活用
画面上の選択範囲(`Selection`)を一切使わず、ドキュメントの全域を示す `Range` を使っています。これにより、爆速かつ画面のチラつきゼロで処理が走ります。
2. 無限ループを防ぐ `wdFindStop` と再定義
`Do While .Execute` の中で画像を挿入すると、Wordの検索位置が狂ってしまい、同じ場所を無限に検索し続ける(またはエラーになる)バグが起きがちです。ループの最後で `rngTarget.End = ActiveDocument.Content.End` と再定義することで、「これより先を次から探す!」と確実に前進させています。
3. 画像のインライン埋め込み
`InlineShapes.AddPicture` を使うことで、画像が文字と同じ扱い(段落内)として綺麗に配置されます。さらに `LinkToFile:=False` にすることで、別PCにWordファイルを送っても「画像が表示されない!」という悲劇を防げます。
—
陥りやすいエラーと回避の知見
Q1. 「コンパイルエラー: ユーザー定義型が定義されていません」が出ます
A. 大丈夫、落ち着いてください。これはVBAの参照設定や、コードのスペルミスでよく起きます。特に `wdCollapseEnd` などの「定数」がうまく認識されていない可能性がありますが、Word VBAであれば通常デフォルトで認識されます。タイポ(打ち間違い)がないか確認してください。
Q2. 画像が大きすぎて、レイアウトが崩れます
A. `AddPicture` で挿入した直後の `InlineShape` オブジェクトを変数に受けると、VBAからサイズの調整(幅や高さの指定)が可能です。
こう書き換えてみましょう:
Dim img As InlineShape
Set img = ActiveDocument.InlineShapes.AddPicture(FileName:=imagePath, Range:=rngTarget)
‘ 幅を 50mm に固定する(ミリ換算:CentimetersToPoints)
img.Width = CentimetersToPoints(5)
これを知っておくと、レイアウト崩れに怯える必要がなくなります。
—
まとめ:あなたのWord VBAは、もう中級者の領域へ
今回は「特定の文字列を検索し、その直後に画像を挿入する」というテーマを通じて、以下の極意を学びました。
- `Selection` ではなく `Range` を使って裏側で処理する美学
- `Collapse` メソッドで検索位置を「直前・直後」にコントロールする技術
- 無限ループを回避し、実務に耐えうる堅牢なコードの組み立て方
ここをクリアしたあなたなら、業務効率化のアイデアを次々とVBAの形に落とし込めるはずです。
「面倒な単純作業は、すべてコードに片付けさせる」。その爽快感を味わいながら、ぜひ日々の業務をハックしてくださいね。
それでは、次回の高度なVBA解説でお会いしましょう!
