• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:or では大丈夫なのにandではダメな理由は?)

なぜandではうまくいかないの?

このQ&Aのポイント
  • 「and」を使った条件式では、指定した日時が条件に合致しない場合に実行される処理が正しく実行されないことがあります。
  • 質問の場合、Macro2が正しく動作しないのは、指定した日時が「and」の条件式に合致しないためです。
  • 「and」を使うと、指定した日時が条件に完全に合致しない場合、処理が実行されないことがあるため、注意が必要です。

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

  • ベストアンサー
  • layy
  • ベストアンサー率23% (292/1222)
回答No.8

仮に、セルの値が39080だったとしたら「39081>=」が成立し「<=39447」も成立します。マクロ1でもまだ不十分です。 ANDでうまくいかないからORというよりは、ANDでもどう動いたか1度見直すと不等号向きがおかしいのはわかったと思います。 「AからB」の判定ならAND使う方が良いです。 よく使う判定です、year等でやり方変えて片付けないこと、です。マクロ2の不等号を修正すること。

o9i8u7
質問者

お礼

ありがとうございました。

その他の回答 (7)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

最初に、何か別の言語を学んだことがありますか? ここでは、論理式の問題ですから、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

o9i8u7
質問者

お礼

ありがとうございました。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.6

「and」なら2007/1/1より大きい なおかつ 2007/12/31より小さい 2008/1/1でも「2007/1/1より大きい もしくは 」にヒットしてしまうため、 → 解釈誤り。 『2007/12/31より小さい』にはヒットしていません。よって、式が成り立ってない。 普通に考えて、 ORとANDが違うだけで結果同じというのはケース少ないです。 今回の結果実現以前に「ORとANDの使い方」を習得すべきです。

o9i8u7
質問者

お礼

ありがとうございました。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.5

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を羅列する場合はケース漏れに注意してください。 階層複雑のときは記載多くなって面倒でもきっちり書く方が答えきっちりでます。

o9i8u7
質問者

お礼

ありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

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

o9i8u7
質問者

お礼

ありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 不等号の向きが違うみたいですね! 余計なお世話かもしれませんが、 コードを入力するとき、シリアル値と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

o9i8u7
質問者

お礼

ありがとうございました。

  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.2

単純なミスだと思います。 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 だと思います。  

o9i8u7
質問者

お礼

ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

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 ではいかがでしょう?

o9i8u7
質問者

お礼

ありがとうございました。

関連するQ&A