【入門編】【上級者向け】Wordの「段落」の書式設定をJSONで外部管理し、設定変更を容易にする – Word VBA解析バイブル

スポンサーリンク

皆さん、こんにちは!チーフアーキテクトの〇〇です。

Word VBAの世界へようこそ。今日は、ただマクロを記録するだけでは見えてこない、一歩進んだ「プロの技」を皆さんに伝授したいと思います。特に、Word文書の見た目を左右する「段落」の書式設定。これを、もっと柔軟に、もっと賢く管理する方法について深く掘り下げていきます。

今回のテーマは、【上級者向け】Wordの「段落」の書式設定をJSONで外部管理し、設定変更を容易にする、です。

「JSON?」「外部管理?」と聞いて、少し身構えた方もいるかもしれませんね。でも大丈夫。私が皆さんの隣で、基礎から本質まで、一つ一つ丁寧に紐解いていきます。「ここをクリアすれば、Word VBAの基本はバッチリですよ!」というレベルまで、一緒に到達しましょう。

1. なぜ「段落」の書式設定を外部管理する必要があるのか?

Word VBAを使って文書の自動生成や書式設定を行う際、多くの人が最初に経験するのが「マクロの記録」ですよね。それは素晴らしい第一歩です!しかし、その次のステップで直面するのが、ハードコーディングの壁です。

ハードコーディングの落とし穴

例えば、あなたが作成したVBAマクロが、特定の段落のフォントサイズを「12ポイント」、行間を「1.5行」と直接コードの中に書き込んでいるとしましょう。

‘ ▲ ハードコーディングの例 ▲
Sub ApplyParagraphFormat_Hardcoded()
‘ 現在の選択範囲の段落を取得
Dim para As Paragraph
Set para = Selection.Paragraphs(1)

With para
‘ フォント設定
With .Range.Font
.Name = “メイリオ” ‘ フォント名を直接指定
.Size = 12 ‘ フォントサイズを直接指定
.Bold = True ‘ 太字も直接指定
.Color = RGB(0, 0, 128) ‘ 濃い青色も直接指定
End With

‘ 段落設定
.LineSpacingRule = wdLineSpacingMultiple ‘ 行間ルールを直接指定 (複数行)
.LineSpacing = LinesToPoints(1.5) ‘ 1.5行をポイントに変換して直接指定
.FirstLineIndent = InchesToPoints(0.5) ‘ ぶら下げインデントを直接指定
.LeftIndent = InchesToPoints(0.2) ‘ 左インデントを直接指定
.SpaceBefore = 6 ‘ 段落前間隔を直接指定
.SpaceAfter = 6 ‘ 段落後間隔を直接指定
End With

MsgBox “段落の書式を適用しました(ハードコーディング版)。”
End Sub

‘ 行数をポイントに変換するヘルパー関数
Function LinesToPoints(ByVal Lines As Single) As Single
LinesToPoints = Application.LinesToPoints(Lines)
End Function

‘ インチをポイントに変換するヘルパー関数
Function InchesToPoints(ByVal Inches As Single) As Single
InchesToPoints = Application.InchesToPoints(Inches)
End Function

このコードは、確かに動きます。しかし、もし「フォントサイズを12ポイントから11ポイントに変更したい」「行間を1.5行から1.3行に微調整したい」という要求が来たらどうでしょうか?

あなたは、VBAエディタを開き、コードの中の該当箇所を探し、数値を書き換えて、保存し直す…という手間が必要になります。これが1箇所ならまだしも、複数の箇所、複数のマクロで同じ設定が使われていたら?想像するだけで、ゾッとしますよね。

これが「ハードコーディングの課題」であり、変更のたびにコードを修正する必要があるため、保守性が低く、エラーも発生しやすくなるという問題に繋がります。

疎結合な設計へ:JSONによる外部管理のメリット

ここで登場するのが、今回の主役である「JSON(JavaScript Object Notation)による外部管理」です。

