IsDate関数の使い方
マクロで日付かどうかを調べるときはIsDate関数を使用します。
値が数値の場合はtrueを返し、数値でない場合はfalseを返します。
ループ処理でセルの値が日付かどうか調べる方法
IsDate関数の使用例として、エクセルシートのA列に入力されているセルの値を順番に調べて、結果をB列に書き出す処理を実行してみます。
A列の1行目~11行目まで日付(風のものを含め)を色々な形式で入力しています。
サンプルマクロで実行している内容
①Forループで1行目~11行目まで繰り返す
②A列のセルの値が日付かどうか調べる
③日付の場合はB列に「日付です」と出力する
④日付ではない場合はB列に「日付ではありません」と出力する
Sub sample1()
'1行目~11行目まで調べる…⓵
For i = 1 To 11
'A列の値が日付の場合…⓶
If IsDate(Cells(i, 1)) = True Then
'B列に結果を出力…⓷
Cells(i, 2) = "日付です"
'日付ではない場合
Else
'B列に結果を出力…⓸
Cells(i, 2) = "日付ではありません"
End If
Next
End Sub
▽マクロ実行後
B列に実行結果が出力されました。
1行目~7行目までは日付を書式設定で色々な表示形式にしたもので「日付です」と出力されています。
8行目の「20241120」はYYYYMMDD形式で数字を並べていますが、これは日付とは認識してもらえません。
9行目の「45616」は2024/11/20の日付を数値形式(シリアル値)で表示させていますが、これも「日付ではありません」となります。
10行目と11行目は「2025年01月01日」と「2025年1月1日」と文字列で入力していますが、日付の形式と認識してくれるので「日付です」と出力されています。
インプットボックスに入力された値が日付かどうか判定する方法
次はインプットボックスに入力された値が日付かどうかを判定する方法について説明します。
サンプルマクロで実行している内容
①インプットボックスを表示してユーザーに値を入力してもらう
②入力された値が日付かどうか調べる
③日付の場合は「日付が入力されました。」のメッセージボックスが表示される。
④日付ではない場合は「日付を入力してください。」のメッセージボックスが表示される。
Sub sample2()
Dim InputValue As Variant
'インプットボックスに値を入力してもらう…⓵
InputValue = Application.InputBox(Prompt:="日付を入力してください")
'入力された値が日付かどうか調べる…⓶
If IsDate(InputValue) Then
'日付の場合…⓷
MsgBox "日付が入力されました。", vbInformation, "確認結果"
Else
'日付ではなかった場合…⓸
MsgBox "日付を入力してください。", vbCritical, "確認結果"
End If
End Sub
ユーザーが入力した日付の値を受け取って処理を行う場合はこのように日付かどうかをチェックして、日付でない場合はエラーメッセージを出力すると良いです。
【応用編】文字列を日付に変換する(DateValue関数)ときにIsDate関数でエラー対策をする
次はIsDate関数を使った応用編です。
文字列を日付型に変換するときはDateValue関数を使用して変換します。
下のエクセルシートではA列に日付を表す文字列が入力されていて、これをマクロで日付型に変換してB列に出力していきます。
DateValue関数を使って2行目~11行目まで変換していきます。
Sub sample3()
'2行目~11行目まで繰り返す
For i = 2 To 11
’A列の文字列を日付に変換してB列に出力する
Cells(i, 2) = DateValue(Cells(i, 1))
Next
End Sub
実行してみると9行目に「2025ねん01がつ08にち」と入力されていて、日付に変換できない文字列があるので実行時エラー「型が一致しません」が出力されてしまいました。途中でエラーが発生してマクロが止まってしまったので10行目以降は実行されていません。
このようなDateValue関数を使用する場面で、先にIsDate関数を使用して文字列⇒日付に変換できるのかを調べてからDateValue関数を実行するようにするとエラー停止することなく処理が実行できます。
サンプルマクロで実行している内容
①2行目~11行目までを繰り返す
②A列の値が日付に変換できるか調べる
③変換できる場合はB列に日付型で出力する
④日付に変換できない場合
⑤B列にエラーメッセージを出力する
Sub sample3_1()
'2行目~11行目まで調べる…⓵
For i = 2 To 11
’A列の値が日付に変換できる場合…⓶
If IsDate(Cells(i, 1)) = True Then
’B列に日付型で出力する…⓷
Cells(i, 2) = DateValue(Cells(i, 1))
’日付に変換できない場合…⓸
Else
’B列にエラーメッセージを出力する…⓹
Cells(i, 2) = "エラー:日付ではありません"
End If
Next
End Sub
▽マクロ実行後
B列に結果が出力されました。
9行目は日付に変換できないため「エラー:日付ではありません」が出力されています。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。