こんにちは。業務自動化の世界へようこそ。
Word VBAを触り始めると、誰もが一度は「なぜ図形はこんなにも自由気ままに動き回るのか?」と頭を抱えます。マウスでドラッグすれば済む話に見えて、プログラムで制御しようとした途端、図形は行方不明になり、レイアウトは崩壊する……。
今日は、そんなWord VBAの「ラスボス」的存在である「図形(Shape)のアンカーとRangeの連動」を攻略しましょう。ここさえ理解すれば、あなたはもう「マクロの記録」の奴隷ではありません。
—
1. なぜ図形は「あちこちへ飛んでいく」のか?
Wordの図形には、「アンカー(Anchor)」という概念があります。これは「この図形は、この段落(あるいは文字)に紐付いているよ」という目印です。
初心者がやりがちなミスは、図形を単独で配置しようとすることです。図形は独立した存在ではなく、常にテキストの流れ(Range)の中に居場所を見つけなければなりません。「Range(場所)」を指定し、そこに「Shape(図形)」を固定する。この手順をコードで制御するのが、自動化の第一歩です。
—
2. 魔法のコード:指定した文字列の直後に図形を置く
特定のキーワードを見つけ出し、その直後に星形の図形をピタリと配置するコードを見てみましょう。
Sub InsertShapeAtKeyword()
Dim doc As Document
Dim rng As Range
Dim shp As Shape
Set doc = ActiveDocument
Set rng = doc.Content
‘ 1. 指定した文字列を検索する
With rng.Find
.Text = “ここに図形”
.Execute
End With
‘ 2. 見つかったら、その直後にRangeを移動させる
If rng.Found Then
rng.Collapse Direction:=wdCollapseEnd
‘ 3. アンカーとなるRangeを指定して図形を追加
‘ AddShape(種類, 左位置, 上位置, 幅, 高さ, アンカー)
Set shp = doc.Shapes.AddShape(msoShape5pointStar, _
rng.Information(wdHorizontalPositionRelativeToPage), _
rng.Information(wdVerticalPositionRelativeToPage), _
50, 50, _
Anchor:=rng)
‘ 4. 図形の回り込み設定(これ重要!)
‘ テキストと一緒に流れるように「行内」または「前面」を使い分ける
shp.WrapFormat.Type = wdWrapInline
MsgBox “図形をアンカーに固定しました!”
Else
MsgBox “キーワードが見つかりません。”
End If
End Sub
このコードの「極限のポイント」
- `rng.Collapse`: これが重要です。検索した後のRangeは「キーワード全体」を指していますが、`wdCollapseEnd`を使うことで、「キーワードの直後の点」にRangeを収縮させています。
- `Anchor:=rng`: ここで図形と文書の結びつきを強制的に定義しています。これがないと、図形はページ全体を浮遊する「浮浪者」になってしまいます。
- `wdWrapInline`: これを指定することで、図形は「画像」ではなく「文字の一部」として扱われます。結果、前の文章が増えれば図形も一緒に押し出され、レイアウトが崩れにくくなります。
—
3. 陥りやすい「罠」と対策
現場でよくある失敗パターンを2つだけ紹介します。
罠①:ページをまたぐと座標が狂う
`Left` や `Top` の数値を直接指定(`100, 200` など)すると、ページが変わった瞬間に図形がとんでもない場所へ飛びます。
対策: 可能な限り `wdWrapInline`(行内配置)を使い、Wordの自動レイアウトエンジンに任せてください。どうしても自由に動かしたい場合のみ、`RelativeHorizontalPosition` プロパティを使って「段落」を基準にする設定を入れます。
罠②:Rangeの解放忘れ
複雑なマクロになると、`Set rng = Nothing` を忘れてメモリを圧迫し、Wordが重くなることがあります。VBAはメモリ管理が甘い言語ですので、使い終わったオブジェクトは必ず解放する「後片付けの美学」を身につけましょう。
—
最後に:自動化は「配置」から始まる
図形のアンカーを理解することは、Wordの「ドキュメント構造」を理解することと同意義です。テキストという「流れ」の中に、いかにしてオブジェクトという「点」を打つか。
ここをクリアすれば、あなたはもうWord VBAの初学者ではありません。次は、帳票の動的生成や、差し込み印刷の高度なカスタマイズなど、より深い領域へ進む準備が整いました。
迷ったら、いつでもここへ戻ってきてください。コードは裏切りません。あなたの自動化の旅を、心から応援しています。
