
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ではうまくいかないのでしょうか?
よろしくお願いします。

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
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を羅列する場合はケース漏れに注意してください。
階層複雑のときは記載多くなって面倒でもきっちり書く方が答えきっちりでます。
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
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
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 だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
えエクセルで○は1とし△は0.5で...
-
EXCELで2つの数値のうち大きい...
-
エクセルで二つの数字の小さい...
-
エクセルかグーグルスプレッド...
-
PowerPointで表の1つの列だけ...
-
エクセルで時刻(8:00~20:00)...
-
エクセルで最初のスペースまで...
-
エクセルのセル内の文字の一部...
-
Excel、市から登録している住所...
-
2つのエクセルのデータを同じよ...
-
エクセルでオートフィルタのボ...
-
Excelで隣のセルと同じ内容に列...
-
Excelで半角の文字を含むセルを...
-
エクセル(勝手に太字になる)
-
「B列が日曜の場合」C列に/...
-
エクセルに入力された日付「S40...
-
エクセルで文字が混じった数字...
-
エクセルでの複数条件下での標...
-
エクセルで年月の合計の関数を...
-
エクセルで特定の文字が入って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
えエクセルで○は1とし△は0.5で...
-
UWSCのCALLで呼び出すファイル...
-
サンダーバードの移行ツール
-
どうして急に3分の4が出てくる...
-
Excel ユーザーフォームのオプ...
-
この問題の解き方と答えを教え...
-
VBAで組み合わせ算出やCOUNTIFS...
-
VBA スタック容量が足りない・...
-
誰か解いてください!
-
Susieのスライドショーにて
-
エクセルのマクロを使って、デ...
-
数学Ⅲ
-
絶対値の取り方
-
数IIBの数列の問題、、、
-
EXCELで2つの数値のうち大きい...
-
2つのエクセルのデータを同じよ...
-
PowerPointで表の1つの列だけ...
-
Excelで隣のセルと同じ内容に列...
-
エクセルで二つの数字の小さい...
-
エクセルでオートフィルタのボ...
おすすめ情報