- ベストアンサー
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行とも繰り返し書くと、とても見づらいです。 これを一度の記述で済ますには、どう書くのでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>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)
なるべく見やすく書いたつもりです。質問の『文章』の通りに並べたつもりです。 質問のようなケースは、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
- mshr1962
- ベストアンサー率39% (7417/18945)
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 "○○" ではだめなのでしょうか?
お礼
カッコを使えばいいんですね。 ありがとうございます。
- himajin100000
- ベストアンサー率54% (1660/3060)
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 動くかどうか実験はしてないけど分ければいいんだ!
お礼
早っ! or ElseIfの部分が赤字になって動かなかったけど、私のやり方が悪かったかも知れないです。 再度、確認中です。
お礼
こういう書き方も有るんですか。 有り難うございます。