プロが教える店舗&オフィスのセキュリティ対策術

or では大丈夫なのにandではダメな理由は?

セルA1に2007/10/3を入れ、
2007年ならピンク
2008年なら黄緑
とやろうとして、2つのマクロを作りました。
Macro1では正常に動作するのですが
Macro2を実行すると2007/10/3なのに、黄緑になってしまいます。
2008/10/3でMacro2を実行すると何も動きません。
Macro1とMacro2の違いは「or」と「and」の違いだけです。


Sub Macro1()
If 39081 >= CLng(Range("a1")) Or CLng(Range("a1")) <= 39447 Then
Range("a1").Interior.ColorIndex = 38
ElseIf 39448 >= CLng(Range("a1")) Or CLng(Range("a1")) <= 39813 Then
Range("a1").Interior.ColorIndex = 4
End If
End Sub

Sub Macro2()
If 39081 >= CLng(Range("a1")) And CLng(Range("a1")) <= 39447 Then
Range("a1").Interior.ColorIndex = 38
ElseIf 39448 >= CLng(Range("a1")) And CLng(Range("a1")) <= 39813 Then
Range("a1").Interior.ColorIndex = 4
End If
End Sub

「and」なら2007/1/1より大きい なおかつ 2007/12/31より小さい
と思い、最初はMacro2を作りましたが、うまくいかない為Macro1を作りました。
でも
「or」だと、2007/1/1より大きい もしくは 2007/12/31より小さい
ですよね?
2008/1/1でも「2007/1/1より大きい もしくは 」にヒットしてしまうため、
andにしたのですが、なぜandではうまくいかないのでしょうか?

よろしくお願いします。

「or では大丈夫なのにandではダメな理」の質問画像

A 回答 (8件)

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

ではいかがでしょう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/16 21:36

単純なミスだと思います。



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 だと思います。
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:23

こんばんは!


不等号の向きが違うみたいですね!

余計なお世話かもしれませんが、
コードを入力するとき、シリアル値と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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:24

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:24

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を羅列する場合はケース漏れに注意してください。

階層複雑のときは記載多くなって面倒でもきっちり書く方が答えきっちりでます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:24

「and」なら2007/1/1より大きい なおかつ 2007/12/31より小さい


2008/1/1でも「2007/1/1より大きい もしくは 」にヒットしてしまうため、

解釈誤り。
『2007/12/31より小さい』にはヒットしていません。よって、式が成り立ってない。

普通に考えて、
ORとANDが違うだけで結果同じというのはケース少ないです。


今回の結果実現以前に「ORとANDの使い方」を習得すべきです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:25

最初に、何か別の言語を学んだことがありますか?



ここでは、論理式の問題ですから、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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:25

仮に、セルの値が39080だったとしたら「39081>=」が成立し「<=39447」も成立します。

マクロ1でもまだ不十分です。


ANDでうまくいかないからORというよりは、ANDでもどう動いたか1度見直すと不等号向きがおかしいのはわかったと思います。

「AからB」の判定ならAND使う方が良いです。
よく使う判定です、year等でやり方変えて片付けないこと、です。マクロ2の不等号を修正すること。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/08/29 21:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!