プロが教えるわが家の防犯対策術!

VBAの日付チェックでオーバーフローを回避したい。

ExcelのG列のセルに入力されたものが日付型であるかどうかのチェックかけたいと思います。

以下のコードだと、数字2958466以上の入力でオーバーフローが発生します。
これを回避する方法はありますか?

セルを日付型に設定しているため、2958465(2999/12/31)までしか判別できないのでしょうが、
利用者が2958466以上を入力してしまう可能性はあります。
オーバーフローではなく、エラーメッセージが出せたら・・・と思います。



Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 8 Then
Application.EnableEvents = False
If Target <> "" And Not IsDate(Target) Then
MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー"
Target = ""
Target.Select
End If
Application.EnableEvents = True
End If

End Sub


こんなコードも試しましたが、結果は同じでした。


Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 8 Then
Application.EnableEvents = False
If Target > 2958466 Then
MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー"
Target = ""
Target.Select
Else
If Target <> "" And Not IsDate(Target) Then
MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー"
Target = ""
Target.Select
End If
End If
Application.EnableEvents = True
End If

End Sub


On Error Resume Next や
On Error GoTo ... での対処も考えましたが、同じ結果でした。


何か良い方法がありましたら、お願いいたします。

A 回答 (6件)

Private Sub Worksheet_Change(ByVal Target As Range)


  If Target.Column <> 8 Then Exit Sub
  On Error GoTo line
  If Target <> "" And (Not IsDate(Target)) Then
    MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31, 9999/12/31まで)", vbCritical, "入力エラー"
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
  End If
  Exit Sub
line:
  MsgBox "入力ミスでは?" & vbCrLf & "9999/12/31を超えてます!", vbCritical, "入力エラー"
  Application.EnableEvents = False
  Application.Undo
  Application.EnableEvents = True
End Sub

では?
    • good
    • 0
この回答へのお礼

ありがとうございました。
この方法でやってみたら、うまくできました。
On Error GoTo も、ちゃんと動いてくれました。

お礼日時:2010/10/26 16:17

>セルを日付型に設定しているため、2958465(2999/12/31)


本当は、ここが問題です。日付型は、マクロですればよいのです。それを予め設定しているので、エラーが発生します。一応、以下は便宜的な措置を施しました。

本来は、ご質問の2番目のイベントで十分で、必要なら、全てのチェックが通った後に、書式をその都度設定すれば良いわけです。それと、Target.ClearContents の代わりに、Target.Clear で書式設定も消してしまうわけです。そうすれば、オーバーフローのエラーは発生しません。ただし、必ず、Text プロパティで判定しないといけません。


'//書式を残したままの処理
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim dum As Variant
 If Target.Column <> 8 Then Exit Sub
 If Target.Count > 1 Then Exit Sub
 Application.EnableEvents = False
 On Error Resume Next
 'エラー処理
 dum = Target.Value
 If dum = "" Then
  Target.ClearContents
  Application.EnableEvents = True
  Exit Sub
 End If
 On Error GoTo 0
 Application.EnableEvents = False
 If Not IsDate(Target.Text) Then
  MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー"
  Target.ClearContents
 ElseIf Abs((Year(Date)) - Year(CDate(Target.Text))) > 100 Then
  MsgBox "正しい年月日を入力してください。" & vbCrLf & _
  Year(CDate(Target.Text)) & "年", vbCritical, "入力エラー"
  Target.ClearContents
 End If
 Application.EnableEvents = True
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
大変勉強になりました。

お礼日時:2010/10/26 16:19

No1です。


IsDate使ってましたね<m(__)m>

指定したセルに入力制限をかけては如何ですが?
範囲外の値が入力された場合のメッセージも指定できます。

参考URL
http://hp.vector.co.jp/authors/VA014071/tips/val …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
入力規則を使うと、ファイルの容量が大きくなるので、
避けたいです。

お礼日時:2010/10/26 16:04

If Target <> "" And Not IsDate(Target) Then


MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31)", vbCritical, "入力エラー"
のところ,下記ではだめですか。


If Target <> "" And (Not IsDate(Target)) Or Target > 2958465 Then
MsgBox "日付型で入力してください。" & vbCrLf & "(例:2010/10/31, 9999/12/31まで)", vbCritical, "入力エラー"
    • good
    • 0
この回答へのお礼

ありがとうございました。
何とかうまくいきました。

お礼日時:2010/10/26 16:16

どうしてもVBAでしょうか。


普通に入力規則を使って入力できないようにするのが近道ではないでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
入力規則を使うと、ファイルの容量が大きくなるので、
避けたいです。

お礼日時:2010/10/26 15:49

IsDate関数で日付かどうかのチェックを行ってはどうですか?



参考URL
http://www.kanaya440.com/contents/script/vbs/fun …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
IsDateで日付のチェックは行っています。
しかし、入力確定後のチェックなので、
オーバーフローが出てしまうのです。。。

お礼日時:2010/10/26 13:00

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A