アプリ版:「スタンプのみでお礼する」機能のリリースについて

失礼いたします、生年月日、基準日をテキストボックスに入力し、年齢を算出するマクロを作成してるのですが質問です。
以下のようなマクロを組んでいるのですが。

Dim 生年月日 As String
Dim 開始日付 As String
Dim 年齢 As String
生年月日 = "H" + UserForm1.TextBox1.Value + "/" + UserForm1.TextBox2.Value + "/" + UserForm1.TextBox3.Value
年齢基準日 = "H" + UserForm4.TextBox1.Value + "/" + UserForm1.TextBox5.Value + "/" + UserForm1.TextBox6.Value

年齢 = Application.Evaluate("=datedif(""" & Format(生年月日, "yyyy/mm/dd") _
& """,""" & Format(年齢基準日, "yyyy/mm/dd") & """,""y"")")

上記のようにそれぞれH”年”/”月”/”日”という形で取得しています。
この場合、適正な値が入力されると上手くいきますが、日付として成立しない値(例えば月に80など)を入力した場合にエラーが発生します。
エラーが発生した場合にエラー処理(例としてMsgBox+Goto処理)をしたいのですがどのようなコードを記入すればいいでしょうか?

A 回答 (4件)

IsDate関数にて、変数が日付になってるかどうか


確認してみてはどうでしょう。

If IsDate(生年月日) = False Then ~~~
    • good
    • 0
この回答へのお礼

=galse という書き方があるのですね、知りませんでした
ありがとうございます。
解決しそうです。

お礼日時:2009/12/24 16:35

シートにコマンドボタンなので、元のプログラムと少し違いますが、こんな感じ。



Private Sub CommandButton1_Click()
Dim 生年月日 As String
Dim 開始日付 As String
Dim 年齢 As String

On Error GoTo error_exit

生年月日 = "H" + Range("A1").Text + "/" + Range("B1").Text + "/" + Range("C1").Text
年齢基準日 = "H" + Range("A2").Text + "/" + Range("B2").Text + "/" + Range("C2").Text

年齢 = Application.Evaluate("=datedif(""" & Format(生年月日, "yyyy/mm/dd") _
& """,""" & Format(年齢基準日, "yyyy/mm/dd") & """,""y"")")
Range("A3").Select
Selection.Value = 年齢

nomal_exit:
Exit Sub

error_exit:
Range("A3").Select
Selection.Value = "#error"
Resume nomal_exit

End Sub

肝心なのは「エラーをon error goto文で拾って、別の所に飛ばす」「エラーで飛んできたら何か特殊処理してからresume文でどこかに戻る」の2つ。
    • good
    • 0

シートにコマンドボタンなので、元のプログラムと少し違いますが、こんな感じ。



Private Sub CommandButton1_Click()
Dim 生年月日 As String
Dim 開始日付 As String
Dim 年齢 As String

On Error GoTo error_exit

生年月日 = "H" + Range("A1").Text + "/" + Range("B1").Text + "/" + Range("C1").Text
年齢基準日 = "H" + Range("A2").Text + "/" + Range("B2").Text + "/" + Range("C2").Text

年齢 = Application.Evaluate("=datedif(""" & Format(生年月日, "yyyy/mm/dd") _
& """,""" & Format(年齢基準日, "yyyy/mm/dd") & """,""y"")")
Range("A3").Select
Selection.Value = 年齢

nomal_exit:
Exit Sub

error_exit:
Range("A3").Select
Selection.Value = "#error"
Resume nomal_exit

End Sub

肝心なのは「エラーをon error goto文で拾って、別の所に飛ばす」「エラーで飛んできたら何か特殊処理してからresume文でどこかに戻る」の2つ。
    • good
    • 0
この回答へのお礼

エラーすべてをGOTO文で飛ばしてしまう回答者様の方法ですと、すべてのエラーが飛んでしまうのでメッセージが機能しないような気がします。
たとえば「生年月日を正しく入力してください」等のメッセージを表示させるのは難しいかもしれません。

お礼日時:2009/12/24 16:40

#1さんの回答のようにIsdateで妥当な日付がどうかのチェックをする。


気になったのは
Application.Evaluate("=datedif(""" & ~~
VBAでもDateDiffという関数があるのでこれを遣ったほうがいいのでは
(昭和生まれも仲間に入れてくれ!)
    • good
    • 0
この回答へのお礼

VBAのdatediffは数え年扱いなのでうまく機能しないようです。
スミマセン、昭和がありえない前提だったのでこのような形に・・

お礼日時:2009/12/24 16:36

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