• ベストアンサー

Excel2007/IsErrorの使用について

Excel2007でマクロを書いていますが、下記の部分がうまくいきません。 If IsError(DateDiff("M", 開始日付のセル,終了日付のセル)) = False Then ・・・処理 開始日付のセル、終了日付のセルに必ずしも型にあった情報が入っているわけでは ないため、IsErrorを使用して問題ない部分のみ処理しようとしましたが、 DateDiffが数値を返す時は問題なくマクロが流れるものの、いざIsErrorがTrueになると 「型が一致しません」と表示が出てしまいます。 問題点をお教えいただく事はできますでしょうか。お願いいたします。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

なかなかレスが付いてきませんね。 私も何からどう伝えると正確に伝わるか悩みながらではありますが・・。 まず、結論から言ってしまうと、 > いざIsErrorがTrueになると 現状の式の書き方では「ありえない」という事を念頭に置いてください。 > 開始日付のセル、終了日付のセルに必ずしも型にあった情報が入っているわけではない とのことですから、「エラーになってほしいケース」を作って、   debug.Print IsError(DateDiff("M", 開始日付のセル,終了日付のセル)) 上記を動かしてみてください。 おそらく「型が一致しません」のようなメッセージが出てきて、処理自体が止まるはずです。 つまり、現状の式だと > If IsError(DateDiff("M", 開始日付のセル,終了日付のセル)) = False Then 開始・終了両方が日付と認識され、DateDiff関数を通った時はIsError関数に値を渡し、 開始・終了両方が日付と認識されなかったら、IsError関数を待たずに処理が止まってしまうのですね。 これが質問文中の > 問題点をお教えいただく事はできますでしょうか。 に対する回答になるかと思います。 では、回避するにはどうしたら良いのか?と言う点に問題が移りますね。 私なら・・と言う策で恐縮ではありますが、一つ提案させていただきます。 ご提示のIfの処理を拝見すると、 「DateDiff関数がエラーを返さない」と言うのが条件ですね。 つまり、「開始日付・終了日付が"日付"と認識できる、かつ、開始日付<終了日付」が条件とすると、   If IsDate(開始日付) And IsDate(終了日付) And 開始日付 < 終了日付 Then       処理 と言うIf文を書けます。 IsDate関数によって、"日付"と認識できるデータ=型にあった情報 が入ってきた場合のみ、 If文内の「処理」に進みます。 必要なら「処理」の中にDateDiffを入れ込むのも可能でしょう。 とりあえず、一例としてお納めくださいませ。

Snlf
質問者

お礼

ズバリ!疑問点をお教え下さりありがとうございました! 代替策にも感謝いたします!

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

DateDiff関数はエラー値を返さずに実行時エラーになるので、IsErrorでは処理できません。 たとえばWorksheetFunctionクラスの関数など、実行時エラーにならずにエラー値を返す関数でならご質問で書かれた方法でも利用できますが、生憎DateDiff関数の代わりになるそういう関数もありません。 というワケで、DateDiff関数を使う場合の直接の回避策としては sub macro1()  on error goto errhandle  計算結果 = datediff("M",開始セル,終了日セル)  exit sub errhandle:  msgbox "ERROR" end sub といったカンジになります。 #補足 もしもエラー処理ブロックから復帰する必要があるときは、適切にresumeさせます。ご質問のスコープ外なので、もし必要なら状況(続きに何をどうしたいのか)を補足して別途ご相談を投稿してください。

Snlf
質問者

お礼

DateDiff関数はエラー値を返さずに実行時エラーになる, というご説明が参考になりました。ありがとうございます!

関連するQ&A