GASを使わず関数だけで和暦変換してみた

Googleスプレッドシートで西暦を和暦に変換したいと思ったことはありませんか?

和暦を使ったデータ管理や文書作成は、日本のビジネスや日常生活で頻繁に必要とされます。今回は、Googleスプレッドシートの関数を活用して西暦から和暦への変換を簡単に行う方法を詳しく解説していきます。

具体的な例をあげながら、GASを使わずに関数を駆使して実現する方法・・・お役に立てれば幸いです。

にほんブログ村 IT技術ブログへ

和暦に変換する関数も表示形式の設定も無い・・・

エクセルならば「セルの書式設定」で和暦に変換するのは容易ですが、残念ながらGoogleスプレッドシートにはそのような設定はありません。

(表示形式でいろいろ設定できますが、和暦にはできないのです。)

でも業務上どうしても和暦表示が必要な場面はあるのではないでしょうか?

表示形式でも変えられないのなら、和暦変換する関数でもあればありがたいのですが、残念ながらそんな便利な関数も無いのです・・・

しかし、いつから昭和・平成・令和で、西暦に対してどんな計算をすれば和暦の数字になるのかは、ルールがわかっています。

ルールに曖昧さがなければ何とかなるもの。ルールに応じて関数を駆使すればできるはず・・・

ということで、いろんな関数を駆使して西暦を和暦に変換していきます。

日付の値はシリアル値(DATEVALUE関数)

日付の値がどのように入っているのかは、基本的に重要なポイントです。

エクセルやスプレッドシートでは、「2024/2/10」のように、年月日をスラッシュで区切った形で入力すると、自動的に日付と判断して表示してくれます。

その時、見た目では「2024/2/10」とか、表示形式を変えて「2024年2月10日」とか、いろんな表示に変更することができますが、内部的に扱われている本当の値はシリアル値という値になります。

日付のシリアル値を知るためにはDATEVALUE関数を使います。

構文は以下の通りです。

=DATEVALUE(日付を表す文字列)

「日付を表す文字列」には日付の入ったセルを指定すれば良いです。

実際に関数を使うと下図のような結果になります。

シリアル値の列には、 =DATEVALUE(B3) のように関数を記述しています。

2024/2/2はシリアル値としては 45324

2024/2/3はシリアル値としては 45325

という値になっていることがわかりますね。

このシリアル値を知ることで、西暦から和暦に変換するきっかけを作っていきます。

昭和→平成→令和に切り替わった日付のシリアル値を求める

前述のとおり、日付は内部的にはシリアル値で扱われています。

それでは実際に、昭和→平成→令和に切り替わった日付のシリアル値を求めていきましょう。

昭和から平成に切り替わったのは1989年1月8日

1989年1月7日までは昭和64年で、1989年1月8日からは平成元年になりましたね。

つまり、1989年1月7日以前は全て昭和ということになります。

正確には1926年12月25日が昭和元年なので、1926/12/25~1989/1/7までが昭和ですが、今回は大正・明治については無視しています。

そして、平成から令和に変わったのは2019年5月1日

2019年4月30日までは平成31年で、2019年5月1日からは令和元年になりました。

これらの切り替わりのキーとなる日付について、DATEVALUE関数でシリアル値を求めると下図のようになります。

シリアル値は1日ごとに1ずつ増えます。

1900/1/1から換算して・・・と耳にしたことがあるので、実際に試したところ、1900/1/1のシリアル値は2でした。そして、1899/12/30が0となり、その日付より古いとマイナスの値になるようです。

つまり、1989年1月7日(シリアル値:32515)より小さい値が帰ってきたら昭和という考え方になります。

シリアル値を元にIFS関数で条件を指定する(まずは昭和)

ここまでの行程で、DATEVALUE関数を使って、昭和→平成→令和の切り替わりとなる日付のシリアル値がわかりました。

つまり、昭和・平成・令和のそれぞれの条件は・・・

  • シリアル値が32515以下のとき、年号は「昭和」
  • シリアル値が32516以上かつ43585以下のとき、年号は「平成」
  • シリアル値が43586以上のとき、年号は「令和」

これら複数の条件分岐をまとめて記述できるIFS関数を利用していきましょう。

IFS関数の構文は以下の通りです。

=IFS(条件1, 値1,条件2, 値2,条件3,値3・・・)

