• ベストアンサー

If構文のOr,Andを二度書きしないには?

どのOrにも共通する長い条件を一度の記述で済ますにはどうするのでしょうか? もし日付が20日でC3セルが「1」でK3セルが「0」の場合で、かつ  H3セルが800以上  E3セルが5000以下  F3セルが10000以下 のどれかに該当すればメッセージを表示せよというマクロです。       If Day(Date) = 20 And Worksheets(1).Cells(3, 3) = 1 And Cells(3, 11) = 0 And Cells(3, 8) > 800 _ Or ~ And Cells(3, 5) < 5000 _ Or ~ And Cells(3, 6) < 10000 _ Then MsgBox "○○" 単純な記述で”~”にDay ~ =0 の部分を3行とも繰り返し書くと、とても見づらいです。 これを一度の記述で済ますには、どう書くのでしょうか。

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

  • ベストアンサー
回答No.2

>or ElseIfの部分が赤字になって 間違えた If Cells(3, 8) > 800 or Cells(3, 5) < 5000 or Cells(3, 6) < 10000 Then End If です。もともと If Cells(3, 8) > 800 Then ElseIf Cells(3, 5) < 5000 Then ElseIf Cells(3, 6) < 10000 Then End If って書いてて間違えたーと思って書き直し・・・間違えたのorz

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

なるべく見やすく書いたつもりです。質問の『文章』の通りに並べたつもりです。 質問のようなケースは、If を並べるよりも、Select Case の方が分かりやすいでしょう。また、条件が変更になったり、追加する場合、分かりやすくなるはずです、 また、Cells よりも Range が見やすくなると思っています。 AndやOrは『集合』の考え方をすると、すっきり書けるでしょう。 Sub Test()   Dim checkFlg As Boolean   '// 条件成立のフラグ   '// フラグの初期化   checkFlg = False      '// 次の3条件の下   If Day(Date) = 20 And Range("C3") = 1 And Range("K3") = 0 Then          '// 下の条件のどれかが成立すればフラグはTrue     Select Case True       Case 800 <= Range("H3")         checkFlg = True       Case Range("E3") <= 5000         checkFlg = True       Case Range("F3") <= 10000         checkFlg = True     End Select      End If      '// フラグがTrueならメッセージを出力   If checkFlg = True Then     MsgBox "○○"   End If End Sub

popuran121
質問者

お礼

こういう書き方も有るんですか。 有り難うございます。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.3

or条件を()で囲って If Day(Date) = 20 And Worksheets(1).Cells(3, 3) = 1 And Cells(3, 11) = 0 And _ (Cells(3, 8) > 800 Or Cells(3, 5) < 5000 Or Cells(3, 6) < 10000 ) Then MsgBox "○○" ではだめなのでしょうか?

popuran121
質問者

お礼

カッコを使えばいいんですね。 ありがとうございます。

回答No.1

If Day(Date) = 20 And Worksheets(1).Cells(3, 3) = 1 And Cells(3, 11) = 0 Then If Cells(3, 8) > 800 or ElseIf Cells(3, 5) < 5000 or ElseIf Cells(3, 6) < 10000 Then End If End If 動くかどうか実験はしてないけど分ければいいんだ!

popuran121
質問者

お礼

早っ! or ElseIfの部分が赤字になって動かなかったけど、私のやり方が悪かったかも知れないです。 再度、確認中です。

関連するQ&A