[[20040311133158]] 『VBA:ゼロで割る式が[オーバーフロー]のエラー』(F) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA:ゼロで割る式が[オーバーフロー]のエラー』(F)

[VBAの式でゼロで割る式が「オーバーフロー」のエラーになります。これを回避してゼロを入れるようにしたいのですが、何かいい方法はありますか。

Range("A1").value = a / b

上記式で、b=0の時にエラーになるため、下記のような式にしてみましたが、状況は変わらないのです。

Range("A1").value = iif(b = 0, 0 ,a / b )

ちなみに、

debug.print a / b

としても、エラーになってしまうため、0で割る式が表れることが許されないのかと思うのですが、いかがなものでしょうか。]


 IFステートメントではダメなんでしょうか。
 
If b <> 0 Then
Range("A1").Value = a / b
Else
Range("A1").Value = 0
End If
 
(KAMIYA)


早速の回答をありがとうございます。
やはり、そういう方法しかないのでしょうか。

というのも、同じような計算式がかなりたくさん繰り返されている為、
IFステートメントを使用すると長くなってしまい、見た目も分かりにくいため、避けていました。確かにKAMIYAさんのおっしゃる通り、IFステートメントではうまくいきました。
…ちなみに、

IsError(a/b)

としてもエラーになってしまうため、どうもすっきりしないのですが^^;

(F)


 補足です。ヘルプの解説です。
====================================== 
IIf(expr, truepart, falsepart)
 
解説
 
IIf 関数では、名前付き引数 truepart または名前付き引数 falsepart のいずれか
一方だけが返されますが、評価は両方の引数に対して行われます。このため、IIf 関
数を使うと、予期しない結果が起きることがあります。たとえば、名前付き引数
 falsepart を評価した結果 0 による除算エラーが発生する場合は、名前付き引数
 expr が真 (True) であってもエラーが発生します。
====================================== 
つまり、IIf関数では第一引数の結果の真偽にかかわらずいったん引数全てが計算され
ます。エラーになるような式が引数に入っている場合、条件判断で回避できるように見
えてもその式を無視してくれるワケではないということです。
エラー回避にはあまり役に立たないのでエクセルの学校ではあまりお目にかかりません。
最近も別のスレッドで見かけたような気がしますが、VBや他のアプリではよく使う関数
なのでしょうか。
(KAMIYA)


 「0で除算しました」はDOS時代には恐怖のメッセージでありました。
今でも「禁じられた数式」であるらしく、IsErrorでは拾えないようですね。
プログラミング上は「0で除算」しないように持っていくのが賢明です。
 
>IFステートメントを使用すると長くなってしまい、見た目も分かりにくいため
プログラミングの第一義は「確実に所期の動作をすること」なので、
見た目云々よりも確実性を大事にしましょう。
確実で見た目にもわかりやすいのがなお良いのですが、
動かないでは話になりません。
 
「繰り返し」に関しては処理によってはフロー制御できるかもしれませんが、
私事で席をはずすため来週までこれ以後助言差し上げられません。
もし、フォローが必要でしたら新たなスレッドで相談をなさってみてください。
そのほうが回答者の反応が良いと思いますので。
(KAMIYA)


大変、勉強になりました。
KAMIYAさん、ありがとうございました。
IsError関数がエラー回避にあまり役立たないという事ですが、シート上ではよく使ってました。例えば、

 A1 -> 0
 B1 -> 0
 C1 -> =A1 / B1
 D1 -> =IS(ISERROR(C1),0,A1/B1)

といった感じです。
シート上ではエラーにならないので、VBAでもうまくいくかと思いましたが、ダメなようです…。
今回はIFステートメントを使用することにしました。

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

(F)


 On Error XXXX は試しましたか?
 err = 11で拾えるはずです。
 (kazu)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.