[マクロ]定款・契約書等の条文番号をリナンバーするWordマクロ

ChatGPT とのやり取りで、条文の追加・削除後に条数だけを振り直す Word マクロを作った。
備忘録がてら、最終版コードとやり取りの要点をシェアします。

この記事で紹介するWordマクロの概要

  • 行頭の「第1条」「第10条」 … と続く条文番号を自動で振り直す。(本文中の「第◯条」には反応しません)
  • 1〜9 は全角、10 以上は半角で出力
  • 段落スタイル/ぶら下げインデント/フォントをいじらない

完成したマクロ

一応、ご利用は自己責任でお願いします。

'========================
Sub RenumberArticlesSafe()

    Dim para As Paragraph, pRng As Range, numRng As Range
    Dim re As Object, m As Object
    Dim idx As Long
    Dim sPos As Long, ePos As Long      '数字部分の範囲

    Application.ScreenUpdating = False  '高速化&画面チラつき防止

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "^第([0-90-9]+)条"   '行頭だけヒット
    re.Global = False

    idx = 1                              '新しい条番号

    For Each para In ActiveDocument.Paragraphs
        Set pRng = para.Range
        If re.test(pRng.Text) Then
            Set m = re.Execute(pRng.Text)(0)
            '「第」の直後〜「条」の直前を数値 Range として切り出す
            sPos = m.FirstIndex + 2              '0-based→1-based, かつ「第」を避けて+1
            ePos = sPos + Len(m.SubMatches(0))

            Set numRng = pRng.Duplicate
            numRng.Start = pRng.Start + sPos - 1
            numRng.End   = pRng.Start + ePos  - 1

            '数字だけ置換(既存の文字書式を保持)
            numRng.Text = FormatArticleNum(idx)
            idx = idx + 1
        End If
    Next para

    Application.ScreenUpdating = True
    MsgBox idx - 1 & " 本の条文番号を振り直しました。", vbInformation
End Sub

'1〜9→全角、10 以上→半角
Private Function FormatArticleNum(n As Long) As String
    If n <= 9 Then
        FormatArticleNum = ToFullWidth(n)
    Else
        FormatArticleNum = CStr(n)
    End If
End Function

'半角を全角に変換
Private Function ToFullWidth(n As Long) As String
    Dim s As String, i As Long
    For i = 1 To Len(CStr(n))
        s = s & ChrW(AscW(Mid$(CStr(n), i, 1)) + &HFEE0)
    Next i
    ToFullWidth = s
End Function
'========================

ChatGPTとのやり取り

添付ファイルのようなスタイルの定款を仕事の中で扱う。
条文の条数が下記のような規則になっている。
・1~9条は全角数字
・10条以降は半角数字
・それぞれ行頭から「第X条」というスタイルで始まる
定款変更決議により、条文を削除したり、途中に条文を追加したりして、条文番号が変更になることがある。
そのときに
・条文番号を頭から振り直す
ということをWordマクロで実現したい。
坂根

ChatGPT
(第1バージョン)マクロコード

このコードは、行頭の「第X条」だけを置換するコードになっている?本文中の「第X条」を拾ってしまってナンバリングが狂ったりしない?
坂根

ChatGPT
ご指摘の通り、コードが**行頭の「第X条」**だけを対象としていない場合、本文中の「第X条」も置換してしまう可能性があります。そのため、本文中の不必要な箇所でナンバリングが狂うリスクがあります。
(第2バージョン)修正後のマクロコード

実行したら、「非表示モジュールでコンパイルエラーが発生しました」と怒られた。心当たりはある?
https://learn.microsoft.com/ja-jp/office/vba/Language/Reference/User-Interface-Help/compile-error-in-hidden-modulemodule-name
坂根

ChatGPT
(トンチンカンな回答)

さっき一緒に提供したURLの中に「一般に、このエラーはコードがこのアプリケーションのバージョンまたはアーキテクチャと互換性がない場合に発生します (たとえば、ドキュメントのコードの対象が 32 ビット版の Microsoft Office アプリケーションであるのに、64 ビット版 Office で実行しようとした場合)。」とあるけれども、具体的にはどのようにOfficeの32ビット版、64ビット版を確認したら良いだろうか?
坂根

ChatGPT
(Officeの32ビット版、64ビット版の確認手順)

64ビット版と確認できた。提供してもらったマクロコードの中に、34ビット版でしか使えないコードが含まれていたりしない?
坂根

ChatGPT
結論:提供したマクロコードには、32ビット版と64ビット版の違いによる問題は含まれていません

(ここでいったんやり取りを中断して人間の手作業でデバッグする方法を探り、エラー行を探り当てた)
If Trim(para.Range.StartOf(Unit:=wdParagraph, Count:=1).Text) = “第” Then
の行の「Count:=」がハイライトされて、「名前付き引数が見つかりません (エラー 448)」というエラーが出ていることがわかった。
坂根

ChatGPT
(第3バージョン)修正後のコード

エラーは出なくなった。実行も可能になった。
ただ、条文を削除したり追加したりして、このマクロを実行してみても条文番号が振り直されず、何も起こっていないように見える。
坂根

ChatGPT
(第4バージョン)修正後のコード

「StartOf」がハイライトされて「コンパイルエラー 修飾子が不正です」と怒られたよ。
坂根

ChatGPT
(第5バージョン)完全版マクロ(64 bit/32 bit共通)

(チャット履歴がバグって表示が飛んでいるが、ここで「実行するとフリーズする」と報告したはず)
坂根

ChatGPT
(第6バージョン)フリーズしない完全版マクロ

実行すると動作するんだけど、段落の書式が変わっちゃう。具体的にはぶら下げインデントの文字下げ位置が変わってしまう。書式やフォントには影響を与えずに、条数の数字のみを更新するようにできない?
坂根

ChatGPT
(第7バージョン)コード(64 bit / 32 bit 共通、書式非破壊版)

編集後記

この記事の本文もChatGPTに提案させたものをベースを構成してみたが、「やり取りの要点を」と指示したのにやり取りの過程はスルーされていたため、そこは仕方無く手作業でコピペして構成した。
やり取りを構成する中で振り返って見ると、日本語の指示だけでは思うように進められず、人間が頭を使ってデバッグしないと状況打破できなかった箇所もあったことも思い出した。
そして実行するとフリーズするような成果物に「完全版マクロ」などと命名するあたり、狂気を感じるというか、軽薄というか。

関連記事

[マクロ]初心者でも「自動記録マクロ」を使えば様々な作業を自動化できる | 流れるような一日を

ChatGPTにコードを書かせて動かなかった場合、今回のように人間がデバッグできないと動く物にならないこともあるが、自動記録マクロならそこまでの知識が無くても使い始められると思う。
作業を記録してみて、コードを開いて見ると、この行はこういう操作に該当してるんだな、とわかるようになってきたりするし、慣れれば自動記録マクロを切り貼りして組み立てたりもできるようになると思う。

コメント

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