- ベストアンサー
VBAでIF文の複数条件を解決する方法
- VBAで実装したIF文が意図した通りに動作せず、条件を無視して結果を出してしまう問題に悩むユーザーの質問。
- A列やS列の特定条件を無視して★が付与される不具合について、正しいIF文の構造を模索している。
- 複数の条件を持つVBAのIF文においてエラー表示がないため、該当箇所の修正が難航している状況を説明している。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
修正も何も、1つのIF文は1つの作業しかしません。 6つの作業が必要なら、6つのIF~THEN~ENDIF、が必要になります。 ご質問にあるものは、すべての条件判断を1つのIF文に詰め込んでいますから、すべての条件が成立したときのみに THEN 以下を実行する、というプログラムになってしまっています。 また、AND と OR、NOT には結合の優先度があります。 NOT が一番高い優先順位となり、次にAND、そしてOR が一番弱いです(この3つの中では)。 そうすると、ご質問に書かれた条件式にカッコを付けて結合を明記すると、 If( (Cells(r, "A") >= 10000) And _ (Not Cells(r, "I") Like "*秋田*") ) Or (Not Cells(r, "I") Like "*長野*") Or _ (Not Cells(r, "I") Like "*栃木*") Or ( (Not Cells(r, "I") Like "*本社*") And _ (Not Cells(r, "L") Like "退職") And _ (Not Cells(r, "M") Like "常勤") And _ (Cells(r, "S") Like "" And) _ (Cells(r, "J") Like "*aaa*") ) Or (Cells(r, "J") Like "*bbb*) Or (Cells(r, "J") Like "*ccc*") Or (Cells(r, "J") Like "*ddd*") Then こうなります。 これを OR で改行しなおしてわかりやすくすると、 If( (Cells(r, "A") >= 10000) And (Not Cells(r, "I") Like "*秋田*") ) Or _ (Not Cells(r, "I") Like "*長野*") Or _ (Not Cells(r, "I") Like "*栃木*") Or _ ( (Not Cells(r, "I") Like "*本社*") And _ (Not Cells(r, "L") Like "退職") And _ (Not Cells(r, "M") Like "常勤") And _ (Cells(r, "S") Like "") And _ (Cells(r, "J") Like "*aaa*") ) Or _ (Cells(r, "J") Like "*bbb*) Or _ (Cells(r, "J") Like "*ccc*") Or _ (Cells(r, "J") Like "*ddd*") Then という結合をしていることになります。改行とは無関係に、演算子の強さで結合していますので、1行目から2行目にかかっているカッコと、3行目から7行目までがカッコでまとまっていることに、あなたの考えとの食い違いがあるでしょう。 つまり、あなたの組んだIF文はてんでデタラメなものになってしまっているので、まともに動くはずもないわけです。 ---- ご質問の(1)~(6)は、条件なのですか? 作業なのですか? 作業であるならば、(1)~(6)それぞれで、「IF (条件1) THEN (作業1) END IF」「IF (条件2) THEN (作業2) END IF」…と書いてください。 (1)~(6)が条件であるならば、それぞれの条件をカッコでくくり、ANDで結合して、 IF (条件1) and (条件2) and (条件3) and (条件4) and (条件5) and (条件6) then (作業) end if というように書いてください。
その他の回答 (1)
- kkkkkm
- ベストアンサー率66% (1742/2617)
設定の1項目ごとに条件式を()で囲ってみてください。 If A and B or C Then の場合CがTrueであればAとBが何であっても結果はTrueになると思います。 If A and (B or C) Then だとAがTrueでかつBかCがTrueであれば結果がTrueになると思います。
お礼
補足
すみません。使ってみましたが同じ結果になりました。使えなかったです。