【入門編】【上級者向け】段落の「書式設定」をJSON形式でシリアライズし、外部システムと連携する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺め、「なんとなく動くけれど、中身が全然わからない……」と悩んでいませんか?

今回は、そんな「マクロの記録の呪縛」を完全に断ち切り、Word VBAを本当に自分の手足として使いこなすための【上級者向け】至高の知見をお届けします。

テーマは「段落の書式設定をJSON形式でシリアライズし、外部システムと連携する」です。
「Wordの段落書式なんて、その文書の中だけのもの」と思っていませんか? いいえ、違います。フォント名、サイズ、行間、インデント、段落前後の間隔……これらをすべてテキスト(JSON)に変換し、外部のデータベースや他システムへ放り投げたり、別の文書へ一瞬で完璧に復元したりする「ポータブルな書式管理エンジン」を一緒に作ってみましょう。

ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達します。温かく、そして深く解説していきますので、ぜひついてきてくださいね!

1. なぜ「書式のJSONシリアライズ」が必要なのか?

実務の現場では、「社内で統一された文書の書式ルールを、Webシステム側で管理したい」「別々のユーザーが作成したWord文書のスタイルを完全に一致させたい」という要望がよく発生します。

しかし、Wordの `ParagraphFormat` や `Font` オブジェクトは、VBAのメモリ上にしか存在しない「生きたオブジェクト」です。これをそのままファイル保存したりネットワーク経由で送ったりすることはできません。

そこで、オブジェクトが持つプロパティの値を抽出し、汎用的なテキスト形式(JSON)に「シリアライズ(直列化)」するというアプローチが必要になります。

[Wordの段落]
↓ (プロパティを抽出)
[VBA Dictionary]
↓ (JSON文字列に変換)
{“FontName”: “メイリオ”, “FontSize”: 11, “LineSpacing”: 18, …}
↓ (外部システムへ送信・保存)

この仕組みを理解すると、Wordと外部システム(Web APIやクラウドストレージなど)の境界線が消え、自動化の可能性が一気に広がります。

2. 開発の全体像と注意すべきポイント

VBAでJSONを扱う際、外部のライブラリ(VBA-JSONなど)を使うのが一般的ですが、今回は外部依存をゼロにするため、VBAの標準機能と自前の文字列結合でJSONを組み立てる、堅牢かつスマートなコードを実装します。

陥りやすいエラー:オブジェクトのライフサイクルとスコープ

Word VBAで最も多いエラーが、`Object variable or With block variable not set (エラー 91)` です。
特に、カーソル(Selection)に依存したコードを書くと、ユーザーが意図しない場所をクリックしただけでマクロが崩壊します。
プロフェッショナルなコードは、`Selection` を一切使わず、明示的なオブジェクト変数(`Paragraph`)を操作します。

3. 実装コード:書式シリアライズ&デシリアライズ・エンジン

以下のコードを、WordのVBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。
このモジュールには、「アクティブな段落の書式をJSON文字列として取得する関数」と、「JSON文字列を別の段落に適用するプロシージャ」が含まれています。

Option Explicit

‘ =================================================================================
‘ 匠のモジュール:段落書式のJSONシリアライザ & デシリアライザ
‘ =================================================================================

Sub 実行デモ_現在の段落書式をJSONにする()
Dim targetPara As Paragraph
Set targetPara = Selection.Paragraphs(1)

‘ 1. 段落書式をJSON文字列にシリアライズ
Dim jsonStr As String
jsonStr = SerializeParagraphFormat(targetPara)

‘ デバッグイミディエイトウィンドウに出力(外部システムに送るイメージ)
Debug.Print “— シリアライズされたJSON —”
Debug.Print jsonStr

MsgBox “段落の書式をJSONに変換しました!イミディエイトウィンドウを確認してください。”, vbInformation, “シリアライズ成功”
End Sub

‘ ——————————————————————————–
‘ [シリアライズ] Paragraphオブジェクトから主要な書式を抽出し、JSON文字列を生成する
‘ ——————————————————————————–
Function SerializeParagraphFormat(para As Paragraph) As String
Dim json As String
Dim f As Font
Dim pf As ParagraphFormat

Set f = para.Range.Font
Set pf = para.ParagraphFormat

‘ 手作業でJSONの構造を美しく組み立てます(エスケープ処理や型に注意)
json = “{” & vbCrLf
json = json & ” “”FontName””: “”” & f.Name & “””,” & vbCrLf
json = json & ” “”FontSize””: ” & f.Size & “,” & vbCrLf
json = json & ” “”FontBold””: ” & IIf(f.Bold = msoTrue, “true”, “false”) & “,” & vbCrLf
json = json & ” “”Alignment””: ” & pf.Alignment & “,” & vbCrLf
json = json & ” “”LineSpacing””: ” & pf.LineSpacing & “,” & vbCrLf
json = json & ” “”SpaceBefore””: ” & pf.SpaceBefore & “,” & vbCrLf
json = json & ” “”SpaceAfter””: ” & pf.SpaceAfter & vbCrLf
json = json & “}”

