複数の判定

解決


夏休み  2007-08-17 20:31:11  No: 137167

環境:VB6

はじめまして。大変初歩的な質問で恐縮ですが、
4つの変数の値が一緒でなければ、エラーとし、
4つの変数の値が一緒なら次の処理に移行するとしたいのですが、
判定がとても見苦しく、もっと簡単に判定できないかと思いまして。。

If a <> b Then End
If b <> c Then End
If c <> d Then End
If d <> a Then End

↓  ここから処理  ↓

アドバイスお願いします。


魔界の仮面弁士  2007-08-17 20:40:39  No: 137168

一例として:

If (a = b) And (b = c) And (c = d) Then
  '次の処理
Else
  'エラー処理
End If


夏休み  2007-08-17 20:55:55  No: 137169

早々のご回答ありがとうございます。

次の処理が結構長くなりそうなので、
次の処理をIf文のなかに入れたまま記述したくなかったのですが
(インデント関係で行数制限(=100)に引っかかりやすくなるため)

魔界の仮面弁士様のアドバイスを少しいぢって試したのですが

If Not(a = b) And Not(b = c) And Not(c = d) Then
'エラー処理
End If

'次の処理

違う値が入っていても次の処理へはしってしまいました。

記述方法が間違っているのでしょうか?


KG  2007-08-17 21:35:49  No: 137170

エラー処理は走らずに次の処理にいったということですか?

エラー処理も次の処理も流れたということであれば、
魔界の仮面弁士さんの例通りにしたほうが一番わかりやすい
かと思います。


K.J.K.  2007-08-17 21:36:11  No: 137171

それで行うなら、弁士さんの書いている通りにElseを
用いるか、
If Not(a = b) And Not(b = c) And Not(c = d) Then
'エラー処理
    Exit Sub '関数ならばExit Function 
End If

'次の処理
とでもするべきかと。

ちなみに、
Select Case True
    Case a <> b, b <> c, c <> d, d <> a
        ' エラー処理
        Exit Sub
End Select
という書き方も出来ます。


夏休み  2007-08-17 21:37:18  No: 137172

試しているうちに出来ました。

If (a <> b) Or (b <> c) Or (c <> d) Then
'エラー処理
End If

'次の処理

これって(a <> d)を判定する必要はないですよね?
一応すべての変数に違う値を入れたので大丈夫だとは思いますが。
aとdが違えば、他でも引っかかってしまいますもんね。

単純な処理のようにみえて色々考えてしまいました(汗)

魔界の仮面弁士様ありがとうございました。


K・今川  2007-08-17 21:40:52  No: 137173

If ((A = B) And (B = C) And (C = D)) Then
Else
    'エラー処理
End If
'次の処理

とするか、

If ((A = B) And (B = C) And (C = D)) = False Then
    'エラー処理
End If
'次の処理

エラー処理が1行で済むのなら

If ((A = B) And (B = C) And (C = D)) Then Else 'エラー処理
'次の処理

又は

If ((A = B) And (B = C) And (C = D)) = False Then 'エラー処理
'次の処理


夏休み  2007-08-17 21:41:54  No: 137174

>KG様、K.J.K.様
アドバイスありがとうございます。

エラー処理の後にはExit Subを入れております。
記述不足で申し訳ありません。

下記の場合だと、エラー処理がはしらず、次の処理へいってしまいました。
If Not(a = b) And Not(b = c) And Not(c = d) Then
    'エラー処理
    Exit Sub 
End If

テストの仕方が間違っていたんですかね・・・(汗)


夏休み  2007-08-17 21:44:54  No: 137175

K・今川様、ご回答ありがとうございます。

If ((A = B) And (B = C) And (C = D)) = False Then
    'エラー処理
End If

↑こんなことが判定できるんですね!
知りませんでした。一番スマートな感じに思えます。

If ((A = B) And (B = C) And (C = D)) Then
Else
    'エラー処理
End If

↑これは一応思い浮かびましたが、レビューに引っかかりそうだったので・・・。

いいアドバイスありがとうございました。


魔界の仮面弁士  2007-08-18 00:16:22  No: 137176

> 下記の場合だと、エラー処理がはしらず、次の処理へいってしまいました。
> If Not(a = b) And Not(b = c) And Not(c = d) Then
> テストの仕方が間違っていたんですかね・・・(汗)

テストではなく、回答にあった条件が間違っているような…。
これだと、a=1 : b=1 : c=2 : d=2 の時にエラーになりません。

> 単純な処理のようにみえて色々考えてしまいました(汗)

正常時の条件が、
  If (A = B) And (B = C) And (C = D) Then
なのですから、これをエラー時の条件としたいなら、
単純に、結果の True / False を反転させるだけですよね。

つまり、
  If Not ( (A = B) And (B = C) And (C = D) ) Then
ということです。【案1】

で、これをド・モルガンの法則に従って展開すると、
  If Not (A = B) Or Not (B = C) Or Not (C = D) Then
のように書き換えられるので、これを整理したものが、
> 試しているうちに出来ました。
> If (a <> b) Or (b <> c) Or (c <> d) Then
という結果になるわけです。【案2】

# 案1 / 案2 のどちらを使っても同じこと。


夏休み  2007-08-18 00:33:46  No: 137177

魔界の仮面弁士様、丁寧なご説明有難う御座いました。

> If Not(a = b) And Not(b = c) And Not(c = d) Then
> これだと、a=1 : b=1 : c=2 : d=2 の時にエラーになりません。

何故、a=1 : b=1 : c=2 : d=2の際にエラーにならないのか、
今はまだあまり理解できておりませんが、
(久々にコーディングして頭がオーバフローしてます  苦笑)

こちらは自分で理解できるまで考えたいと思います。

今やっとこさ  '次の処理  が終わったところです。

色々と為になる解説をしていただき、ほんと感謝しております。
有難う御座いました。


KG  2007-08-18 00:52:09  No: 137178

If Not(a = b) And Not(b = c) And Not(c = d) Then

だと、

Not(a = b)
Not(b = c)
Not(c = d)

の一つでもFalseになると(同じ数値だと)条件としてFalseになるからです。
a=1 : b=1 : c=2 : d=2だと順にFalse,True,Falseとなってしまいます。

夏休みさんの希望としては一つでもTrueなら、、ということなので、
魔界の仮面弁士さんの仰るとおり
Not (A = B) Or Not (B = C) Or Not (C = D) 
となり

夏休みさんの導き出した
a<>b Or b<>c Or c<>d 
となるわけですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加