証拠説明書をワードで作成する(ワードVBA)

サンプル

裁判所のホームページで民事訴訟フェーズ3で使用する証拠説明書の書式(エクセル)が公開されましたね。

そうですね。でもエクセルだと、セルに入力できる文字数が制限されるので、この機会にワードで作成するようにしたほうが良いと思います。

ワードの表は苦手なんです。

案外、勝手は悪くはないですよ。詳しく説明した操作マニュアルも作りますから、使ってみてください。

サンプルのダウンロード

マクロが含まれたファイルをインターネットからダウンロードして利用する場合、セキュリティ上の理由からそのままでは動作しないことがあります。以下の手順で設定を行ってください。

手順1:ファイルの「ブロック解除」を行う(最優先)

インターネットからダウンロードしたファイルは、Windowsのセキュリティ機能によりブロックされていることが一般的です。これを開く前に解除する必要があります。

  1. ダウンロードしたファイルを右クリックし、メニューから「プロパティ」を選択します。
  2. 「全般」タブの下部にあるセキュリティの項目を確認します。
  3. 「許可する」(または「ブロックの解除」)というチェックボックスにチェックを入れます。
  4. 「OK」をクリックして画面を閉じます。
手順2:Officeソフト側でマクロを許可する

ExcelやWord自体がマクロを実行できる設定になっていない場合、ファイルを開いてもマクロが動きません。

  1. Excel(またはWord)を起動し、「ファイル」タブをクリックします。
  2. 「オプション」>「トラストセンター(セキュリティセンター)」>「トラストセンターの設定」を開きます。
  3. 「マクロの設定」にて、マクロの実行を許可する設定になっているか確認してください(一般的には「警告を表示してすべてのマクロを無効にする」などを選択し、実行時にコンテンツの有効化を押す運用が推奨されます)。
手順3:ファイルを開く
  1. 手順1でブロックを解除したファイルをダブルクリックして開きます。
  2. ファイルが開いた際に、画面上部に「コンテンツの有効化」という黄色いバーが表示された場合は、それをクリックしてください。

仕様

1. 全体設定と共通仕様

1.1. モジュール構成

  • Option Explicit を宣言すること。

1.2. 多重実行防止(連打対策)

  • モジュールレベル変数として Private isProcessing As Boolean を定義すること。
  • 各メインプロシージャの先頭で以下を行うこと。
    1. If isProcessing Then Exit Sub で実行中なら処理を抜ける。
    2. isProcessing = True でフラグを立てる。
    3. 処理終了時(ExitHandler)で isProcessing = False に戻す。

1.3. 共通のエラーハンドリングとUI制御

各メインプロシージャは以下の共通構造を持つこと。

  • 先頭でマウスポインタを待機状態(System.Cursor = wdCursorWait)にし、On Error GoTo ErrorHandler を宣言する。
  • 正常終了時および中断時の共通出口として ExitHandler: ラベルを作成する。
    • ExitHandler では、画面更新の再開(必要な場合)、マウスポインタの通常復帰(System.Cursor = wdCursorNormal)、isProcessing = False を行い、Exit Sub で抜ける。
  • エラー時の処理として ErrorHandler: ラベルを作成する。
    • MsgBox で「処理中にエラーが発生しました。(改行)エラー内容: ” & Err.Description」を vbCritical で表示し、Resume ExitHandler で抜ける。

2. 共通関数

2.1. セルテキスト取得関数:GetCellText

  • 機能: Wordのセル範囲からテキストを取得し、末尾の不要な制御文字と前後の空白を除去する。
  • スコープ: Private Function
  • 引数: rng As Range
  • 戻り値: String
  • 処理内容: rng.Text から Chr(13)Chr(7) を連結した文字列を Replace で空文字に置換し、さらに Trim 関数で前後の空白を削除して返す。

3. メインプロシージャ(機能要件)