条件1を満たせば値1を出力し、条件1を満たさず条件2を満たした場合は値2を・・・

という関数になります。IF関数の複数条件版です。

まずは最初の条件として「昭和」の条件を満たすか記述していきます。

  • シリアル値が32515以下のとき、年号は「昭和」
  • シリアル値が32516以上かつ43585以下のとき、年号は「平成」
  • シリアル値が43586以上のとき、年号は「令和」

なので、条件1については以下のような記述になります。

(セルA2に日付が入っていると仮定します)

=IFS(DATEVALUE(A2)<=32515,値1,条件2,値2,条件3,値3)

「セルA2の値(日付のシリアル値)が32515以下のとき」

という意味ですね。

その時にどのような結果を出力するのか?の部分が値1の部分になります。

西暦から和暦の計算をする

西暦から昭和にするには、西暦の下2桁から25を引くと和暦の値になります。

(昭和生まれの方は良くご存知かもしれませんね。私は小学校の先生に教えてもらった記憶があります。)

和暦の年を計算するために、日付の「年」だけ取り出すには、YEAR関数を使います。

YEAR関数の構文は以下の通りです。

=YEAR(日付)

セルA2に日付があるとしたら、=YEAR(A2) で西暦の「年」だけ抽出できます。

昭和にするには25を引く必要があるので、

=YEAR(A2)-25

と記述すれば、例えば西暦が1970年であれば、1945という値が計算されます

使いたい値は下2桁のみなので、RIGHT関数を使って2桁のみ抽出します。

RIGHT関数の構文は以下の通り。

=RIGHT(文字列,文字数)

RIGHT関数は指定した文字列の末尾から、指定した文字数だけ出力する関数です。

ちなみにLEFT関数は末尾ではなく先頭からです)

なので、文字列として指定する部分に先ほどの計算式を入れ、文字数を2とすることで、2桁の値(昭和の年数)だけ得ることができます。

=RIGHT(YEAR(A2)-25),2)

このような書き方になりますね。

これで、西暦から和暦(昭和)の数字に置き換えられました。

次に、昭和○○年と表記したいので、①「昭和」という年号 ②西暦から計算した値 ③「年」で終わる

この3つをつなげていきます。

文字の連結にはCONCATENATE関数を使います。

CONCATENATE関数の構文は以下の通り。

=CONCATENATE(文字列1,文字列2,文字列3,・・・)

文字列1に「昭和」、文字列2に「西暦から計算した値」文字列3に「年」を入れていきます。

=CONCATENATE(“昭和”,RIGHT(YEAR(A2)-25,2),”年”)

これで、値1として表示する部分ができあがりました。

IFS関数を使った1つ目の条件、「昭和」の表記がこれでできるようになります。

ここまでの状態をまとめると以下のようになります。

=IFS(DATEVALUE(A2)<=32515,CONCATENATE(“昭和”,RIGHT(YEAR(A2)-25,2),”年”))

実際に試してみた結果がこちらです。

和暦の年だけ表示する仕組みにしているので、月日は表示されていませんが、CONCATENATE関数の後半部分にMONTH関数やDAY関数を追記すれば表示できます。

まだ、昭和の条件しか記述していないので、1989年1月8日以降(平成以降)の値が日付として指定されると、エラー値の#N/Aが返されていますね。

IFS関数で複数条件を指定する(平成の条件)

次は「平成」の条件を指定しています。

IFS関数的には条件2と値2の部分になります。

「平成」の条件は下記の通り・・・

  • シリアル値が32515以下のとき、年号は「昭和」
  • シリアル値が32516以上かつ43585以下のとき、年号は「平成」
  • シリアル値が43586以上のとき、年号は「令和」

シリアル値の条件が2つになります。2つの条件をどちらも満たすときにTRUEを返すAND関数を使っていきます。

AND関数の構文は以下の通り。

=AND(条件1,条件2,条件3・・・)

条件1,2,3・・・と指定した複数の条件を全て満たしたときにTRUEを返します。

「平成」条件は、シリアル値が32516以上 かつ シリアル値が43585以下 のときの2つの条件となるので、AND関数は以下のような記述になります。

AND(DATEVALUE(A2)<=43585,DATEVALUE(A2)>=32516)

これが、条件2(平成となる条件)になります。

「平成」の年を西暦から求めるには、西暦の下2桁に12を足すことで求められます。