SerializeParagraphFormat = json
End Function

‘ ——————————————————————————–
‘ [デシリアライズ] JSON風の文字列から値を簡易パースし、別の段落に書式を復元する
‘ ※実務では正規表現やJSONパーサーを組み合わせるとさらに堅牢になります
‘ ——————————————————————————–
Sub ApplyJsonToParagraph(targetPara As Paragraph, jsonStr As String)
On Error GoTo ErrorHandler

‘ 簡易的な値抽出(JSONのキーを元に文字列を切り出すロジック)
Dim fontName As String
Dim fontSize As Single
Dim isBold As Boolean
Dim alignment As Long
Dim lineSpacing As Single
Dim spaceBefore As Single
Dim spaceAfter As Single

fontName = ExtractJsonValue(jsonStr, “FontName”, “string”)
fontSize = Val(ExtractJsonValue(jsonStr, “FontSize”, “number”))
isBold = (ExtractJsonValue(jsonStr, “FontBold”, “boolean”) = “true”)
alignment = CLng(ExtractJsonValue(jsonStr, “Alignment”, “number”))
lineSpacing = Val(ExtractJsonValue(jsonStr, “LineSpacing”, “number”))
spaceBefore = Val(ExtractJsonValue(jsonStr, “SpaceBefore”, “number”))
spaceAfter = Val(ExtractJsonValue(jsonStr, “SpaceAfter”, “number”))

‘ 抽出した書式を対象の段落に適用(一括適用でパフォーマンスを最大化)
With targetPara
.Alignment = alignment
.LineSpacing = lineSpacing
.SpaceBefore = spaceBefore
.SpaceAfter = spaceAfter

With .Range.Font
.Name = fontName
.Size = fontSize
.Bold = IIf(isBold, wdToggle, 0)
End With
End With

Exit Sub

ErrorHandler:
MsgBox “書式の適用中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub

‘ ——————————————————————————–
‘ 補助関数:簡易JSONパーサー(指定したキーの値を取り出す)
‘ ——————————————————————————–
Function ExtractJsonValue(json As String, key As String, valueType As String) As String
Dim p1 As Long, p2 As Long
Dim searchKey As String

searchKey = “””” & key & “””: ”
p1 = InStr(json, searchKey)
If p1 = 0 Then Exit Function

p1 = p1 + Len(searchKey)

‘ 次のカンマ、または改行までを値として切り出す
p2 = InStr(p1, json, “,”)
If p2 = 0 Then
p2 = InStr(p1, json, “}”) ‘ 最後の要素の場合
End If

Dim valStr As String
valStr = Trim(Mid(json, p1, p2 – p1))

‘ 文字列型の場合はダブルクォーテーションを取り除く
If valueType = “string” Then
valStr = Replace(valStr, “”””, “”)
End If

ExtractJsonValue = valStr
End Function

4. コードの解説:ここがプロの技

1. `Selection`の排除とオブジェクト参照
コード内では `Selection` を使わず、`Selection.Paragraphs(1)` から取得した `Paragraph` オブジェクトを直接操作しています。これにより、処理速度が劇的に向上し、意図しないカーソル移動によるバグを防ぎます。
2. 型安全なプロパティ抽出
フォントサイズや行間は数値(`Single` や `Long`)、ボールドは真偽値(`Boolean`)として厳密に扱い、JSONの型ルールに則った文字列を生成しています。
3. 拡張性の高さ
今回作成した `SerializeParagraphFormat` 関数に、文字色(`Font.Color`)やインデント(`LeftIndent`)のプロパティを追加していけば、どれほど複雑な段落書式であっても完全にシリアライズ可能です。

5. さあ、実際に動かしてみよう!

1. Wordを開き、適当な段落に「メイリオ」「サイズ 12pt」「太字」「行間 1.5行」などのリッチな書式を設定します。
2. その段落の中にカーソルを置いた状態で、VBAエディタから `実行デモ_現在の段落書式をJSONにする` を実行(F5キー)します。
3. イミディエイトウィンドウ(Ctrl + G)を見てください。美しいJSONが出力されているはずです!

このJSONをテキストファイルとして保存したり、Web API経由でサーバーに飛ばしたりすることで、「Wordの書式をクラウド管理する」という次世代のドキュメントワークフローが完成します。

おわりに

ここをクリアできれば、もうあなたは単なる「マクロ記録者」ではありません。Wordの内部構造を理解し、外部システムと連携させることができる立派な業務自動化エンジニアです。

日々の面倒な文書整形作業をコードでスマートに解決し、もっとクリエイティブな時間にシフトしていきましょう。それでは、次回の高度な自動化の世界でお会いしましょう!

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