プロが教える店舗&オフィスのセキュリティ対策術

■質問内容
日付を認識して時刻を認識しない理由を知りたい

■状況

下記コードを書きました。

Sub 日付を判別()

  Dim rng As Range
  
  For Each rng In Cells(1, 1).CurrentRegion
    
    If IsDate(rng) Then Debug.Print rng
  
  Next
  
End Sub

画像のシート内容で日付であれば書き出すという記述ですが、想定ではB列も書き出されるのですが、実際にはA列のみが書き出されます。
IsDateは日付及び時刻であればTrueを返すという認識でしたが、これが違うのか別の理由かわかりません。
なお、A列B列とも中身はシリアル値(数値)でセルの書式設定の表示形式で時刻にしています。

■動作環境
OS 名:Microsoft Windows 10 Pro
OS バージョン:10.0.16299 N/A ビルド 16299
OS 製造元:Microsoft Corporation
プロセッサ:Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2400 Mhz
BIOS バージョン:TOSHIBA Version 2.20 , 2012/06/22
物理メモリの合計:3,988 MB
Excel バージョン:14.0.7192.5000(32ビット) Microsoft Office Standard 2010の一部


以上、ご存知の方ご教示いただければ幸いです。

「VBA 日付・時刻の判別 時刻を認識しな」の質問画像

A 回答 (5件)

こんにちは



確かにご指摘の様な結果になりますね。
↓を読んでも、解釈してくれそうに思いますが、時刻のみや時刻付の日付はValue値で判断させるとFalse判定になるようです。
https://docs.microsoft.com/ja-jp/office/vba/lang …

対処療法的ではありますが、以下の様にすることでご期待の結果を得ることは可能なようです。
 If IsDate(rng.Text) Then Debug.Print rng.Value
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
おかげさまで解決しました。

お礼日時:2019/05/16 10:13

少々誤植がありましたので訂正します


ISDATEで判定できるのは日付型の文字列のようです
そのため数値では全てFalseで返ってくる仕様のようです
但し"0A"などでもTrueが返ってきます(この変はバグの疑いあり)
Value値を指定すると数値となるのですが、日付のみの場合内部的に日付と識別する何かがあるのか、正常にTrueが返ってきますが(笑)
とりあえず文字列にすれば良いので、先ほど回答したTextを参照するか、Cstr関数等で文字列に置き換えるか・・・手間なだけですね
やはりTextを参照するのが好ましいと思います
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2019/05/16 10:13

ISDATEで判定が行えるのはシリアル値の整数のみのようです


時間はVALUE値を確認すると小数ですので、全てFalseとなります
そのためNo1の方が回答されているようにrng.Textにすると希望するデバッグ結果が得られます
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2019/05/16 10:13

No.2の続きです。


IsDate(rng+1) AND (rng > 0) かな
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2019/05/16 10:13

Exel VBAでは日付なしの時刻は1900年1月0日の時刻として表します。


IsDate関数では値の整数部が1以上かを判定するので時刻のみはFALSEになります。

判定をrng+1にすれば日附がオーバーフローしない限り動くのでは無いかと思います。
(テストしていません、あしからず)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2019/05/16 10:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!