Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » 日付をYYYYMMDD文字列に変換するユーザー定義関数

日付をYYYYMMDD文字列に変換するユーザー定義関数

対象:Excel2007, Excel2010, Excel2013

「vba関数 日付けからスラッシュを取る」
「vba 日付 変換 yyyymmdd」
という検索でこのサイト・インストラクターのネタ帳へのアクセスがありました。

例えば、「2014/8/22」のような日付データから、「/」(スラッシュ)を取り除いたYYYYMMDD形式の「20140822」という文字列データに変換する、VBA(Visual Basic for Applications)のコードを探している方による検索です。

[スポンサードリンク]

日付をYYYYMMDD形式の文字列にするユーザー定義関数

参考になりそうな、日付を「YYYYMMDD」形式の文字列に変換する、ユーザー定義関数・Functionプロシージャをご紹介しておきます。

▼日付データをYYYYMMDD形式の文字列にするユーザー定義関数

Function YYYYMMDD(日付 As Date) As Variant
 If 日付 >= #3/1/1900# Then
  YYYYMMDD = Format(日付, "yyyymmdd")
 Else
  YYYYMMDD = CVErr(xlErrValue)
 End If
End Function

上記のFunctionプロシージャを標準モジュールに作成しておくと、このYYYYMMDD関数を使って、下図のようにワークシート上で、

日付をYYYYMMDD文字列に変換するユーザー定義関数

日付データからスラッシュを抜いたテキストデータに変換することができます。

ユーザー定義関数の解説

メインの処理は、
  YYYYMMDD = Format(日付, "yyyymmdd")
の部分です。Format関数で引数に指定された日付データを「yyyymmdd」形式の文字列にしています。

扱う日付データが最近の日付しかないと限定されているのなら、以下のようなFunctionプロシージャでも、まあ、いいでしょう。
 Function YYYYMMDD_(日付 As Date) As String
  YYYYMMDD = Format(日付, "yyyymmdd")
 End Function

ですが、このFunctionプロシージャでは、誤った文字列が返されるケースがあります。「1900/3/1」よりも前の日付のときに1日分ずれた文字列が返されてしまうのです。

例えば、Excelで扱えるもっとも古い日付データ「1900/1/1」を指定した場合には、「19000101」ではなく「18911231」という文字列が返されます。

これは、Excelでは存在しないはずの1900年2月29日が存在している仕様になっていることが関係しています。

Excelは存在しないはずの1900年2月29日が存在している仕様になっているのに対して、VBAは、1900年2月29日は存在しないように正しく作られています。このため1900年3月1日より前の日付では、ExcelとVBAとでは1日ずれていることになります。

「1900年3月1日」のシリアル値はExcelでもVBAでも「61」です。
ですがその1日前に該当する「60」というシリアル値の場合、Excelでは存在しない「1900年2月29日」、VBAでは「1900年2月28日」として扱われます。

そのため
 Function YYYYMMDD_(日付 As Date) As String
  YYYYMMDD = Format(日付, "yyyymmdd")
 End Function
というFunctionプロシージャにした場合は1900年3月1日より前の日付でズレが生じてしまいます。

そのためここでは、1900年3月1日以降のときにFormat関数でYYYYMMDD形式の文字列を返し、
 If 日付 >= #3/1/1900# Then
  YYYYMMDD = Format(日付, "yyyymmdd")

そうでなければ、即ち1900年3月1日より前ならエラーを返すようにしています。
 Else
  YYYYMMDD = CVErr(xlErrValue)

1900年3月1日より前の日付の場合に、このユーザー定義関数が何を返すべきなのかは、さまざまな考え方がありそうですが、ここではCVErr関数と定数・xlErrValueを使って#VALUE!エラーが表示されるようにしました。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » ユーザー定義関数 » 日付をYYYYMMDD文字列に変換するユーザー定義関数

「ユーザー定義関数」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.