YuTaKoメモ

まずは欧州や日本の法律など、日々の覚書としていきます

目次
欧州の法令 日本の法令
(道路)
保安基準 VBA

【Word】【VBA】【マクロ】文字列の置換 その1(ワイルドカードで文字を追加)

ふと日本の法令を覗いてみると、こちらも独特な書き方がされてますね。

専門家であれば、専用のソフトで見やすくできるのかと思いますが、

如何せん、素人ですので、Word にコピペして、体裁を変えられるようにしたいと思ってます。

題材にしたのは「河川法」ですが、今回はあまり内容にはこだわらずに、変更経緯をメモしていこうと思います。

「河川法」『第百条』付近を例にして、『漢数字』の置換準備

f:id:YuTaKo:20191120202753j:plain

e-Gov での河川法、これをまずはテキストコピペでWordに貼り付けます

まず気になるのが、『漢数字』で書かれた番号です。

これを『算用数字』に変更して見やすくしたいのですが、その置換作業の前に、赤囲いの様な気になる部分がたくさん、、、

  • 番号が「第百条」「第百条の二」「第百条の三」「第百一条」と言うように、「条の*」(*は漢数字で番号は二からスタート)が付く場合がある。
  • 条の番号(段落番号)では、「第一」(一段落目)の頭には何もつかず、「第二」(ニ段落目)から『算用数字』の「2」からナンバリングされている。
  • 条の項の第一下位レベルでは、『漢数字』の「一」からナンバリングされている。
  • 条の項の第一下位レベルのもう一段下位レベル(第二下位レベル)には、「イ・ロ・ハ・ニ・・・」のナンバリング

などなど、、、なので、まずは「条」以下の連番があったりなかったりを統一させる為、次の順番で、置換を進める事にしました。

 項以下が、「算用数字」「漢数字」「イロハ」でレベル分けされているのは救いでしたね、、、と言うわけで順番は、

1.第一下位レベル『漢数字』の頭に「#」を付けて、以後置換する段落番号と区別できるようにする。(ここでは本文中の漢数字は触らず、見出し番号のみ変更)
     「(改行後の)五 」→「(改行)#五 」

2.本文中の「第**条の・・」となっている、「の」と「・・」の間に「の0」を追加し、同時に漢数字を算用数字に変更(見出し部はまだ触らず)
     「第十六条の二」→「第十六条の02」

3.本文中の「第**条」の後ろに「の01」を追加(見出し部はまだ触らず)
     「第十五条」→「第十五条の01」

4.見出しの条番号に「の0*;」を追加(「;」は後に判別しやすくする為)
     「第百二条」→「第百二条の01;」
     「第百条の五」→「第百条の0五;」

と言うわけで、VBA の コードはこんな感じです。

1.第一下位レベル『漢数字』の頭に「#」
     「(改行後の)五 」→「(改行)#五 」
---------- ---------- ---------- ---------- ---------- ---------- ---------- 

   ActiveDocument.Range(0, 0).Select 'カーソルを先頭に移動
'『十』
   With Selection.Find
    .text = "^p" + "十 "      '^pは改行(ワイルドカードOFF時)
    .Replacement.text = "^p" + "#十 "
    .Forward = True
    .Wrap = wdFindContinue     '全文検索
    .Format = True
    .MatchWildcards = False     'ワイルドカードOff
    .Execute Replace:=wdReplaceAll  '一つ目を検索して置換&全て置換
   End With
' 「(改行後の)十五 」→「(改行)#十五 」
   With Selection.Find
    .text = "^13" + "十" + "(?)" + " " ' ^13 はワイルドカードオン時
                     ' の改行文字
                     ' 一文字検索の?は、置換後に使う為に
                    ' カッコ付きにしておく(さらに””)
    .Replacement.text = "^13" + "#十" + "\1" + " " 
            'ワイルドカードOn時に ? で見つけたものの一つ目として
            ' 「¥」+ 「(一つ目の)1」
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchWildcards = True      'ワイルドカードOn
    .Execute Replace:=wdReplaceAll
   End With

---------- ---------- ---------- ---------- ---------- ---------- ----------