プロが教える店舗&オフィスのセキュリティ対策術

Excel VBA 条件式

If文で、2つの条件
x = 0
1/x > 1
のどちらかを満たす場合

…というのを1文で書けます?

x = 0 or 1/x > 1

にすると、0除算が生じてエラーになります。

条件を0≦x<1に置き換えればいい、という事ではなくて、
『分母となる変数が0の場合も「正」として処理したい』
ということと、
各々の条件でフラグを立てて、フラグを根拠として処理をするとか、逃げ方はありますが、
『Ifの条件として1文で書けるか』
という部分で質問になります。

よろしくお願いします。

質問者からの補足コメント

  • 回答くださった方々、ありがとうございました。
    参考になる回答ばかりで感謝いたします。
    私が個人的に直感的にわかりやすかったIIf関数の使用案をベストアンサーにさせていただきました。

      補足日時:2021/03/03 19:44

A 回答 (4件)

x = 0 or 1 > abs(x)


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

ありがとうございます。

1/x > 0.1 の場合だと、比較する数値の逆数を用いて
10 > Abs(x)
1 > Abs(x) * 0.1
とか、こんな感じでいいのかな。
きっと、理にかなってる気はするけど、
後で自分で見返したときに気づけ無さそう…。
その程度のスキルなのです。

お礼日時:2021/03/03 19:41

No.1です。



なんと回答したコードは問題が生じるのですね。
勉強になりましたけど、初級レベルなジジィではどのような問題になるのかがわからないのでその要因ってどうやって調べられるのかなぁ?
    • good
    • 0

Visual Basic なら短絡評価の OrElse で解決できますが、


https://docs.microsoft.com/ja-jp/dotnet/visual-b …

VBA には短絡評価の演算子が実装されていないので、
0除算が起きないように条件式を変えるしかなさそうです。
(例)
x = 0 Or 1/x > 1
↓ 元の条件と同じ結果になるように変形
1 / IIf(x=0,0.5,x) > 1

ただしこれでは、仕様がぼやけて後々問題が生まれそうなので、
迂遠のようですが条件判定を関数化するのがお勧めです。
関数名で目的を明確にすれば、とても読みやすくなるオマケつきです。
(例)
If CheckHogehogeX(x) Then ...
...
Function CheckHogehogeX(x As Double) As Boolean
_ If x = 0 Then
_ _ CheckHogehogeX = True
_ ElseIf 1 / x > 1 Then
_ _ CheckHogehogeX = True
_ Else
_ _ CheckHogehogeX = False
_ End If
End Function
    • good
    • 0
この回答へのお礼

ありがとうございます。
関数化までは頭が回りませんでしたが、
頂いた回答のような方法までは考えてたんだけど、
「or」で片付きそうなのに複数行になるのが悔しくてお知恵を求めてました。

「短絡評価」初めて耳にしたので検索しました。
私が求めてたのは「短絡評価」だったのか!
同じ事態に陥ったときにこの言葉を思い出せるか自身はありませんけど…

お礼日時:2021/03/03 19:07

1文とは胸を張って言えないかもですけど。



If x = 0 Or 1 / (IIf(x = 0, 1, x)) > 1 Then

これが初級レベルなジジィには限界です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
1行でうまいこと収まりますね。
IIfは使ったことがありませんでしたので、新たな知識としてうまいこと使えていければと思います。

お礼日時:2021/03/03 19:23

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