こんにちは、Word VBAの深淵へようこそ。私はあなたのガイドを務めるチーフアーキテクトです。
普段、Wordのマクロを書くときに「マクロの記録」を使って、`Selection.Copy` と `Selection.Paste` を繰り返してはいませんか? もちろん、それは最初の一歩としては正解です。しかし、プロの領域――つまり「どんな環境でも崩れない、堅牢な自動化」を目指すなら、クリップボードという不安定な場所に頼る手法からは卒業する必要があります。
今日は、「ある文書の段落書式を、別の文書へ寸分違わず移植する」という、一見シンプルでいて非常に奥が深いテーマを深掘りしましょう。インデント、行間、タブ位置、そして厄介な「枠線」や「網掛け」まで。これらを「オブジェクト」として制御する術を身につければ、Word VBAの基本はバッチリですよ。
—
1. なぜ「コピペ」ではいけないのか?
「コピー&ペーストでいいじゃないか」と思うかもしれません。しかし、実務では以下の問題が立ちはだかります。
1. スタイルの競合: コピー先の文書に同名のスタイル(「標準」など)があると、貼り付けた瞬間にその文書の定義に上書きされてしまう。
2. クリップボードの汚染: ユーザーが他の作業をしている最中にマクロを動かすと、コピー内容が衝突してエラーになります。
3. パフォーマンス: 大量の段落を処理する場合、クリップボード経由は非常に低速です。
私たちが目指すのは、「書式の遺伝子(プロパティ)を直接抽出して、対象に流し込む」という手法です。
—
2. 段落を形作る「DNA」の正体
Wordの段落書式は、主に `ParagraphFormat` オブジェクトに集約されています。しかし、ここには落とし穴があります。`ParagraphFormat` を丸ごと代入(`Set dest.Format = src.Format`)することはできません。一つひとつのプロパティを丁寧に手渡していく必要があります。
特に重要な要素は以下の4つです。
- 基本配置: インデント、行間、整列。
- タブ位置: `TabStops` コレクション。
- 枠線: `Borders` コレクション。
- 網掛け: `Shading` オブジェクト。
これらを完璧にコピーするコードを見てみましょう。
—
3. 実装:プロフェッショナル・フォーマット・トランスファー
以下のコードは、ソース文書(コピー元)の特定の段落から、ターゲット文書(コピー先)の段落へ、すべての主要な書式を移植するプロシージャです。
”’
”’
”’ コピー元のParagraphオブジェクト
”’ コピー先のParagraphオブジェクト
Sub CloneParagraphFormatting(ByRef sourcePara As Paragraph, ByRef targetPara As Paragraph)
Dim srcFormat As ParagraphFormat: Set srcFormat = sourcePara.Format
Dim tgtFormat As ParagraphFormat: Set tgtFormat = targetPara.Format
‘ — 1. 基本的な段落配置のコピー —
With tgtFormat
.Alignment = srcFormat.Alignment
.LeftIndent = srcFormat.LeftIndent
.RightIndent = srcFormat.RightIndent
.SpaceBefore = srcFormat.SpaceBefore
.SpaceAfter = srcFormat.SpaceAfter
.LineSpacingRule = srcFormat.LineSpacingRule
.LineSpacing = srcFormat.LineSpacing
.FirstLineIndent = srcFormat.FirstLineIndent
.KeepWithNext = srcFormat.KeepWithNext
.KeepTogether = srcFormat.KeepTogether
‘ 網掛け(Shading)のコピー
.Shading.BackgroundPatternColor = srcFormat.Shading.BackgroundPatternColor
.Shading.ForegroundPatternColor = srcFormat.Shading.ForegroundPatternColor
.Shading.Texture = srcFormat.Shading.Texture
End With
‘ — 2. タブ位置(TabStops)の複製 —
‘ タブはコレクションなので、一度クリアしてから一つずつ追加します
tgtFormat.TabStops.ClearAll
Dim ts As TabStop
For Each ts In srcFormat.TabStops
tgtFormat.TabStops.Add _
Position:=ts.Position, _
Alignment:=ts.Alignment, _
Leader:=ts.Leader
Next ts
‘ — 3. 枠線(Borders)の複製 —
‘ 枠線は上下左右など複数の箇所があるため、ループで回します
Dim i As Long
For i = -1 To -6 Step -1 ‘ wdBorderTop, Bottom, Left, Right, Vertical, Horizontal
‘ 枠線が存在する場合のみ処理(エラー回避)
On Error Resume Next
With tgtFormat.Borders(i)
.LineStyle = srcFormat.Borders(i).LineStyle
.LineWidth = srcFormat.Borders(i).LineWidth
.Color = srcFormat.Borders(i).Color
End With
On Error GoTo 0
Next i
‘ — 4. フォント情報のコピー (必要に応じて) —
‘ 段落全体に適用されているフォント情報をコピーします
targetPara.Range.Font = sourcePara.Range.Font
End Sub
呼び出し方の例
Sub ExecuteTransfer()
Dim docSrc As Document: Set docSrc = Documents(“Source.docx”)
Dim docTgt As Document: Set docTgt = Documents(“Target.docx”)
‘ 元文書の第1段落を、先文書の第2段落に反映
CloneParagraphFormatting docSrc.Paragraphs(1), docTgt.Paragraphs(2)
MsgBox “書式の移植が完了しました!”, vbInformation
End Sub
—
4. 知る人ぞ知る、実装のポイントと罠
このコードには、私が長年の現場経験で得た「知恵」を詰め込んでいます。
① タブ位置のクリア(`ClearAll`)
ターゲットとなる段落に元々設定されていたタブ位置が残っていると、コピーしたタブと混ざってしまい、レイアウトが崩れます。必ず `ClearAll` で更地にしてから、新しいタブを配置するのが鉄則です。
② エラーハンドリング(`On Error Resume Next`)
枠線(Borders)の処理で使っています。Wordの段落には、状況によって「アクセスできない境界線」が存在することがあります。一つひとつチェックするとコードが肥大化するため、ここでは意図的にエラーをスキップさせ、設定可能な境界線のみを確実に処理しています。
③ フォント情報の扱い
`ParagraphFormat` にはフォント(文字サイズや色)は含まれません。そのため、最後に `targetPara.Range.Font = sourcePara.Range.Font` を加えています。これにより、段落全体の「見た目」を完全に一致させることができます。
—
5. 最後に:マクロの記録を卒業したあなたへ
いかがでしたでしょうか。
「コピーして貼り付ける」という動作を、VBAの世界ではこれほどまでに細かく分解して制御できるのです。
最初は「プロパティを一つずつ書くなんて面倒だ」と思うかもしれません。しかし、この手法を一度マスターすれば、「特定の条件(例えば特定の単語が含まれる段落)の時だけ、この複雑な書式を適用する」といった高度な処理が、自由自在に、そして超高速に実行できるようになります。
オブジェクトのプロパティを一つひとつ紐解く作業は、Wordというアプリケーションの設計思想を理解する旅でもあります。ここをクリアできれば、あなたはもう初心者ではありません。Word VBAを自在に操る「アーキテクト」への道を、確実に歩み始めています。
ぜひ、手元の文書で試してみてください。書式が魔法のように、しかし論理的に移り変わる様子は、見ていてとても心地よいものですよ。
応援しています。次回の講義でお会いしましょう。
