Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » VBAで日付のシリアル値変換はCLng関数で良いのか?

VBAで日付のシリアル値変換はCLng関数で良いのか?

「VBA clng 日付」
という検索キーワードでアクセスがありました。

VBAで、日付データをシリアル値に変換する処理について、調べていた方による検索です。

[スポンサードリンク]

日付データを数値にする場合、元データが日付のみならばCLng関数でもOKなのですが、時刻が含まれるとCLng関数では間違うケースがあります。

日付データをCLng関数でシリアル値に変換する

以下のSubプロシージャを、まずは実行してください。

Sub 日時をCLng関数でシリアル値に変換して良いのか()
 Dim dt As Date
 dt = #4/9/1900#

 Dim dt_Long As Long
 dt_Long = CLng(dt)

 Debug.Print dt_Long; vbTab; CDate(dt_Long)

End Sub

Date型の変数dtに「1900年4月9日」の日付データを代入して、
  Dim dt As Date
  dt = #4/9/1900#

CLng関数を使って変換した整数をLong型の変数dt_Longに代入します。
  Dim dt_Long As Long
  dt_Long = CLng(dt)

CLng関数で変換後の整数と、その整数を日付に再度変換して出力しています。
  Debug.Print dt_Long; vbTab; CDate(dt_Long)

結果は、以下のとおりです。

 100     1900/04/09 

「1900年4月9日」のシリアル値「100」と、「100」を再度日付に変換した「1900/04/09」が出力されます。特に問題のない結果です。

時刻も含むデータをCLng関数でシリアル値に変換してみると

つづいて、Date型の変数dtへの代入を行っている
  dt = #4/9/1900#
の部分を、
  dt = #4/9/1900 6:00:00 PM#
に変更して、再度実行してください。

今度の出力結果は、以下のとおりです。

 101     1900/04/10 

元のデータは「1900年4月9日 午後18時」だったのですが、翌日の「1900/04/10」が出力されています。

「1900年4月9日 午後18時」はシリアル値としては本来「100.75」なのですが、CLng関数では丸められて「101」になってしまいます。「101」を日付に変換したため、元の日付「1900年4月9日」の次の日付「1900/04/10」が出力されたのです。

これが、元データに時刻が含まれると、CLng関数では間違った値になるケースです。

日時をシリアル値変換して日付を表す整数を取得する

これを改善するには、CLng関数ではなく、CDbl関数とInt関数を組み合わせます。

具体的には、
  dt_Long = CLng(dt)
を、
  dt_Long = Int(CDbl(dt))
としてください。

CDbl関数で倍精度浮動小数に変換してから、
  dt_Long = Int(CDbl(dt))
Int関数で整数部分のみを取得しています。
  dt_Long = Int(CDbl(dt))

これならば先ほどダメだった
  dt = #4/9/1900 6:00:00 PM#
のようなケースもOKです。

最終更新日時:2021-05-15 10:55

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » VBA関数 » VBAで日付のシリアル値変換はCLng関数で良いのか?

「VBA関数」の記事一覧

検索


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

.