ファビコン。井の家紋。章番号や項目番号の連番を自動訂正⁽正規表現によるフォーマット検索⁾ | エクセルマクロ(VBA)実践蔵(じっせんぐら)

前の項目 - 文字列操作・正規表現
次の項目 - 画像をまとめて一括トリミング

章番号や項目番号の連番を自動訂正⁽正規表現によるフォーマット検索⁾最終更新日:2023-05-22

エクセルで章番号や項目番号を書きたくなる場合があるのですが、ワードのように自動で修正してもらえる機能がないため、マクロで修正できるようにしてみました。

章番号を含むセルのフォーマットを解析し、正規表現を使用して、章番号や項目番号に該当する箇所を探して、数値を確認していきます。階層構造が深くても問題ありません。(1-1-1-1-1や1.1.1.1 …のように)

そのため、いろいろな書き方に対応可能です。章番号や項目番号を含むセルに文章が書かれていても問題ありません。

数値間違いを修正していくプログラムであり、数値の記入漏れは修正できません。

エクセルは本来、文書を書くツールではないので、連番で項目を記述中に挿入しなければならない事態が発生すると、数字の修正がかなり面倒になります。そんなときのために、同じ列で同じフォーマットであると判断した箇所の数字に対して、数値を連番に修正をかけていくツールになります。(項目番号にエクセルの数式は使用していない前提です。)

数値漏れは、フォーマットが一致しないため、修正できません。全角半角のゆらぎは修正可能です。

下記は使用例になります。章番号部分や項目番号のところどころにミスがあります。

これらを修正して数値を整えるマクロになります。

処理としては、大きく2つに分かれます。

[1]のトップレベルの章番号では、左側の数値1か所が正しくカウントアップされているか確認していきます。

[2]のトップレベル以外の章番号修正では、左側の列を参照しながら、カウントアップやカウンタをリセットする(1に戻す)タイミングを確認していきます。

[1]トップレベルの章番号修正

[1]に関しては、正規表現で整数の個所を見つけて、一番左の数値(全角/半角)を対象に、カウントアップが正しく行われているかを確認していきます。章番号以外の情報が含まれているセルが同じ列に存在した場合に更新対象としないように、先頭セルをユーザに指定してもらい、そのフォーマットを記憶して、同じフォーマットの個所のみを更新していきます。

章番号修正(トップレベル)

上図にあるように、章番号フォーマットと完全に一致するセルのみを更新します。参照章番号については、次の[2]トップレベル以外の章番号修正で解説していきます。章立てのトップレベルでは使用しません。

フォーマットの初期値は、解析した結果を表示させています。先頭のセルが、「第1章」ならフォーマットは「第%NUM%章」と表示されます。この場合、「第(数値)章」の構成をとっていないセルは数字が存在しても、更新されません。

「1、はじめに」のように文章がつづく場合は、初期値として「%NUM%、はじめに」と表示されるため、「%NUM%、%ANY%」とテキストボックス内を書き換えて貰えれば、以降、「(セル先頭)(数字)、(文章なんでも、数値を含んでも可)」というフォーマットのセルに対して、数字の位置の番号を更新します。はじめに選択したセルが全角数値を採用していた場合に、同じ位置に半角数値がある場合、全角に置き換えます。逆も同じで、先頭セルとして選択したセルのフォーマットを正しいと判断して動作させています。

そのため、半角で書き始めたものを全角に直したい場合は、先頭セルのみを修正して、実行してもらえれば、修正されます。

章番号修正(トップレベル)修正アニメーション

[2]トップレベル以外の章番号修正

[2]の別の列を参照するケースでは、修正対象の列と、参照を行う列の2列から正しい数値を導きます。

参照セルの番号を次のレベルで使用している場合と使用していない場合を考慮していきます。

章番号修正 参照レベルに引き継ぎあり・なし

[1]にて使用したフォーマットや先頭セルを、参照セル側の情報として引き継ぎます。新たに修正対象としたいセルの先頭セルをユーザに選択してもらい、参照側の情報を含んでいるかを確認します。含まれる場合は、フォーマットに”参照章番号”と記述されます。

章番号修正 参照章番号

"参照章番号"と記述している個所の正しい値は、参照セルからもらい、残っている%NUM%の個所は、更新カウンタとしてカウントアップ、又は、リセットを行います。

正しい参照章番号を持ってくる位置の検索方法としては、参照側の列番号と修正対象セルの行数のセルから探索を開始し、上方向に向かって、前回実行したときのフォーマットを使用して、該当セルを見つけます。

