夢見る税理士の独立開業繁盛記

神戸市東灘区で開業している駆け出し税理士の、試行錯誤日記

事務所ホームページはこちらです→神戸市東灘区御影の会計事務所 小林敬幸税理士事務所

正規表現って難しい・・・

前回の日記の続きで、PDFから電子帳簿保存法の要件を満たす索引簿をエクセルで自動で作る件。とりあえず日付を抜き出す方法を考えてみました。


PDFから文書データを引っこ抜いてみると、元のフォーマットはバラバラなので、日付の部分も次のような感じでいろいろな形で抜き出されてきます。

発⾏⽇︓2022年05⽉30⽇
注⽂⽇︓2022年05⽉19⽇

): 2022年4月21日:¥ 1,497

人間の目で見ると、どの部分が日付というのはすぐにわかりますが、エクセルに日付と判断させるにはどうしたらいいのか・・・?
Google先生に聞くと「正規表現」というものがあるということなので、この本で勉強してみました。


正規表現とは、書き方に揺れがあるけれど一定のルールがある表現を、そのルールに基づいて表したものということみたいです。
たとえば日付の場合、

20220609
2022/06/09 0:00
2022.6.9
2022/06/09
2022年6月9日
2022-6-9
令和4年6月9日
R4.6.9

のようにいろいろな書き方があるけれど、「西暦や和暦で始まって、日付で終わる」というパターンがあるから、人間の目で見たらすぐに日付と分かります。
それでは同じようにエクセルにも、この正規表現を使って、これらを日付と認識させることはできるのでしょうか・・・?


とりあえず以下のような文字列から、エクセルに日付だけを抜き出させることができるかやってみました。

あいうえお20220609かきくけこ
あいうえお2022/06/09 0:00かきくけこ
あいうえお2022.6.9かきくけこ
あいうえお2022/06/09かきくけこ
あいうえお2022年6月9日かきくけこ
あいうえお2022-6-9かきくけこ
あいうえお令和4年6月9日かきくけこ
あいうえおR4.6.9かきくけこ
あいうえお
かきくけこ
さしすせそ
20220609かきくけこ
2022/06/09 0:00かきくけこ
2022.6.9かきくけこ
2022/06/09かきくけこ
2022年6月9日かきくけこ
2022-6-9かきくけこ
令和4年6月9日かきくけこ
R4.6.9かきくけこ
あいうえお20220609
あいうえお2022/06/09 0:00
あいうえお2022.6.9
あいうえお2022/06/09
あいうえお2022年6月9日
あいうえお2022-6-9
あいうえお令和4年6月9日
あいうえおR4.6.9


「日付の前に文字があったりなかったり。そのあとに『20か令和かRで始まり、数字2桁で終わって』、その後にも文字があったりなかったりする」というイメージで、以下のような正規表現を上記の表現に当てはめてみます。

Regex.Pattern = "(.*?)(R\d{1}.*|令和\d{1}.*|20\d{2}.*[\-|\.|\d{2}])(.*)"


具体的なマクロはこんな感じ。

Sub 作業シートの日付データを整理()
'
' 作業シートの日付データを、正規表現を使って日付だけを抽出し、日付フォーマットに変換
'

'変数宣言
Dim i As Long
Dim Lastrow As Long
Dim Regex As Object
Dim Matches As Variant


'正規表現の設定
Set Regex = CreateObject("VBScript.RegExp")

Regex.Pattern = "(.*?)(R\d{1}.*|令和\d{1}.*|20\d{2}.*[\-|\.|\d{2}])(.*)"




'「作業シート」のA列のデータ数を取得
With Sheets("作業シート")
Lastrow = .Cells(1, 1).End(xlDown).Row

'「作業シート」のA列のデータを、正規表現に該当するかどうか、マッチ実施し、結果をB~E列に表示
For i = 1 To Lastrow
Set Matches = Regex.Execute(.Range("A" & i))
If Matches.Count > 0 Then
.Range("B" & i).Value = Matches(0).Value
.Range("C" & i).Value = Matches(0).submatches(0)
.Range("D" & i).Value = Matches(0).submatches(1)

.Range("E" & i).Value = Matches(0).submatches(2)
End If

Next


End With

End Sub

このマクロで上記の文字列に正規表現のパターンを当てはめてみると、日付を含むデータだけを抽出して、そこからさらに日付だけを抽出してくれます。

あとはこのD列の文字列を日付形式に加工すれば、使えるようになるかなあ。

でもこの正規表現、「こう書いたらこう動く」というのがいまいちよく理解できないんですよねえ。難しい・・・。
今まで使ったことがなかったので、今後もあまり使わないような気もするけど、もうちょっと勉強しないとダメかなあ。


ちなみに前回の領収書にあてはめると、以下の四件を抽出します。

次はこの中から、どうやって取引日を判定させるかですよね。正解の取引日は「2022年5月19日」だけど、これをエクセルにどうやって判定させるか・・・。
前後左右にある文言などから、条件にはまるものを選ぶのがいいのかしら?


※今月の近畿税理士会の会報誌では、電子帳簿保存法への対応方法として、取引先に「取引年月日・企業名・取引金額をPDFデータ名に付してもらう」方法が紹介されていました。

お願いして対応してもらえる取引先がどれぐらいあるのか・・・?これも難しそうですよね・・・。


神戸市東灘区御影の会計事務所 小林敬幸税理士事務所です