【入門編】【上級者向け】Wordの「段落」に適用された複雑な書式を、別の文書へ完璧にコピーするツール – Word VBA解析バイブル

スポンサーリンク

こんにちは、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を自在に操る「アーキテクト」への道を、確実に歩み始めています。

ぜひ、手元の文書で試してみてください。書式が魔法のように、しかし論理的に移り変わる様子は、見ていてとても心地よいものですよ。

応援しています。次回の講義でお会いしましょう。

タイトルとURLをコピーしました