エクセルで「読めない日付」をどう読むか

財務捜査では、預金通帳、仕訳帳等の資料をエクセルに入力するのが基本です。
電子データで取得できるのが理想ですが、ときには紙データをスキャンし、OCRで文字認識するしかないこともあります。

元データによっては、そのままではデータとして使えないことがあります。

今回は日付を例にして、データ変換方法を考えます。

日付がすべて6桁(8桁)の場合

日付を示す文字列は、年が4桁または2桁、月と日は2桁になっているのが基本です。
年を”y”、月を”m”、日を”d”で示すならば、

  • yymmdd
  • yyyymmdd

となります。

2024年1月3日であれば、

  • 240103
  • 20240103

です。

6桁、8桁両方の説明をすると長くなるので、通帳でよく見る、6桁ということで、以下話を進めます。

日付を示す数字が6桁で統一されていれば、すべてのデータに同じ関数式を当てはめて日付に変換することができます。

例えば、上の図のように元データがすべて6桁であれば、

  • Left関数を使い、「年」にあたる左から2文字を取得(2000を足して2024とする)
  • mid関数を使い、「月」にあたる3文字目から2文字を取得
  • right関数を使い、「日」にあたる右から2文字を取得
  • これらをdate関数でまとめる

ということで、日付に変換することができます。

4桁、5桁があった場合

ただ、上のようにすべてが6桁データに統一されているわけではありません。
例えば、預金通帳をスキャナで読み込んだら、日付がこのようにテキスト化されてしまうことがあります。

通帳などの日付は、「24- 1- 3」と印字されていることがあります。
1桁の月や日がゼロ詰めされていません。
OCRで読み取った場合、「2413」と、忠実に再現してしまいます。

これを関数を使い、日付に変換する方法を考えます。

このときにやってはならないのは、目で見て手で修正という、「力技」でしてしまうこと。

今回はサンプルでデータは10しかありませんが、数千件のデータだととても人間では対応できません。
間違いも多くなりますし、生産的でもありません。
関数を使うことを面倒がって力技で対応していると、いつまで経ってもエクセルを使えないままです。

データの規則性に着目する

さて、先ほどのような扱いにくいデータがあった場合には、まず、データを一とおり確認し規則性を探すことにします。

データをみると、年月日を示すデータは、

  • 4桁
  • 5桁
  • 6桁

の数字になっていることがわかります。

4桁、6桁の場合

そのうち、4桁と、6桁の数字は、簡単に日付に変換できることに気づきます。

  • 4桁 → 左から2文字は「年」、3文字目は「月」、右側の1文字は「日」
  • 6桁 → 左から2文字は「年」、3文字目から2文字は「月」、右側の2文字は「日」

になります。

例えば、

  • 「2413」であれば、2024年1月3日
  • 「241111」であれば、2024年11月11日

しか読めません。

このように4桁、6桁の数字と日付は1対1の関係にあります。

if文を使って、文字長が4、6の場合のdate関数を書くことはできそうです。

5桁の数字への対応方法

さて、ここまでは問題ないのですが、5桁の数字は、どのように変換すればいいでしょうか。

例えば、A3セルの「24111」は

  • 2024年1月11日
  • 2024年11月1日

のどちらにも読むことが可能です。

5桁でも簡単に日付が変換できる場合

しかし、5桁の数字がすべて2通り読めるわけではありません。
2通りに読めるのは、3文字目が「1」の場合だけです。

例えばA5セルはの「24211」は、2024年21月1日という日付はありえないため、

  • 2024年2月11日

にしか読めません。
つまり、5桁で日付が2通りに読めるのは、3文字目が「1」の場合だけです。

5桁で3文字目が「1」の場合

先ほど、A3セルの「24111」は

  • 2024年1月11日
  • 2024年11月1日

のどちらにも読むことが可能と書きましたが、人間はこれを前後の関係から、2024年1月11日と判断できます。
この後、A6セルをみると「2024年4月2日」があります。
通帳の日付は昇順で並んでいるので、11月の可能性はありません。

一方、A10セルの「24111」は、前に10月のデータがあるので

  • 2024年11月1日

としか読めないことになります。

整理してみる

以上を整理すると、

  • 5桁の数字で3文字目が1の場合、日付は2通りに読める
  • 前後の日付から、月は特定できる

ことがわかります。

ここから、エクセルに落とし込んでいきます。

まず、5桁の文字数は、2通りの読み方ができるので、

  • C列 → 3文字目を月と読んだ日付
  • D列 → 3文字目が”1″の場合、もう一つの読み方である3文字目・4文字目を月と読んだ日付

を表示させます。

次に以上では解決できない「24111」問題を解消します。
この場合、前後のデータから確認することにします。
もし、前のデータが2月以降であれば、1月と読むことはできません。

そこで、文字長5で最初から3文字目が”1″の場合、直前行の日付データの月が1より大きければE列が、そうでなければD列の値が当てはまることになります。
これをF列に判定式として入れます。

前後の日付がわからないと判定できないので、表の全体像を示しました。

  • 1通りしか読めない4桁、6桁のテキスト
  • 2通り読める5桁のテキスト

を場合分けした表になります。

H列では、C列(4桁の場合)、F列(5桁の判定結果)、G列(6桁の場合)の最大値を求めています。
空白セルがあるので、それぞれを「+」でつなぐと”value”エラーとなるためです。
max関数ではなく、min関数でも構いません。

本日のまとめ

一見「読めない」と思うテキストも、規則性に着目するとエクセルで扱える日付等に変換することができます。

ほかにも「データ区切り」機能、「パワークエリ」を使う方法もあります。
「人海戦術」、「力技」によることは避けたいものです。