※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|IsDate関数で値や変数が日付かどうかを判定するマクロをつくる

エクセルVBAのIsDate関数のトップ画像

IsDate関数について

VBAのIsDate関数は値や変数が日付であるかを確認する関数です。

システムやマクロにおいてユーザーからの入力を処理に利用するときは、受けとった値が数値に変換できるかを判定します。
また、値がひとめでは日付にみえるものであっても、それが実在する日付であるかの判定も可能です。例えば、2023年2月29日とユーザーから入力されたとき、うるう年ではない2023年に2月29日は存在しない日付であることをIsDate関数では判定することが可能です。

IsDate関数による判定結果は、真偽値(Boolean)となるため、TrueまたはFalseで返します。


独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

IsDate関数がつかえる場面

InputメソッドやInput関数をつかったマクロや、セルやユーザーフォームに入力された値の判定に使うことができます。例えば、何かしらユーザーフォームにおいて日付を入力する場面や、エクセルのシートやセルで日時を記録する場面などは少なくないので使い勝手は良い関数と言えます。

また、フォームやセルを作成した人が想定していない値の入力させたくない場合の不具合発生の予防や、入力された値のあやまりをチェックすることにも使えるでしょう。

IsDate関数の使いかた

IsDate関数の構文と戻り値について紹介します。

IsDate関数の構文

IsDate(値または変数)

※値または変数(expression)の指定は必須のため、省略した場合はエラーとなります。

IsDate関数の判定結果について

IsDate関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。

指定した値や変数が日付である場合はTrueそれ以外と判定された場合はFalseが返ってきます。

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関数をつかってユーザーから入力ボックスに入力された値が日付かどうか判定します。

IsDate関数で入力された値が日付かどうか判定する

  
Option Explicit

Sub IsDate_macro1()

    '入力された値を代入する変数を宣言する
    Dim User_Val As String
    
    'InputBox関数でユーザーから入力された値を変数「User_Val」に代入する
    User_Val = InputBox("日付を入力してください", "数値を入力", "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

06行目

変数User_Valを宣言します。のちほどこちらの変数をIsDate関数の引数にしていきます。

09行目

InputBox関数で入力ボックスを表示します。入力された値はUser_Valに代入します。

InputBox関数で表示される入力画面

Application.InputBoxメソッドをつかう方法もある

ユーザーからの入力に対するほかの制限方法として、Application.InputBoxメソッドの引数である”Type”を指定する方法もあります。また、指定された条件の値が入力されるまで入力画面をくり返し表示する方法もあります。

11行目

変数User_Valに代入された値が10ケタ以上かどうかを判定して結果によってそのあとの処理を分岐します。判定方法にはLen関数による判定で11文字以上であったときはエラーメッセージを表示してマクロを終了します。一方、10文字以内であったときは18行目のIsDate関数の判定に移ります。

なぜ10文字以内で判定?

Len関数で判定する文字数は、日付の表示形式を”YYYYMMDD”とした場合、20240101となります。これを文字数でいえば8文字となり、ここに年と月、月と日の数値の間にはスラッシュ(/)を記入するため、8文字+2文字で10文字を最大文字数としています。

18行目

IsDate関数を利用してUser_Valが日付だと判定された場合とそうでない場合で処理が分岐します。

判定の結果によって、以下のメッセージを表示します。

InputBox関数で指定範囲の値が入力されるまで入力画面を表示するマクロはこちらを参考にしてください。

\指定の値が入力されるまで入力画面を表示するマクロはコチラ/

Application.InputBoxメソッドの使いかたについては以前の記事をご覧ください。

\入力される文字を制限する方法が知りたいならコチラ/

Len関数などの文字列操作に便利な関数は以下の記事をご覧ください。

\文字列操作に便利な関数はコチラ/

IsDate関数でセル上の値が日付かどうか判定する

つぎのサンプルマクロは、ワークシート上の値を日付かどうか判定して、日付なら追加の処理を実行するマクロです。

  
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) '変数に代入した値が日付であるかの判定結果をC列に記入する

            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

06行目と07行目

変数Varとくり返し処理で使用する変数のiを宣言します。

10行目

コードを効率的に書くためにWithステートメントでシートオブジェクトを指定します。

12行目

ForNextステートメントでくり返しを指定します。このコードの場合、シートのA列の2行目から最終行までくり返すといった指示になります。

13行目

A列の値を変数Varに代入します。

14行目

Varに代入した値をIsDate関数で判定して結果であるTrueまたはFalseをC列に記入します。

15行目と16行目

Varに代入した値をIsDate関数で判定します。判定結果がTrueであったときはFormat関数で表示形式を変更してD列と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には数値以外にも値や変数を判定する関数があります。関数名をクリックするとそちらの記事にジャンプします。

IsArray関数

 値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNumeric関数

 値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsEmpty関数

 値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsError関数

 値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNull関数

 値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsObject関数

 値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました