- ベストアンサー
なぜandではうまくいかないの?
- 「and」を使った条件式では、指定した日時が条件に合致しない場合に実行される処理が正しく実行されないことがあります。
- 質問の場合、Macro2が正しく動作しないのは、指定した日時が「and」の条件式に合致しないためです。
- 「and」を使うと、指定した日時が条件に完全に合致しない場合、処理が実行されないことがあるため、注意が必要です。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
仮に、セルの値が39080だったとしたら「39081>=」が成立し「<=39447」も成立します。マクロ1でもまだ不十分です。 ANDでうまくいかないからORというよりは、ANDでもどう動いたか1度見直すと不等号向きがおかしいのはわかったと思います。 「AからB」の判定ならAND使う方が良いです。 よく使う判定です、year等でやり方変えて片付けないこと、です。マクロ2の不等号を修正すること。
その他の回答 (7)
- Wendy02
- ベストアンサー率57% (3570/6232)
最初に、何か別の言語を学んだことがありますか? ここでは、論理式の問題ですから、Year 関数の話は、置いておきます。ANDそのものは、間違いありませんが、ご質問の書き方は、とても間違いやすいのです。(以下はリテラル値を使っています) 本来、 If #12/30/2006# <= Range("A1").Value <= #12/31/2007# Then と書ければよいのですが、VBAでは許されていません。 そこで、このように書きます。 If #12/30/2006# <= Range("A1").Value And Range("A1").Value <= #12/31/2007# Then Range("A1").Interior.ColorIndex = 38 ElseIf #1/1/2008# <= Range("A1").Value And Range("A1").Value <= #12/31/2008# Then Range("A1").Interior.ColorIndex = 4 End If となるのです。 しかし、間違いないようにするには、右辺と左辺を揃えたほうが間違いが少ないのです。(なお、リテラル値を書くのはコーディングルールとしては、あまり関心しません。)以下のように書くと分かりやすいはずです。 Sub TestMacro1() If Range("A1").Value >= DateValue("2006/12/30") And _ Range("A1").Value <= DateValue("2007/12/31") Then Range("A1").Interior.ColorIndex = 38 ElseIf Range("A1").Value >= DateValue("2008/1/1") And _ Range("A1").Value <= DateValue("2008/12/31") Then Range("A1").Interior.ColorIndex = 4 End If End Sub
お礼
ありがとうございました。
- layy
- ベストアンサー率23% (292/1222)
「and」なら2007/1/1より大きい なおかつ 2007/12/31より小さい 2008/1/1でも「2007/1/1より大きい もしくは 」にヒットしてしまうため、 → 解釈誤り。 『2007/12/31より小さい』にはヒットしていません。よって、式が成り立ってない。 普通に考えて、 ORとANDが違うだけで結果同じというのはケース少ないです。 今回の結果実現以前に「ORとANDの使い方」を習得すべきです。
お礼
ありがとうございました。
- layy
- ベストアンサー率23% (292/1222)
IF 式Aが真 AND 式Bが真 THEN ・・・・(1) ELSE ・・・・(2) ENDIF を書き換えたもの IF 式Aが真 THEN IF 式Bが真 THEN ・・・・(3) ELSE ・・・・(4) ENDIF ELSE IF 式Bが真 THEN ・・・・(5) ELSE ・・・・(6) ENDIF ENDIF において、 (1)に相当するのは(3)ですが、(5)も(1)と同じと解釈しているからでは?。 頭の中だけでなく、イミディエイト使ってきっちり真偽結果を検証すると良いです。 ANDを羅列する場合はケース漏れに注意してください。 階層複雑のときは記載多くなって面倒でもきっちり書く方が答えきっちりでます。
お礼
ありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
No.3です! たびたびごめんなさい。 投稿した後で気づきました。 前回の当方のコードではA1セルの日付が2007・2008年以外に変わっても そのままの色付けになってしまいます。 結局、No.1様の方法とダブってしまいましたが Sub test() If Year(Range("A1")) = 2007 Then Range("A1").Interior.ColorIndex = 38 ElseIf Year(Range("A1")) = 2008 Then Range("A1").Interior.ColorIndex = 4 Else: Range("A1").Interior.ColorIndex = xlNone End If End Sub に訂正してください。 何度も失礼しました。m(__)m
お礼
ありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 不等号の向きが違うみたいですね! 余計なお世話かもしれませんが、 コードを入力するとき、シリアル値とRangeの順番をそろえた方が間違いが少ないかもしれません。 もっと単純に Sub test() If Year(Range("A1")) = 2007 Then Range("A1").Interior.ColorIndex = 38 ElseIf Year(Range("A1")) = 2008 Then Range("A1").Interior.ColorIndex = 4 End If End Sub ではダメでしょうか?m(__)m
お礼
ありがとうございました。
- jcctaira
- ベストアンサー率58% (119/204)
単純なミスだと思います。 2007/1/1<=2007/10/3<=2007/12/31 → ピンク 上記の式をプログラムで行うと If #2007/1/1# <= #2007/10/3# And #2007/10/3# <= #2007/12/31# Then になります。 ※不等号の向きが違うと思います。 If 39081 >= CLng(Range("a1")) And CLng(Range("a1")) <= 39447 Then ↓ If 39081 <= CLng(Range("a1")) And CLng(Range("a1")) <= 39447 Then 注)39081は2006/12/30 だと思います。
お礼
ありがとうございました。
- merlionXX
- ベストアンサー率48% (1930/4007)
Sub test01() Dim c As Integer If Year(Range("A1")) = 2007 Then c = 38 ElseIf Year(Range("A1")) = 2008 Then c = 4 Else c = 0 End If Range("a1").Interior.ColorIndex = c End Sub ではいかがでしょう?
お礼
ありがとうございました。
お礼
ありがとうございました。