JSONは、人間にとっても機械にとっても読み書きしやすい、軽量なデータ交換フォーマットです。これを設定ファイルとしてWord VBAマクロとは別の場所に置いておくことで、以下のようなメリットが得られます。

1. 疎結合(Loose Coupling):

  • コード(VBA)と設定(JSON)が分離されるため、それぞれが独立して管理・変更できるようになります。まるで、家電製品の本体とリモコンのように、切り離して考えられるようになるイメージです。

2. 高い保守性:

  • 書式設定を変更したい場合、VBAコードを修正する必要はありません。JSONファイルをテキストエディタで開いて数値を書き換えるだけでOK。プログラミングの知識がない人でも、設定値の変更が可能になります。

3. 再利用性の向上:

  • 同じJSON設定ファイルを、複数のWordマクロや異なるプロジェクトで使い回すことができます。

4. 設定の見える化と共有:

  • JSONファイルはテキストベースなので、設定内容が一目瞭然です。チーム内で書式設定のルールを共有する際にも便利です。

この図を見てください。ハードコーディングとJSON外部管理の違いが視覚的に理解できるはずです。

+——————-+ +——————-+
| ハードコーディング設計 | | JSON外部管理設計 |
| | | |
| Word VBAマクロ | | Word VBAマクロ |
| +—————+ | | +—————+ |
| | 段落書式設定 | | | | 段落書式適用ロジック | |
| | (フォント名, | | | | (JSONから読み込み) | |
| | サイズ, 行間…) | | | +——-^——-+ |
| +—————+ | | | |
+———|———+ +———|———+
| |
| (変更のたびにコード修正) | (JSONファイル読み込み)
▼ ▼
+——————-+ +——————-+
| Word文書 | | Word文書 |
+——————-+ +——————-+

| (設定値の変更はここだけ!)
+——————-+
| settings.json |
| +—————+ |
| | 段落書式設定 | |
| | (フォント名, | |
| | サイズ, 行間…) | |
| +—————+ |
+——————-+

どうですか?JSONで設定を外部化することのメリットが、少しずつ見えてきたでしょうか。

2. Word VBAでJSONを「読み解く」ための準備

VBAには標準でJSONをパース(解析)する機能がありません。そこで、今回は `MSScriptControl.ScriptControl` というオブジェクトを使って、JavaScriptの力を借りてJSONを扱います。これは参照設定が不要で、実行時に動的にオブジェクトを作成できるため、配布のしやすさも魅力です。

2-1. JSONファイルの準備

まずは、設定を記述するJSONファイルを作成しましょう。今回は例として「見出し1」と「本文」という2種類の段落書式を定義してみます。

