VA疑似アウトライン:見出しをマークダウンや疑似アウトラインに変換(ワードVBA)

サンプル

他の人からもらったワードファイルは、ワードの機能を使わずに、手作業で書式を設定しているものが多くて、修正するのが大変です。

そうですよね。「VA公用文」などのマクロを使った書式設定になれると、手作業には戻れないですよね。そういった書式でもマークダウンに変換できるマクロを作ってみましょう。

それと、裁判所から届いた文書には、こんな書式がありました。
1(1) 〇〇は〇〇である。
 (2) △△は△△である。
この書式を真似してみたいのですが、さすがにこれは手作業でやるしかないですよね?

正式な呼び方ではないと思いますが、「複合見出し」と呼ばれる書式ですね。ワードのアウトラインでは実現できませんが、「疑似アウトライン」でよければマクロで自動設定ができると思います。

「疑似アウトライン」って何ですか?

これも正式な呼び方ではないと思いますが、「疑似アウトライン」とは、ワードのスタイル機能やアウトライン機能を使わずに、手動で番号や記号を付けて階層構造を表現した見出しのことです。「複合見出し」のようなワードに機能がない書式も実現できます。

よろしくお願いします!

サンプルのダウンロード

インストール方法

Word版VBAアドインのインストール方法

操作マニュアル

VA公用文シリーズ(統合版) 操作マニュアル

仕様

1. プロジェクト概要