「昭和」で記述した時と同様に、CONCATENATE関数で表現していくと、下記のようになります。

CONCATENATE(“平成”,RIGHT(YEAR(A2)+12,2),”年”)

これで、条件2(平成の条件)と値2の記述は完了です。

ここまでで、IFS関数は以下のようになります。

=IFS(DATEVALUE(A2)<=32515,

   CONCATENATE(“昭和”,RIGHT(YEAR(A2)-25,2),”年”),

   AND(DATEVALUE(A2)<=43585,DATEVALUE(A2)>=32516),

   CONCATENATE(“平成”,RIGHT(YEAR(A2)+12,2),”年”))

だいぶ長くなりましたね。

IFS関数目線で、条件1,値1,条件2,値2とわかるように改行して上記では表記してみました。

構文はだいぶ長くなりましたが、一つ一つ見ていくとそれぞれの意味はわかると思います。

実際の結果を見てみましょう。

だいぶ仕上がってきました。

あとは2019年5月1日以降の「令和」の条件を記述するだけです。

IFS関数で複数条件を指定する(令和の条件)

いよいよ最後です。令和の条件を再確認しましょう。

IFS関数の条件3と値3にあたる部分になります。

「令和」の条件は以下の通りです。

  • シリアル値が32515以下のとき、年号は「昭和」
  • シリアル値が32516以上かつ43585以下のとき、年号は「平成」
  • シリアル値が43586以上のとき、年号は「令和」

「昭和」の条件と似た書き方になりますが「以下」ではなく「以上」になります。

今までの例に倣って書くと、条件3(令和となる条件)の書き方は以下のようになります。

DATEVALUE(A20)>=43586

シリアル値が43586(2019年5月1日)以上の場合は・・・という条件です。

そして、西暦から令和の年を計算するには、西暦の下2桁から18を引くことで求められます。

今までと同様、CONCATENATE関数で表現していくと、下記のようになります。

CONCATENATE(“令和”,RIGHT(YEAR(A20)-18,2),”年”)

これで、条件3(令和の条件)と値3の記述は完了です。

ここまでで、IFS関数は以下のようになります。

=IFS(DATEVALUE(A20)<=32515,

CONCATENATE(“昭和”,RIGHT(YEAR(A20)-25,2),”年”),

AND(DATEVALUE(A20)<=43585,DATEVALUE(A20)>=32516),

CONCATENATE(“平成”,RIGHT(YEAR(A20)+12,2),”年”),

DATEVALUE(A20)>=43586,

CONCATENATE(“令和”,RIGHT(YEAR(A20)-18,2),”年”))

かなり長い・・・ですが、これで昭和→平成→令和に和暦変換する関数の組み合わせが完成しました。

実際の結果を見てみましょう。

ここまでの記述で、西暦で表記されていた値を和暦にして表記することができました!

おまけ(0付きの2桁年を1桁に)

作り終わってから気付いたのですが、平成01年とか02年という、「0付きの2桁表示はちょっと・・・」

と思われる方もいると思うので、RIGHT関数の前に一工夫して解消する方法も記載しておきます。

それはVALUE関数を使う方法です。

VALUE(RIGHT(YEAR(A20)-18,2))

VALUE関数は文字列を数値に変換してくれる関数です。

なので、このようにRIGHT関数で得られた値(2桁の文字列)をVALUE関数で数値に変換すると「0」が消えて1桁の数値となります。

個人的には桁の位置が揃う方が好き(見やすいから)なので、使わない構文で解説しましたが、必要に応じてVALUE関数をかませてみてください。

まとめ

だいぶ長い構文となりましたが、一つ一つを見ていくとそれほど難しい関数の組み合わせではありません。

ただ、長いというだけで見辛く理解しづらいという側面はありますが、GASを使わずとも和暦に変換することができましたね。

GASを使うとなると、不慣れな人にはだいぶハードルが高くなってしまいますが、関数であれば、構文の意味をマニュアルとしてちゃんと残しておけば、だいぶハードルが下げられるのではないでしょうか?

関数を組み合わせすぎると見辛くなるのは痒い所ですが、不慣れな人でもメンテナンスしやすい環境はどの方法か考えながら関数を使ってみるのはとても重要な視点だと思います。

にほんブログ村 IT技術ブログへ

コメント