お使いのテキストエディタ(メモ帳でもOK)を開き、以下の内容をコピー&ペーストして、`ParagraphSettings.json` という名前で、例えば `C:\WordVBA\` フォルダに保存してください。

{
“Heading1”: {
“FontName”: “メイリオ”,
“FontSize”: 18,
“FontBold”: true,
“FontItalic”: false,
“FontUnderline”: 0,
“FontColorRGB”: “RGB(0, 0, 128)”,
“LineSpacingRule”: 4, // wdLineSpacingExactly (固定値)
“LineSpacing”: 24, // 24pt (wdLineSpacingExactlyの場合に有効)
“FirstLineIndent”: 0, // 0pt
“LeftIndent”: 0, // 0pt
“RightIndent”: 0, // 0pt
“SpaceBefore”: 12, // 12pt
“SpaceAfter”: 12, // 12pt
“Alignment”: 1 // wdAlignParagraphLeft (左寄せ)
},
“BodyText”: {
“FontName”: “游ゴシック”,
“FontSize”: 10.5,
“FontBold”: false,
“FontItalic”: false,
“FontUnderline”: 0,
“FontColorRGB”: “RGB(0, 0, 0)”,
“LineSpacingRule”: 0, // wdLineSpacingSingle (1行)
“LineSpacing”: 0, // wdLineSpacingSingleの場合は無視される
“FirstLineIndent”: 18, // 18pt (0.25インチ程度)
“LeftIndent”: 0, // 0pt
“RightIndent”: 0, // 0pt
“SpaceBefore”: 0, // 0pt
“SpaceAfter”: 6, // 6pt
“Alignment”: 1 // wdAlignParagraphLeft (左寄せ)
}
}

JSONデータの解説:Word VBAのプロパティとのマッピング

  • キー(例: “Heading1”, “BodyText”): 設定の名前です。VBAからこの名前を指定して設定を読み込みます。
  • FontName: フォント名(例: “メイリオ”, “游ゴシック”)
  • FontSize: フォントサイズ(数値)
  • FontBold: 太字にするか(`true` / `false`)
  • FontItalic: 斜体にするか(`true` / `false`)
  • FontUnderline: 下線の種類(`WdUnderline` 列挙体の数値。`0`は下線なし)
  • FontColorRGB: フォントの色をRGB形式で指定(例: “RGB(0, 0, 128)”)。VBA側で `RGB` 関数に渡します。
  • LineSpacingRule: 行間ルール(`WdLineSpacing` 列挙体の数値)。
  • `0`: `wdLineSpacingSingle` (1行)
  • `1`: `wdLineSpacing1pt5` (1.5行)
  • `2`: `wdLineSpacingDouble` (2行)
  • `3`: `wdLineSpacingAtLeast` (最小値)
  • `4`: `wdLineSpacingExactly` (固定値)
  • `5`: `wdLineSpacingMultiple` (倍数)
  • LineSpacing: 行間隔(ポイント単位)。`LineSpacingRule` が `wdLineSpacingExactly` や `wdLineSpacingAtLeast` の場合に有効です。
  • FirstLineIndent: 1行目のインデント(ポイント単位)。正の値で字下げ、負の値でぶら下げ。
  • LeftIndent: 左インデント(ポイント単位)。
  • RightIndent: 右インデント(ポイント単位)。
  • SpaceBefore: 段落前間隔(ポイント単位)。
  • SpaceAfter: 段落後間隔(ポイント単位)。
  • Alignment: 段落の配置(`WdParagraphAlignment` 列挙体の数値)。
  • `0`: `wdAlignParagraphCenter` (中央揃え)
  • `1`: `wdAlignParagraphLeft` (左揃え)
  • `2`: `wdAlignParagraphRight` (右揃え)
  • `3`: `wdAlignParagraphJustify` (両端揃え)

これらの数値やブール値、文字列をJSONで管理することで、Word VBAコードに直接書かずに済みます。

2-2. VBAでJSONファイルを読み込み、パースする関数

それでは、このJSONファイルをVBAで読み込み、内容を解析するコードを書いていきましょう。

Wordを開き、`Alt + F11` でVBAエディタを起動します。
`挿入` -> `標準モジュール` を選択し、以下のコードを貼り付けてください。

‘—————————————————————————————————
‘ モジュール名: modParagraphFormatter
‘ 目的: JSONファイルから段落の書式設定を読み込み、Wordの段落に適用する機能を提供します。
‘ 記述者: チーフアーキテクト
‘—————————————————————————————————

Option Explicit

‘ JSON設定ファイルのパス。環境に合わせて変更してください。
Private Const JSON_FILE_PATH As String = “C:\WordVBA\ParagraphSettings.json”

‘—————————————————————————————————
‘ JSONファイルから設定を読み込み、JavaScriptオブジェクトとして返す関数
‘ 引数:
‘ filePath: JSONファイルのフルパス (String)
‘ 戻り値:
‘ JSONデータがJavaScriptオブジェクトとしてパースされたもの (Object)
‘ エラーが発生した場合は Nothing を返します。
‘—————————————————————————————————
Private Function LoadJsonSettings(ByVal filePath As String) As Object
Dim fso As Object ‘ FileSystemObject を格納する変数
Dim ts As Object ‘ TextStream を格納する変数 (ファイル読み込み用)
Dim jsonText As String ‘ 読み込んだJSON文字列を格納する変数
Dim sc As Object ‘ ScriptControl を格納する変数 (JSONパース用)

‘ エラーハンドリングを開始
On Error GoTo ErrorHandler

‘ FileSystemObject を作成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ JSONファイルが存在するかチェック
If Not fso.FileExists(filePath) Then
MsgBox “エラー: JSONファイルが見つかりません。パスを確認してください。” & vbCrLf & filePath, vbCritical
Set LoadJsonSettings = Nothing ‘ Nothing を返してエラーを示す
GoTo CleanUp
End If

‘ テキストファイルを開き、全内容を読み込む
Set ts = fso.OpenTextFile(filePath, 1) ‘ 1はForReading (読み込みモード)
jsonText = ts.ReadAll
ts.Close

‘ ScriptControl を作成し、JSON文字列をJavaScriptオブジェクトとして評価
‘ これにより、VBAでJSONデータのプロパティにアクセスできるようになります。
Set sc = CreateObject(“MSScriptControl.ScriptControl”)
sc.Language = “JScript” ‘ JScript (JavaScript) を使用することを指定

‘ JSON文字列を評価し、JavaScriptオブジェクトとして取得
‘ Evalの引数は括弧で囲む必要があります。これはJavaScriptのオブジェクトリテラルを評価する際の慣習です。
Set LoadJsonSettings = sc.Eval(“(” & jsonText & “)”)

CleanUp:
‘ 使用したオブジェクトを解放し、メモリリークを防ぎます。
‘ これはCOMオブジェクトを扱う上で非常に重要な習慣です。
If Not ts Is Nothing Then Set ts = Nothing
If Not fso Is Nothing Then Set fso = Nothing
If Not sc Is Nothing Then Set sc = Nothing
Exit Function

ErrorHandler:
MsgBox “JSONファイルの読み込みまたはパース中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical
Set LoadJsonSettings = Nothing ‘ エラー時は Nothing を返す
Resume CleanUp ‘ クリーンアップ処理へ進む
End Function

‘—————————————————————————————————
‘ RGB文字列 (例: “RGB(255, 0, 0)”) からVBAのRGBカラー値に変換するヘルパー関数
‘ 引数:
‘ rgbString: “RGB(R, G, B)” 形式の文字列 (String)
‘ 戻り値:
‘ VBAのRGBカラー値 (Long)
‘—————————————————————————————————
Private Function ParseRgbString(ByVal rgbString As String) As Long
Dim parts As Variant
Dim r As Long, g As Long, b As Long

‘ “RGB(” と “)” を取り除く
rgbString = Replace(rgbString, “RGB(“, “”)
rgbString = Replace(rgbString, “)”, “”)

‘ カンマで分割
parts = Split(rgbString, “,”)

If UBound(parts) = 2 Then
r = Trim(parts(0))
g = Trim(parts(1))
b = Trim(parts(2))
ParseRgbString = RGB(r, g, b)
Else
ParseRgbString = RGB(0, 0, 0) ‘ 不正な形式の場合は黒を返す
End If
End Function

‘—————————————————————————————————
‘ 指定された段落にJSONから読み込んだ書式設定を適用するメインプロシージャ
‘ 引数:
‘ targetParagraph: 書式を適用する段落オブジェクト (Paragraph)
‘ settingName: JSONファイル内で定義された設定の名前 (例: “Heading1”, “BodyText”) (String)
‘—————————————————————————————————
Public Sub ApplyParagraphFormatFromJson(ByVal targetParagraph As Paragraph, ByVal settingName As String)
Dim jsonSettings As Object ‘ JSONファイル全体の設定オブジェクト
Dim paragraphSetting As Object ‘ 特定の段落設定 (例: “Heading1” の設定)
Dim colorValue As Long ‘ RGBカラー値を格納する変数

‘ まずはJSON設定ファイルを読み込む
Set jsonSettings = LoadJsonSettings(JSON_FILE_PATH)

If jsonSettings Is Nothing Then
MsgBox “設定ファイルの読み込みに失敗しました。処理を中断します。”, vbCritical
Exit Sub
End If

‘ 指定された設定名で段落設定を取得
‘ ScriptControlでパースされたオブジェクトは、プロパティとして直接アクセスできます。
Set paragraphSetting = jsonSettings.item(settingName) ‘ .item(key) または .key でアクセス

If paragraphSetting Is Nothing Then
MsgBox “エラー: JSONファイルに「” & settingName & “」という設定が見つかりません。”, vbCritical
GoTo CleanUp
End If

‘ パフォーマンス向上のため、ScreenUpdatingを無効にします。
‘ これにより、画面描画の更新が一時的に停止され、処理速度が向上します。
Application.ScreenUpdating = False

‘ Withステートメントでコードの可読性を高め、オブジェクトへの複数アクセスを効率化します。
With targetParagraph
‘ ★ フォント設定の適用 ★
With .Range.Font
‘ JSONから値を取得し、存在すれば適用。存在しない場合は現在の値を維持。
If Not IsEmpty(paragraphSetting.FontName) Then .Name = paragraphSetting.FontName
If Not IsEmpty(paragraphSetting.FontSize) Then .Size = paragraphSetting.FontSize
If Not IsEmpty(paragraphSetting.FontBold) Then .Bold = paragraphSetting.FontBold
If Not IsEmpty(paragraphSetting.FontItalic) Then .Italic = paragraphSetting.FontItalic
If Not IsEmpty(paragraphSetting.FontUnderline) Then .Underline = paragraphSetting.FontUnderline

‘ RGBカラーは文字列で取得し、ParseRgbString関数で変換
If Not IsEmpty(paragraphSetting.FontColorRGB) Then
colorValue = ParseRgbString(paragraphSetting.FontColorRGB)
.Color = colorValue
End If
End With

‘ ★ 段落設定の適用 ★
If Not IsEmpty(paragraphSetting.LineSpacingRule) Then .LineSpacingRule = paragraphSetting.LineSpacingRule
If Not IsEmpty(paragraphSetting.LineSpacing) Then .LineSpacing = paragraphSetting.LineSpacing
If Not IsEmpty(paragraphSetting.FirstLineIndent) Then .FirstLineIndent = paragraphSetting.FirstLineIndent
If Not IsEmpty(paragraphSetting.LeftIndent) Then .LeftIndent = paragraphSetting.LeftIndent
If Not IsEmpty(paragraphSetting.RightIndent) Then .RightIndent = paragraphSetting.RightIndent
If Not IsEmpty(paragraphSetting.SpaceBefore) Then .SpaceBefore = paragraphSetting.SpaceBefore
If Not IsEmpty(paragraphSetting.SpaceAfter) Then .SpaceAfter = paragraphSetting.SpaceAfter
If Not IsEmpty(paragraphSetting.Alignment) Then .Alignment = paragraphSetting.Alignment
End With

‘ 処理が完了したらScreenUpdatingを元に戻します。
Application.ScreenUpdating = True

MsgBox “‘” & settingName & “‘ の書式を適用しました。”, vbInformation

CleanUp:
‘ オブジェクトの解放は非常に重要です。
‘ 特にScriptControlのようなCOMオブジェクトは、適切に解放しないとメモリリークの原因になることがあります。
If Not jsonSettings Is Nothing Then Set jsonSettings = Nothing
If Not paragraphSetting Is Nothing Then Set paragraphSetting = Nothing
End Sub

‘—————————————————————————————————
‘ テスト用プロシージャ: 現在の選択範囲の段落に「Heading1」の書式を適用します
‘—————————————————————————————————
Public Sub Test_ApplyHeading1Format()
‘ ドキュメントの選択範囲に段落があるか確認
If Selection.Paragraphs.Count >= 1 Then
‘ 選択範囲の最初の段落に書式を適用
Call ApplyParagraphFormatFromJson(Selection.Paragraphs(1), “Heading1”)
Else
MsgBox “段落が選択されていません。書式を適用する段落を選択してください。”, vbExclamation
End If
End Sub

‘—————————————————————————————————
‘ テスト用プロシージャ: 現在の選択範囲の段落に「BodyText」の書式を適用します
‘—————————————————————————————————
Public Sub Test_ApplyBodyTextFormat()
If Selection.Paragraphs.Count >= 1 Then
Call ApplyParagraphFormatFromJson(Selection.Paragraphs(1), “BodyText”)
Else
MsgBox “段落が選択されていません。書式を適用する段落を選択してください。”, vbExclamation
End If
End Sub

コードの主要部分解説

1. `LoadJsonSettings(filePath As String) As Object`:

  • この関数は、指定されたパスのJSONファイルを読み込み、その内容をJavaScriptオブジェクトとして返します。
  • `CreateObject(“Scripting.FileSystemObject”)` でファイルシステムを操作するオブジェクトを作成します。これでファイルの存在チェックや読み込みを行います。
  • `CreateObject(“MSScriptControl.ScriptControl”)` で `ScriptControl` オブジェクトを作成します。これがVBAでJavaScriptを実行するための橋渡しとなります。
  • `sc.Language = “JScript”` で、JavaScript(JScript)を使用することを宣言します。
  • `sc.Eval(“(” & jsonText & “)”)` が肝です。読み込んだJSON文字列をJavaScriptとして評価し、Word VBAからアクセスできるオブジェクトとして返します。JSON文字列を括弧で囲むのは、JavaScriptのオブジェクトリテラルを評価する際の一般的なテクニックです。
  • `On Error GoTo ErrorHandler` でエラーハンドリングを行い、ファイルが見つからない場合やJSON形式が不正な場合に対応しています。
  • オブジェクトの解放: `Set fso = Nothing`, `Set ts = Nothing`, `Set sc = Nothing` は非常に重要です。COMオブジェクト(`FileSystemObject`, `ScriptControl` など)を使用した場合、使い終わったら必ず `Nothing` を代入してメモリから解放する習慣をつけましょう。これを怠ると、メモリリークや予期せぬエラーの原因になることがあります。

2. `ParseRgbString(rgbString As String) As Long`:

  • JSONで定義した `”RGB(R, G, B)”` という文字列形式のカラーコードを、VBAの `RGB(R, G, B)` 関数が認識できる `Long` 型の数値に変換するヘルパー関数です。

3. `ApplyParagraphFormatFromJson(targetParagraph As Paragraph, settingName As String)`:

  • このプロシージャが、JSONから読み込んだ設定を実際のWordの段落に適用する主たるロジックです。
  • `jsonSettings.item(settingName)` を使って、JSONオブジェクトから指定された `settingName`(例: “Heading1″)に対応する設定オブジェクトを取得します。
  • `Application.ScreenUpdating = False`: 多くの書式設定を一度に行う場合、この設定を入れておくと処理速度が格段に向上します。画面の再描画が一時的に抑制されるためです。処理の最後に必ず `True` に戻しましょう。
  • `With targetParagraph`: `With` ステートメントを使うことで、同じオブジェクトのプロパティに続けてアクセスする際にコードが簡潔になり、可読性が向上します。
  • `If Not IsEmpty(paragraphSetting.FontName) Then …`: JSONファイルに特定のプロパティが存在しない可能性も考慮し、`IsEmpty` でチェックしています。これにより、JSONファイルで一部のプロパティを省略した場合でもエラーにならず、既存の書式が維持される柔軟性が生まれます。
  • フォント設定と段落設定の適用: `Paragraph` オブジェクトの `Range.Font` プロパティや、`Paragraph` オブジェクト自身のプロパティに、JSONから読み込んだ値をマッピングしていきます。`WdLineSpacing` や `WdParagraphAlignment` といったWordの列挙体は、JSONでは数値で指定していますので、VBA側でそのまま適用できます。

4. `Test_ApplyHeading1Format()` / `Test_ApplyBodyTextFormat()`:

  • これらのプロシージャは、実際に作成した機能をテストするためのものです。Word文書上で対象の段落を選択し、これらのマクロを実行してみてください。

3. 実践!JSONで段落書式を適用してみよう

いよいよ、作成したマクロを実行してみましょう!

1. Word文書の準備:

  • 新しいWord文書を開くか、既存の文書で試したい箇所にサンプルテキストを入力します。
  • 例:

これは見出しのテキストです。
ここに本文のテキストが入ります。
別の本文のテキストです。

2. マクロの実行:

  • Word文書上で、「これは見出しのテキストです。」 の段落を選択します。(段落内にカーソルを置くだけでもOKです)
  • `Alt + F8` を押して「マクロ」ダイアログを開き、`Test_ApplyHeading1Format` を選択して `実行` ボタンをクリックします。
  • すると、選択した段落がJSONで定義した「Heading1」の書式(メイリオ18pt、濃い青色、固定行間など)に変わるはずです。
  • 次に、「ここに本文のテキストが入ります。」 の段落を選択します。
  • `Alt + F8` で `Test_ApplyBodyTextFormat` を選択して `実行` ボタンをクリックします。
  • 選択した段落がJSONで定義した「BodyText」の書式(游ゴシック10.5pt、ぶら下げインデントなど)に変わるはずです。

設定変更の容易さを体感してみよう!

さあ、ここでJSON外部管理の真価を体験しましょう。

1. 先ほど保存した `C:\WordVBA\ParagraphSettings.json` ファイルをテキストエディタで開きます。
2. 例えば、`”Heading1″` の `”FontSize”` を `18` から `22` に、`”FontColorRGB”` を `”RGB(0, 0, 128)”` から `”RGB(128, 0, 0)”` (濃い赤色)に変更して保存してください。

“Heading1”: {
“FontName”: “メイリオ”,
“FontSize”: 22, <-- ここを変更 "FontBold": true, "FontItalic": false, "FontUnderline": 0, "FontColorRGB": "RGB(128, 0, 0)", <-- ここを変更 "LineSpacingRule": 4, "LineSpacing": 24, "FirstLineIndent": 0, "LeftIndent": 0, "RightIndent": 0, "SpaceBefore": 12, "SpaceAfter": 12, "Alignment": 1 }, // ... 後略 3. Wordに戻り、先ほど「Heading1」を適用した段落を再度選択します。 4. `Alt + F8` で `Test_ApplyHeading1Format` を再度実行します。 どうでしょう?VBAコードを一切修正することなく、JSONファイルを変更しただけで、書式が更新されましたよね!これが、疎結合設計の強力なメリットです。

4. チーフアーキテクトが語る「極限の知見」と更なる高みへ

ここまでで、JSONを使った段落書式の外部管理の基本と実用はマスターできました。しかし、真の業務自動化エンジニアを目指す皆さんには、さらに踏み込んだ知識と視点をお伝えしたい。

4-1. オブジェクトのライフサイクルとパフォーマンスの重み

Word VBAに限らず、COMオブジェクトを扱うプログラミングでは、オブジェクトのライフサイクル管理が非常に重要です。

  • `Set obj = Nothing` の徹底: `CreateObject` や `Set obj = SomeObject` で作成・参照したオブジェクトは、使い終わったら必ず `Set obj = Nothing` で解放してください。特に `Scripting.FileSystemObject` や `MSScriptControl.ScriptControl` のような外部COMコンポーネントは、解放を怠るとメモリリークやWordアプリケーションの不安定化を招く可能性があります。
  • `With` ステートメントの活用: 今回のコードでも使いましたが、`With` ステートメントは、同じオブジェクトのプロパティやメソッドに繰り返しアクセスする際に、コードの可読性を高めるだけでなく、わずかながらパフォーマンス向上にも寄与します。

また、大規模な文書や大量の段落に書式を適用する場合、パフォーマンスは常に意識すべき点です。

  • `Application.ScreenUpdating = False`: これは非常に効果的なパフォーマンスチューニングです。画面の描画処理を一時的に停止することで、VBAの実行速度を劇的に向上させます。必ず処理の前後で `False` と `True` を設定しましょう。
  • `Application.EnableEvents = False`: 必要であれば、イベントハンドラが余計な処理をしないように、一時的にイベントを無効にするのも手です。
  • Undoスタックの管理: 大量の変更を一括で行う場合、WordのUndoスタックに全て記録されるとメモリを圧迫することがあります。`Application.UndoRecord.StartCustomRecord` と `EndCustomRecord` を使うことで、一連の変更を一つの元に戻す操作としてまとめることができます。

4-2. Wordの「スタイル」との連携という最終形態

今回の方法では、JSONで指定した書式を直接段落に適用しました。これは柔軟性が高い反面、Wordが本来持つ強力な機能である「スタイル」を活用できていません。

プロのWord VBA開発者であれば、最終的にはJSONで直接書式を当てるのではなく、JSONで「Wordの既存スタイル名」を指定し、そのスタイルを段落に適用するという設計を検討すべきです。

例えば、JSONに以下のように定義します。

{
“Heading1”: {
“StyleName”: “見出し 1”
},
“BodyText”: {
“StyleName”: “標準”
}
}

そしてVBA側では、

If Not IsEmpty(paragraphSetting.StyleName) Then
.Style = paragraphSetting.StyleName
End If

このようにすることで、VBAマクロは「どのスタイルを適用するか」だけをJSONから受け取り、実際の書式定義はWord文書のスタイルギャラリーに任せることができます。これにより、Wordの強力なスタイル管理機能と、VBAの自動化能力を最大限に引き出す、まさに「ハイブリッドな自動化」が実現できます。

JSONで直接書式を設定する方法は、スタイルが定義されていない、あるいは特定の箇所に一時的なオーバーライドを適用したい場合に有効な手段です。しかし、文書全体の整合性を保ち、長期的な保守を考えるならば、Wordのスタイル機能を最大限に活用する道も模索してみてください。

4-3. さらに高度なJSON処理へ

今回 `MSScriptControl.ScriptControl` を使いましたが、これはシンプルなJSON構造を扱うには非常に便利です。しかし、より複雑なネスト構造を持つJSONや、厳密なバリデーションが必要な場合は、専門のJSONパーサーライブラリの導入も検討してみてください。

VBA向けのJSONパーサーライブラリとして有名なものに「VBA-JSON」などがあります。これらを導入すれば、より堅牢で高機能なJSON処理が可能になります。これは、将来的に皆さんがさらに大きなシステムを構築する際の、強力な武器となるでしょう。

5. まとめ:Word VBAの「基本」と「本質」を掴む

いかがでしたでしょうか?

今回は、Word VBAで「段落」の書式設定をJSONファイルで外部管理するという、一見高度に見えるテーマを扱いました。しかし、その根底にあるのは、「コードと設定を分離し、保守性と柔軟性を高める」 というプログラミングの基本的な思想です。

  • ハードコーディングの課題を理解し、なぜ疎結合な設計が必要なのかを学びました。
  • JSONファイルで書式設定を定義し、Word VBAからそれを読み込む方法を実践しました。
  • `MSScriptControl.ScriptControl` を使ってVBAでJSONをパースする具体的な手法を習得しました。
  • オブジェクトのライフサイクル管理やパフォーマンスチューニング、そしてWordの「スタイル」機能との連携という、チーフアーキテクトならではの「極限の知見」にも触れました。

Word VBAは、単なる定型作業の自動化ツールに留まらない、奥深い世界を持っています。今日学んだ知識は、皆さんがWord VBAを「使いこなす」だけでなく、「コントロールする」ための強力な第一歩となるはずです。

この知識を土台として、皆さんの業務自動化スキルが飛躍的に向上することを願っています。
次回は、さらに一歩進んだテーマでお会いしましょう!

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