Word文書において、Markdown記法(# 見出し、* 箇条書きなど)で書かれたテキストを、Wordの標準機能である「インデント」と「テキストとしての段落番号」を用いた疑似的なアウトライン形式に変換するVBAアドイン。

逆に、インデントや番号で整形されたWord文書をMarkdown形式のテキストに戻す機能も備え、「見出しスタイル」を使わずに、インデントと文字だけで構造化された文書を作成・編集したいニーズに対応する。

2. ファイル構成

プロジェクトは以下のモジュールで構成すること。

モジュール名種類役割
basControl標準モジュールリボンコールバック、処理の振り分け(全体変換/選択範囲処理)
basConvertToFakeOutline標準モジュールMarkdown → 疑似アウトライン変換のメインロジック
basConvertToMarkdown標準モジュール疑似アウトライン → Markdown変換のメインロジック
clsPreFormatterクラスモジュール表スタイルの適用やスペースのインデント化などの事前処理
frmConversionOptionユーザーフォーム変換オプション設定画面
Settings標準モジュール各レベルのインデント量、番号書式等の定数定義
SettingsManagerクラスモジュール設定値の永続化(カスタムドキュメントプロパティへの保存・読込)
VariablesManagerクラスモジュール設定値のメモリ内管理、定数CSVの配列化、番号生成
ThisDocumentThisDocument更新履歴の保持およびドキュメントのエントリポイント

3. モジュール詳細仕様

(1) Settings(標準モジュール)

変換ルールを定義するCSV形式の定数を保持する。

  • 主な定数:
    • strNumberFormats: 各レベルの番号書式(例: "第%1,%2,(%3)...")。
    • strNumberStyles: 各レベルの番号種別(14=全角数字, 0=半角数字, 20=全角カナ, 4=英小文字, 18=丸数字など)。
    • strHeadingLeftIndents, strHeadingFirstLineIndents: 各レベルの左インデント、1行目インデント(ぶら下げ)の文字数。
    • strHead (“#”), strList (“-“) などのMarkdown記号定義。

(2) VariablesManager(クラスモジュール)

  • 機能: Settings モジュールのCSV定数を配列に展開し、実際の変換処理で使いやすい形に加工して提供する。
  • 処理:
    • Class_Initialize: SetVariables を呼び出し、設定の読み込みと配列化を行う。
    • SetArrays: CSV文字列を配列に変換し、さらに 199 までの連番に対応する実際の番号文字列(全角数字、ローマ数字、丸数字など)を生成して varHeadingNumber 配列にキャッシュする。

(3) SettingsManager(クラスモジュール)

  • 機能: アドインの設定(オプション)をファイル自身(ThisDocument)のカスタムドキュメントプロパティに保存・読み込みを行う。
  • メソッド:
    • SaveSettingsToProperty: キーと値のペアをプロパティとして保存(プレフィックス VA_ を付与)。
    • LoadSettingsFromProperty: 保存された設定を読み込む。

(4) basControl(標準モジュール)

  • 機能: エントリポイントおよびリボンインターフェースの制御。
  • プロシージャ:
    • ExecuteFakeOutline:
      • 選択範囲がない(カーソルのみ)場合: 文書全体を ConvertToFakeOutline で変換。
      • 選択範囲がある場合: 選択部分の「全角1文字幅調整」を ToggleFakeOneChar で実行。
    • ExecuteMarkdown: ConvertToMarkdown を呼び出す。
    • ShowConversionOption: 設定フォームを表示する。

(5) basConvertToFakeOutline(標準モジュール)

プロシージャ: ConvertToFakeOutline

  • 機能: Markdown記法を解析し、Wordの書式に変換する。
  • 処理フロー:
    1. clsPreFormatter を使用して、表スタイルの統一や、行頭スペースのインデント変換を行う。
    2. ConvertToFakeOutlineFormat を呼び出し、メイン変換を実行。
    3. ProcessCompositeHeadings で、複合見出し(改行で区切られた見出し)の結合処理を行う。

プロシージャ: ConvertToFakeOutlineFormat

  • ロジック:
    • 段落ごとに # の数をカウントしてレベルを判定。
    • VariablesManager から現在のレベルに対応する番号(例:「第1章」)を取得し、# を削除して番号を挿入。
    • レベルに応じたインデント(左インデント・ぶら下げ)を設定。

プロシージャ: ToggleFakeOneChar

  • 機能: 選択範囲(例:「(1)」)を、フォントの倍率(Scaling)を操作して全角1文字分の幅に縮小して表示する特殊機能。解除時は100%に戻す。

(6) basConvertToMarkdown(標準モジュール)

プロシージャ: ConvertToMarkdown

  • 機能: 疑似アウトライン形式の文書をMarkdownに戻す。
  • 処理フロー:
    1. clsPreFormatter で事前処理。
    2. ProcessCompositeHeadings で見出しの結合(逆変換前の整理)。
    3. ConvertToMarkdownSyntax でインデントや番号文字を解析し、Markdown記号(#, -)に置換。
    4. 最後にスタイルを「標準」に戻し、フォント/段落書式をリセットする(完全なプレーンテキスト化)。

(7) clsPreFormatter(クラスモジュール)

  • メソッド:
    • ApplyTableStyle: 文書内の全ての表に対し、指定スタイル(”表詰め”など)を適用する。
    • ReplaceSpaceWithIndent: 段落行頭のスペース(全角/半角)をカウントし、インデント設定(FirstLineIndent)に変換する。

(8) frmConversionOption(ユーザーフォーム)

  • コントロール:
    • 「表スタイルも変換する」チェックボックス。
    • 「見出し番号を全角1文字に調節する」チェックボックス。
  • 動作: OKボタン押下時に SettingsManager を通じて設定を保存する。

4. 機能要件詳細

  1. 高度な番号生成:
    • Wordの「段落番号機能」は使用せず、テキストとして番号を挿入すること。
    • 番号は VariablesManager 内で事前に生成した配列(1~99までの各種スタイル対応)から取得し、高速化を図ること。
  2. 文字幅の擬似縮小(ToggleFakeOneChar):
    • 「(10)」や「(ア)」などの文字列を、見た目上「全角1文字」の幅に収めるため、Font.Scaling プロパティを計算して設定するロジック(FontMag関数)を実装すること。
  3. 設定のポータビリティ:
    • Mac/Windows両対応を考慮し、レジストリや外部ファイルではなく、アドインファイル自体の CustomDocumentProperties に設定を保存する設計とすること。
  4. インデント計算:
    • ページ設定(PageSetup)から1文字あたりの幅(アドバンス幅)を取得し、文字数単位の指定をポイント単位のインデント値に正確に換算すること。

5. UIデザイン

  • リボン:
    • 「疑似アウトライン変換」「Markdown変換」「設定」の3ボタンを配置。
  • ステータスバー:
    • 変換処理中はプログレス(%)や現在の処理フェーズを表示し、ユーザーにフリーズしていないことを伝える。

コメント

  1. 管理人 より:

    従来紹介していた「VAアウトライン」と併用するとクイックアクセスツールバーが動作しないバグがあったため、修正しました。(Ver101)

  2. 管理人 より:

    見出し番号を全角1文字分の幅にすることで、複合見出しのできない見出しレベルがないようにしました。(Ver200)

  3. 管理人 より:

    段落番号の序数が増加しないバグを修正しました。(Ver201)

  4. 管理人 より:

    疑似アウトラインへの変換時に番号スタイルを選択できるようにしました。(Ver210)

  5. 管理人 より:

    次のとおり変更しました。(Ver300)
    ・マクロ対象段落のフォント書式及び段落書式をリセットするように修正(特殊なフォントを使ったり、行間を設定している文書のマークダウン化が可能になる)
    ・見出しより前や空白の後も処理を行うのを標準設定に変更
    ・オプションメニューの初期値設定機能および番号書式選択機能を削除
    ・オプションメニューに「見出し番号を全角1文字に調節する」のオプションを追加
    ・オプションメニューに行間詰めも変換する機能を追加
    ・オブジェクト変数の解放を追加
    ・オプション設定値をテンプレートではなく設定ファイルに保存

  6. 管理人 より:

    変数オブジェクトの生成および解放コードを追加しました。(Ver301)

  7. 管理人 より:

    マークダウン記号の後ろに空白がある場合にも複合見出しを可能にしました。
    「マークダウン記号の後ろの空白」のデフォルト値をTrueに変更しました。(Ver311)

  8. 管理人 より:

    「最初の見出しまでの処理を停止する」のデフォルト値をTrueに変更しました。(Ver312)

  9. 管理人 より:

    文頭に数字だけが入力されている場合に段落番号と判断するバグを修正しました。
    過去に使用していた右クリックメニューが残っていたのを削除しました。(Ver313)

  10. 管理人 より:

    段落の配置が「右揃え」の場合にも、マクロを停止するようにしました。(Ver320)

  11. 管理人 より:

    行頭の空白で処理を停止する機能を削除しました。(Ver321)

  12. 管理人 より:

    「右揃え」の段落のスタイルが「行間詰め」以外のすべての場合に処理を停止するように修正しました。(Ver322)

  13. 管理人 より:

    設定値の保存先を設定ファイルからカスタムドキュメントプロパティに変更しました。(Macで動作するようにするため)
    EnableCancelKeyの設定オプションを削除しました。(Mac用Wordの不安定が改善されたため)(Ver330)

    Ver300~Ver322がスタートアップフォルダに自動作成していた「VA疑似アウトライン.ini」ファイルは、不要となりましたので削除してください。

  14. 管理人 より:

    変換モジュールの処理を高速化しました。
    モジュールの構成を変更しました。
    事前の書式設定処理をクラス化しました。
    プロジェクト名をVA_FakeOutlineに変更しました。(Ver340)

  15. 管理人 より:

    括弧付きの文字列を全角1文字分の文字幅になるように縮小する機能を追加しました。(Ver350)

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