
VBAを使って、内容証明郵便の字数と行数が規定内に入っているかどうかをチェックするアドインを紹介します。

電子内容証明サービスを利用すれば、文字数の制限を心配する必要がないですよね。

でも、職印が押せないという問題があるので、法律事務所では、一般の内容証明郵便を利用しているところも多いのではないでしょうか。

その場合でも、テンプレートを使えば、字数や行数が制限数内に設定されているので、問題ないと思うのですが...

そうですね。ただし、半角文字をついつい使ってしまって、字数を超えてしまうことがありますから、最終的にマクロで確認したほうが確実だと思います。
サンプルのダウンロード
インストール方法
操作マニュアル
仕様
1. プロジェクト概要
作成されたWord文書が、日本郵便の「内容証明郵便」の規定書式(例:1行20文字以内、1枚26行以内)に適合しているかを自動的に検証するVBAアドイン。
Wordの標準機能(文字数カウント)では判別できない「行ごとの文字数」や「ページごとの行数」を、印刷レイアウトに基づいて厳密にチェックする。また、内容証明では原則禁止されているヘッダー・フッターの自動削除機能も備える。
2. ファイル構成
プロジェクトは以下のモジュールで構成すること。
| モジュール名 | 種類 | 役割 |
| basCheck | 標準モジュール | ドキュメントの解析、文字数・行数チェックのメインロジック |
| Setting | 標準モジュール | 文字数・行数の制限値を管理する定数定義 |
| ThisDocument | ThisDocument | 更新履歴の保持およびドキュメントのエントリポイント |
3. モジュール詳細仕様
(1) Setting(標準モジュール)
定数: strMaxCharsAndLines (Public Const String)
- 機能: チェック基準となる「1行あたりの最大文字数」と「1ページあたりの最大行数」をカンマ区切りの文字列で定義する。
- 設定値:
- デフォルト(横書き):
"20,26"(20文字、26行)。 - ※句読点のぶら下がり処理等を考慮し、実際の郵便規定より余裕を持たせた値を設定可能にする設計とする。
- 他のパターン(例:13文字40行、26文字20行)もコメントアウトで用意しておく。
- デフォルト(横書き):
(2) basCheck(標準モジュール)
プロシージャ: CheckCharsAndLines
- 機能: ドキュメント全体を走査し、規定違反がないかチェックする。
- 処理フロー:
- 開始確認: ユーザーに実行確認のメッセージボックスを表示。
- UI制御: 処理中は
ScreenUpdating = Falseにし、カーソルを砂時計にする。ステータスバーに進捗を表示。 - ヘッダー・フッター削除:
- 内容証明郵便ではページ番号以外のヘッダー・フッター装飾が不適切な場合が多いため、全セクションのヘッダー・フッターを走査し、内容(テキストや図形)が存在すれば削除する。
- 削除を実行した場合は、処理後にメッセージで通知する。
- 設定読み込み:
Settingモジュールの定数をSplitし、上限値を配列に格納。 - ドキュメント解析(重要):
- ビューモード変更: 正確なページレイアウトを取得するため、
ActiveWindow.View.TypeをwdPrintView(印刷レイアウト)に変更する。 - 階層構造の走査:
ActiveWindow.ActivePane.Pages(全ページ)- └
Page.Rectangles(テキスト領域) - └
Rectangle.Lines(物理行)
- エラーハンドリング: Wordのバージョンによっては
Rectanglesアクセス時にバグで例外が発生することがあるため、On Error Resume Nextパターンでスキップ処理を実装する。
- ビューモード変更: 正確なページレイアウトを取得するため、
- 判定ロジック:
- 取得した各行 (
Line.Range.Text) について、後述のGetAdjustedCharCountで有効文字数を算出。 - 文字数オーバー: 制限を超えていれば、その行を選択状態 (
Select) にして警告メッセージを表示し、処理を中断。 - 行数オーバー: 1ページの行数が制限を超えていれば、そのページの先頭を選択状態にして警告メッセージを表示し、処理を中断。
- 取得した各行 (
- 終了処理: 全チェックに合格した場合、完了メッセージを表示。
関数: GetAdjustedCharCount(strTarget As String) As Long
- 機能: 内容証明郵便の慣習に基づき、有効な文字数をカウントする。
- カウントルール:
- 基本は
Len()でカウント。 - 除外対象:
- 全角スペース、半角スペース
- 閉じ括弧
」)(ぶら下がり等で行末文字数に含まれない場合があるため簡易補正) - 制御文字(垂直タブ、改ページ、復帰)
- 加算対象:
- 箇条書き等の段落番号が含まれる行(
Rectangle.Lines(1)かつListFormat.ListStringあり)は、行頭文字分として+1カウントする補正を入れる。
- 箇条書き等の段落番号が含まれる行(
- 基本は
ヘルパー: DeleteAndCheck(rngTarget As Range, blnDeleted As Boolean)
- 機能: 指定されたRange(ヘッダー・フッター)に文字(改行のみ除く)や図形が含まれているか判定し、あれば削除してフラグを立てる。
コールバック: OnBtnCheckCharsAndLines(control As IRibbonControl)
- 機能: リボンUIから呼び出すためのラッパー。
(3) ThisDocument
- メタデータ:
- ツール名:「VA内容証明」
- URL:
https://vba-assets.net/content-certified-mail/ - 著作権:2020-2023 VBA アセット
- 更新履歴:
- 2021/10/3: 新規作成 (Ver100)
- … (中略) …
- 2026/01/24: ヘッダー・フッター自動削除機能追加、リボン対応 (Ver120)
4. 機能要件詳細
- Wordオブジェクトモデルの深い階層の利用:
- 通常の
ActiveDocument.Paragraphs(論理段落)ではなく、ActiveWindow.Panes(1).Pages(物理ページ)を使用すること。これにより、1つの段落が複数行にまたがっている場合でも、見た目通りの「行」としてカウントできる。
- 通常の
- パフォーマンスと安定性:
Rectanglesオブジェクトへのアクセスは重く、不安定な場合があるため、適切なエラーハンドリングとScreenUpdatingの制御を行うこと。- 行の選択処理では、画面のちらつきを抑えるため、判定中は
SelectせずRangeオブジェクトのまま操作し、エラー時のみSelectするリファクタリング済みのロジックを採用すること。
- UI:
- リボンインターフェースから呼び出し可能な設計とする。
- エラー発見時は、ユーザーが即座に修正できるよう、該当箇所を反転表示(Select)して終了すること。


コメント