3.1. 原告・被告マークのトグル移動:TogglePartyCircle

  • 概要: 文書内の図形(丸印)を左右に50ポイント移動させ、代替テキストで状態を管理する。
  • 使用する変数: doc As Document, shp As Shape, moveDistance As Single
  • 処理フロー:
    1. moveDistance50 を代入し、docActiveDocument をセットする。
    2. 図形の取得:
      • On Error Resume Next を宣言し、doc.Shapes("MarkerCircle")shp に代入する。
      • 直後に On Error GoTo ErrorHandler でエラー処理を通常に戻す。
      • shp Is Nothing の場合は MsgBoxvbExclamation)で「対象の図形(MarkerCircle)が見つかりません。」と表示し、GoTo ExitHandler で抜ける。
    3. 移動ロジック:
      • shp.AlternativeText"Hikoku" でない場合(初回または原告状態): shp.LeftmoveDistance 分だけプラス(右へ移動)し、AlternativeText"Hikoku" をセットする。
      • それ以外の場合(被告状態): shp.LeftmoveDistance 分だけマイナス(左へ移動)し、AlternativeText"Genkoku" をセットする。

3.2. 標目の結合・分割切替:ToggleMergeByHeader

  • 概要: 見出し(「標目」)のダブルクリックによりユーザーフォーム(frmMergeSplit)を起動し、ユーザーが選択した処理(結合または分割)に応じて、カーソルがある表の2行目から最終行までをループして一括処理を行う。
  • 使用する変数: 引数 actionType As String ならびに tbl As Table, rw As Row, i As Long, c As Integer, textCol3 As String, textCol4 As String
  • 事前チェック: (呼び出し元である ToggleMergeByHeader にて)Selection.Information(wdWithInTable) が偽なら Exit Sub で抜ける。真であれば frmMergeSplit.Show を実行してフォームを表示する。
  • 処理フロー:
    • (実処理を行う ExecuteTableFormat にて)tblSelection.Tables(1) をセットし、Application.ScreenUpdating = False を実行する。
    • i = 2 To tbl.Rows.Count でループし、rwtbl.Rows(i) をセットする。
    • 分割処理 (actionType = "Split" かつ rw.Cells.Count = 4 の場合): すでに結合されていると見なし、rw.Cells(2)Split NumRows:=1, NumColumns:=3 で分割する。 列幅の復元: c = 1 To 6 でループし、1行目の各セルの PreferredWidthType および PreferredWidth を、現在の行の各セルにコピーする。 さらに列幅を強制適用するため、On Error Resume Next の下で rw.Cells(c).Width = tbl.Rows(1).Cells(c).Width を実行し、直後にエラー処理を通常に戻す。
    • 結合処理 (actionType = "Merge" かつ rw.Cells.Count = 6 の場合): 通常行と見なし、GetCellText 関数を使って3列目および4列目のテキストを取得し、それぞれ textCol3, textCol4 に格納する。 3列目または4列目のいずれか(あるいは両方)に文字列が入力されている場合は、処理を行わずに次の行へスキップする(GoTo NextRow)。 ただし、両方が空文字("")である場合のみ、3列目および4列目の Range.Text を空文字にし、2列目(rw.Cells(2))を4列目(rw.Cells(4))に向けて Merge する。
    • 終了処理: ループ終了後、Selection.Collapse Direction:=wdCollapseStart で選択状態を解除する。

    3.3. 作成年月日の書式設定:FormatDatesByHeader

    • 概要: カーソルがある表の通常行について、3列目の日付文字列を和暦(ge.m.d)にフォーマットする。
    • 使用する変数: tbl As Table, rw As Row, i As Long, textCol3 As String, dateVal As Date
    • 事前チェック: 表内にカーソルがなければ GoTo ExitHandler で抜ける。
    • 処理フロー:
      1. tblSelection.Tables(1) をセットし、画面更新を停止する。
      2. i = 2 To tbl.Rows.Count でループし、rw に対象行をセットする。
      3. rw.Cells.Count = 6 (標準行)の場合のみ以下の処理を行う。
        • GetCellText 関数で3列目のテキストを textCol3 に取得する。
        • textCol3 が空欄でない場合、IsDate 関数で日付と判定できるかチェックする。
        • 判定が真なら CDatedateVal に変換し、rw.Cells(3).Range.TextFormat(dateVal, "ge.m.d") の結果を代入する。
      4. ループ終了後、Selection.Collapse Direction:=wdCollapseStart で選択状態を解除する。

    コメント

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