こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCEL VBA---IsDate

お知恵をお貸し下さい。

VBAでフォームを作成し、テキストボックスに数字(日付)を入力
(入力→10/7, 表示→2005/10/07)

それを、IsDateで日付かどうかチェックさせたいのですが
下記のコードでは、例えば10月35日と入力してもエラーになりません。
(入力→10/35, 表示→1935/10/01)

2005/10/35と入力すればエラーになってくれるのですが
やはりこの方法しかないのでしょうか?

もし、良い方法がありましたらお教え下さい。


よろしくお願いします。

-----------------------------------------------------------------

Sub Test()

Dim Data As Variant
Data = TextBox16.Text


If IsDate(Data) Then
TextBox16.Value = CDate(Data)
Else
MsgBox ("正しい日付を入力してください。")
End if

End sub

-----------------------------------------------------------------

投稿日時 - 2005-10-07 15:11:24

QNo.1698071

暇なときに回答ください

質問者が選んだベストアンサー

こんにちは。

私の場合、このようなやり方でやっています。ここでは、1945 年にしてみました。

ただ、IsDate と CDate とを、And 条件で行ったりすると、CDate 側で、実行時エラーになります。

If IsDate(Data) Then
 If Year(CDate(Data)) > 1945 Then
  TextBox16.Value = CDate(Data)
 Else
  MsgBox "正しく日付を入れなおしてください。"
 End If
Else
 MsgBox "正しい日付を入力してください。"
End If

投稿日時 - 2005-10-07 15:38:16

お礼

Wendy02さん! こんにちは。

久しぶりにここに質問を書いたのですが
やはりWendy02さんにお会いすることができ、本当にうれしく思います!
Wendy02さんのお名前を拝見し、涙が出る思いです(大げさではありませんヨ!)

いつものことながら、素早く的確なご回答本当にありがとうございます。

私のあの質問内容で、知りたいことも理解して頂き
ありがとうございます!

早速、利用させて頂きます。 ありがとうございました!

投稿日時 - 2005-10-07 15:54:39

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

下のVBA(2)を作成したのですが、その前にfk_sapさんの作成された
モジュールをそのまま動かしてみましたが、期待通りエラーに
なりました。よってIsDateは正しく機能していると思います。
失礼ですが、このモジュールを TextBox16_LostFocus()に組入れて
テストをすると動作しましたが、別にマクロとして動かすと
1935/10/01などになります。どこが違うのか分りませんがTEXTボックスの
PrivateSubとしてテストお願いします。


(1)正しく動きます。
Private Sub TextBox16_LostFocus()
Dim Data As Variant
Data = TextBox16.Text


If IsDate(Data) Then
TextBox1.Value = CDate(Data)
Else
MsgBox ("正しい日付を入力してください。")
End If
End Sub
-----------------

(2)以下は別の検査方法


例えば次のようにして、YYY=年 MMM=月 DDD=日付を求めて
検証します。
Sub Test()
Dim Data As Variant
Dim DDD,MMM,YYY,OK as Integer
Data = TextBox16.Text

OK=0
If IsDate(Data) Then
'日付のチェック
YYY=Year(Data)
MMM=Month(Data)
DDD=Day(Data)
If MMM>12 then OK=1
If DDD>31 then OK1
IF MMM=2 and DDD>28 then OK=1
IF (MMM=4 or MMM=6 or MMM=9 or MMM=11) and DDD>30 then OK=1
' (本当はうるう年のチェックが必要なのですが、省略します)
Else
OK=1
End If

If OK=0 then
TextBox16.Value = CDate(Data)
Else
MsgBox ("正しい日付を入力してください。")
End if

End sub

投稿日時 - 2005-10-07 15:55:36

お礼

laputartさん! 大作をありがとうございました。

少しの時間違いで、No.2さんが私の求めていた通りの回答を下さいましたので
それを利用させて頂こうかと思っていたところに
laputartさんのお答えを拝見しました。

まだ目を通させてもらっていないのですが
わざわざ、色々と書いて下さいましたので、ゆっくり拝見させて頂き
今後の私の糧とさせて頂きます。

本当にありがとうございました。

投稿日時 - 2005-10-07 16:01:47

ANo.1

Data = Format(Year(Date),"0000") & "/" & TextBox16.Text
で強制的に今の年を設定するとかすればいいのでは?
それとも年を入れる場合もあるのですか?

投稿日時 - 2005-10-07 15:27:18

補足

mshr1962さん!
先程「他にも方法があれば」などど、調子のいいことを書きましたが
No.2さんが、良い方法を教えて下さいましたので
それを利用させて頂くことにしました。

ありがとうございました。

投稿日時 - 2005-10-07 15:55:24

お礼

早速ご回答ありがとうございます!

なるほど、教えて頂いた通りにすれば
10月35日だとエラーがかかりますよねー。

でも、そうなんです・・・
ほとんどは本年の日付なのですが、来年等の日付を入力する場合もあるんです・・・。

せっかく教えて頂いたのに、すみませんでした。

もしも(もしも!)、他にありましたらよろしくお願いします。

投稿日時 - 2005-10-07 15:38:09

あなたにオススメの質問