IsDate関数について
VBAで値や変数が日付であるかを確認する関数です。
システムやマクロにおいてユーザーからの入力を処理に利用するときは、受けとった値が数値に変換できるかを判定します。
また、値がひとめでは日付にみえるものであっても、それが実在する日付であるかの判定も可能です。例えば、2023年2月29日とユーザーから入力されたとき、うるう年ではない2023年に2月29日は存在しない日付であることをIsDate関数では判定することが可能です。
IsDate関数による判定結果は、真偽値(Boolean)となるため、TrueまたはFalseで返します。
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
IsDate関数がつかえる場面
InputメソッドInput関数をつかったマクロや、セルやユーザーフォームに入力された値を判定につかいます。例えば、顧客情報を入力するユーザーフォームにおいて、電話やFAXの番号や郵便番号などの入力、または商品情報を入力するときの価格などの判定をして入力あやまりを予防できます。
また、セルに入力された値が数値であるかのチェックなどで利用することもできます。本来数値以外を入力させたくないセルであった場合、マクロで予防していることが最善策と言えますがすでに入力された値に対してチェックすることも可能です。
IsDate関数の使いかた
IsDate関数の構文と戻り値について紹介します。
IsDate関数の構文
構文
IsDate(値または変数)
※値または変数(expression)の指定は必須のため、省略した場合はエラーとなります。
IsDate関数の判定結果について
IsDate関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。
指定した値や変数が日付である場合はTrue、それ以外と判定された場合はFalseが返ってきます。
IsDate関数の結果の一覧
No | 判定する値 | 説明 | 判定結果 (True or False) |
---|---|---|---|
1 | 123 | 数値 | False |
2 | -123 | 数値(負の数値) | False |
3 | “123” | 文字列で半角の数値 | False |
4 | “123” | 文字列で全角の数値 | False |
5 | “-123” | 文字列で全角の数値(符号は半角) | False |
6 | “ー123” | 文字列で全角の数値(符号も全角) | False |
7 | 202401212 | 8桁の数値 | False |
8 | “20241212” | 8桁の数値(全角) | False |
9 | “あいう” | 文字列でひらがな | False |
10 | “アイウ” | 文字列でカタカナ | False |
11 | “一二三” | 文字列で漢数字 | False |
12 | “ⅠⅡⅢ” | 文字列でローマ数字 | False |
13 | “ABC” | 文字列でABC | False |
14 | “2024/1/31” | 日付(文字列) | True |
15 | #1/31/2024# | 日付(リテラル値) | True |
16 | “2024年1月31日” | 日付(西暦) | True |
17 | “令和6年1月31日” | 日付(和暦) | True |
18 | “12:12:12” | 時刻 | True |
19 | Date関数 | 現在の日付が返ってくるためTrueとして判定される | True |
20 | Time関数 | 現在の時刻が返ってくるためTrueとして判定される | True |
21 | Now関数 | 現在の日付と時刻が返ってくるためTrueとして判定される | True |
22 | 空白 | False | |
23 | 0 | 数値の0 | False |
24 | ActiveSheet.Range(“A1”) | セルの座標(対象セルは空白) | False |
25 | ActiveSheet.Range(“A1”).Value | セルの座標(対象セルは空白)のValueプロパティ | False |
26 | ActiveSheet.Range(“A1”).Text | セルの座標(対象セルは空白)のTextプロパティ | False |
27 | True | 真偽値の「True」は-1とみなされるため数値として判定される | False |
28 | False | 真偽値の「False」は0とみなされるため数値として判定される | False |
29 | Empty | Emptyは0とみなされるため数値として判定される | False |
30 | Null | Null値 | False |
31 | 指定なし | 指定なし | エラー |
IsDate関数をつかったサンプルマクロ
ここではIsDate関数をつかったマクロを紹介します。
サンプルマクロ
Option Explicit Sub IsDate_macro1() '入力された値を代入する変数を宣言する Dim User_Val As String 'InputBox関数でユーザーから入力された値を変数「User_Val」に代入する User_Val = InputBox("日付を8桁までの数字で入力してください", "数値を入力", "1900/1/1") If Len(User_Val) > 10 Then '入力された値が10文字よりも多い場合 MsgBox "10桁以上は入力できません", vbCritical + vbOKOnly, "入力不正通知" Exit Sub 'マクロの動作を終了する Else If IsDate(User_Val) = True Then '入力された値が数値かどうかを判定する MsgBox "入力された値は日付です。", vbInformation + vbOKOnly '数値である Else MsgBox "入力された値は日付ではありません。", vbCritical + vbOKOnly '数値ではない End If End If End Sub
こちらのマクロでは、InputBox関数をつかって入力画面を表示し、ユーザーに値の入力を促します。
ユーザーより入力された値を変数「User_Val」に代入し、IsDate関数で数値かどうかを判定し、さいごにIf文をつかって条件分岐をし、判定結果におうじてメッセージボックスを表示します。
こちらのサンプルマクロでは、10文字よりも多い文字数が入力された場合、マクロを終了する処理をします。入力された値が5文字よりも多いかはLen関数をつかって判定し、10文字以下であれば、その文字列が数値であるかの処理に進みます。
なお、10文字の理由はYYYYMMDDと日付を入力する場合、20240101と入力されます。これは文字数でいえば、8文字となります。ここに年と月、月と日のそれぞれの間にはスラッシュ(/)を記入するため、8文字+2文字で10文字を最大文字数としています。
ほかの処理として、指定された範囲の値が入力されるまで入力画面をくり返し表示する方法もあります。また、InputBox関数をつかう方法以外にも、ユーザーからの入力に対する制限方法として、Application.InputBoxメソッドの引数である「Type」を指定する方法もあります。
InputBox関数で指定範囲の値が入力されるまで入力画面を表示するマクロはこちらを参考にしてください。
Application.InputBoxメソッドの使いかたについては以前の記事をご覧ください。
Len関数などの文字列操作に便利な関数は以下の記事をご覧ください。
つづいて、ワークシート上の値を日付かどうか判定して、日付なら追加の処理を実行するマクロです。
サンプルマクロ
Option Explicit Sub IsDate_macro2() 'ワークシートに書かれた値を指定の表示形式日付に変更する Dim Var As String 'セルの値を代入する変数 Dim i As Long 'くり返し用の変数 '作業対象シートをWithで指定する With ThisWorkbook.Worksheets("対象シート") For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row '最終行までくり返す Var = .Cells(i, 1).Value 'A列の値を変数に代入 .Cells(i, 3) = IsDate(Var) '変数に代入した値が日付であるかの判定結果をD列に記入する If IsDate(Var) = True Then '日付にできる値であった場合 .Cells(i, 4) = Format(Var, "yyyy年m月d日") '値を西暦に置換してD列に出力する .Cells(i, 5) = Format(Var, " ggge年m月d日") '値を和暦に置換してE列に出力する End If Next i End With End Sub
このマクロで実行する内容は、以下のとおりです。
- A列に記入されている値を変数に代入する
- 変数の値が日付であるかをIsDate関数で判定する
- 日付であった場合は、Format関数で”yyyy年mm月dd日”形式に変換したものをD列に記入する
- 日付であった場合は、Format関数で”ggge年mm月dd日”形式に変換したものをE列に記入する
マクロの実行前と実行後の結果は以下のとおりです。
実行結果(実行前)
A列 | B列 | C列 | D列 | E列 | |
---|---|---|---|---|---|
1 | 判定する値 | 説明 | IsDate関数の判定 (True or False) |
format関数で西暦に表示変更 | format関数で和暦に表示変更 |
2 | 45292 | エクセルのシリアル値(2024/1/1) | |||
3 | 2024/1/1 | 西暦の日付 | |||
4 | 令和6年1月1日 | 和暦の日付 | |||
5 | R6.1.1 | 短縮表示の日付 | |||
6 | 20240101 | 8桁の数値 |
実行結果(実行後)
A列 | B列 | C列 | D列 | E列 | |
---|---|---|---|---|---|
1 | 判定する値 | 説明 | IsDate関数の判定 (True or False) |
format関数で西暦に表示変更 | format関数で和暦に表示変更 |
2 | 45292 | エクセルのシリアル値(2024/1/1) | False | ||
3 | 2024/1/1 | 西暦の日付 | True | 2024年1月1日 | 令和6年1月1日 |
4 | 令和6年1月1日 | 和暦の日付 | True | 2024年1月1日 | 令和6年1月1日 |
5 | R6.1.1 | 短縮表示の日付 | True | 2024年1月1日 | 令和6年1月1日 |
6 | 20240101 | 8桁の数値 | False |
C列にIsDate関数の判定結果(TRUEorFALSE)を入力しています。
判定結果がTRUEになったものだけを対象にD列には、A列の値を西暦表示形式に変換したものを、E列にはA列の値を和暦表示形式に変換したものを記入する処理をしています。変換にはFormat関数を利用しています。
こちらのサンプルマクロで利用している、くり返し処理や条件分岐は以下の記事で紹介しています。
詳しくはそれぞれのリンクより記事をご確認ください。
IsDate関数のような値や変数を判定する関数はほかにもある
VBAには数値以外にも値や変数を判定する関数があります。
値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント