「VBA clng 日付」
という検索キーワードでアクセスがありました。
VBAで、日付データをシリアル値に変換する処理について、調べていた方による検索です。
日付データを数値にする場合、元データが日付のみならばCLng関数でもOKなのですが、時刻が含まれるとCLng関数では間違うケースがあります。
日付データをCLng関数でシリアル値に変換する
以下のSubプロシージャを、まずは実行してください。
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 SubDate型の変数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関数で良いのか?