さらに詳細レベルの章番号がある場合も、同じように続いていきます。

(例)
A列    B列    C列      D列
1.      1-1    1-1-1    1-1-1-1

[1] A列の実行 (修正列フォーマット)%NUM%.
[2] B列の実行 (A列を参照しながらB列を修正) 参照章番号(数字)-%NUM%
[3] C列の実行 (B列を参照しながらC列を修正) 参照章番号(数字-数字)-%NUM%
・・・

ユーザが続ける限り、階層はどこまでも対応可能です。参照章番号の部分を文字列として扱い、、更新カウンタは一か所とすることで、修正レベルを意識することなく、トップレベル以外は同じ処理となります。

参照側であっても、修正対象側であっても、フォーマットと一致するセルのみを検知対象としているため、%ANY%を使用しないフォーマットであれば、参照セルと修正セルが同列に記述されていても動作可能です。%ANY%を参照側で使用する場合、修正側の章番号の数値が%ANY%の一部として検出されてしまい、参照側のセルとして誤検知するため、同列での動作はできません。その逆の、参照側に%ANY%指定がなく、修正側に%ANY%指定ありの場合は、問題ありません。

参照列のセルの情報が、修正列に含まれないと判断された場合は、フォーマットに"参照章番号"は表示されません。%NUM%は表示されるため、更新カウンタの更新、又は、リセット判断のみを行います。

参照章番号を含むかどうかの判定詳細

数値の後ろにドット「.」やカンマ「,」、カッコ「)」を使用する場合があるため、数値の後ろの記号一文字は削除して比較しています。

「1-1)」に「1)」が含まれるか確認した場合に、「%NUM%-参照章番号」(%NUM%が更新個所)と判断すると正しくないため、参照側は数字の後ろ一字外して「1-1)」に「1」が含まれるか確認し、フォーマットが「参照章番号ー%NUM%)」となるように、判定しています。(一致個所は、左が優先になります。)

「1-1-1)」を修正する際に参照先として比較対象となるのは、「1-1」になります。先頭と一致するため、こちらもフォーマットは「参照章番号ー%NUM%)」になります。

また、先頭セルのみを使用して「参照章番号」を含むかどうかを判定しています。

先頭セルだけは正しい数値が入っている前提で、作成しています。

トップレベルが「3.」で正しい場合に、レベル2を対象に修正を行おうと思った場合に、先頭セルとして「1-1」を含むセルを選択した場合、「3」が含まれるか確認を行っても不一致となるため、参照章番号を含むという判断ができません。先頭のセルは正しく「3-1」に修正してから、レベル2を対象にマクロの実行を行ってください。

レベル3を修正する場合は、先頭セルが「1-2-1」となるため、「3-2-1」に修正してから実行する必要があります。

救済措置

参照セルの数値は引き継いでいるが、フォーマットは引き継いでいない場合、数字の数が参照セルの方がひとつ少ない場合、かつ、参照セルに含まれる数値が修正対象側の章番号に含まれている場合、ダイアログで下記を表示させます。

章番号修正 引き継ぎフォーマット不一致

章番号修正 引き継ぎあり注意ダイアログ

「Section1.」は、次のレベルの「1-1」に含まれず、「第1章」は、次のレベルの「1-1」に含まれず、「1-2」(すべて全角)も「1-2-1」(すべて半角)に含まれませんが、数値の数がひとつ増えていて、参照セルのもつ数値が一致する場合に、確認ダイアログを表示させ、「はい」が選ばれた場合は、ダイアログに記載されている通り、上位レベルの数値(全角/半角)を下位レベルの数値配置個所に左から順番に適応させます。

参照するセルが文字列のみの場合

下記のように、参照している文字列に変化があった場合に、カウンタのリセットを行いながら、カウントしていきたい場合、

章番号修正 引き継ぎなし

「指定」タブから修正可能にしました。「標準」タブでは、トップレベルとして指定可能なのは数値を含むセルになります。

参照セルと修正対象セルを指定して、実行してください。

章番号修正 指定タブ

この「指定」タブでは、好きなレベルの修正が可能です。「標準」タブで実行後に、章番号フォーマットの記述間違いにより想定の個所が更新されなかった場合、修正箇所の列のみ再実行することができます。

章番号修正マクロのダウンロード

下記からダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。

マクロの有効化手順については、こちらも参考にしてください。

章番号修正 エクセルファイル(xlsm)のダウンロード

前の項目 - 文字列操作・正規表現
次の項目 - 画像をまとめて一括トリミング