- ベストアンサー
エクセルVBAのIF・・・Else文について
A列に日付が入っていて、それが12月の時はF列に"○"、 それ以外は"×"と表示したいのですが、下記を実行すると、 A列の空白セルの時もF列に"○"が表示されます。 何故でしょうか。Offsetを使って作成したいのですが、 すみませんが、宜しく御願いします。 Sub Test() Dim i For i = 2 To 20 If Month(Cells(i, 1)) = 12 Then Cells(i, 1).Offset(0, 6) = "○" Else Cells(i, 1).Offset(0, 6) = "×" End If Next End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>何故でしょうか。 A1セルが空白で、以下のコード試してみてください。 Sub Macro1() MsgBox Year(Range("A1")) MsgBox Month(Range("A1")) MsgBox Day(Range("A1")) End Sub IF文を If Month(Cells(i, 1)) = 12 And Cells(i, 1) <> "" Then Cells(i, 1).Offset(0, 6) = "○" とかする必要があると思います。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
おかしく思った後 Sub Test() Dim i For i = 2 To 10 MsgBox Month(Cells(i, 1)) If Month(Cells(i, 1)) = 12 Then Cells(i, 1).Offset(0, 6) = "○" Else Cells(i, 1).Offset(0, 6) = "×" End If Next End Sub をやってみて、空白セルが12になることを確かめる。 Sub test02() MsgBox Month("") End Sub はエラーになること。 であればエクセル側で数字に変換されたな。 それなら数字は0だろう。 Sub test02() MsgBox Month(0) End Sub が12になる。 そういう試行プロセスで、空白の場合を別扱いにするIF判断を1つ加えないといけないことが判る。 ーー 12になる理由はエクセルの日付シリアル値の数字が 1は1900年1月1日 0はその1日前だから1899年12月31日と解釈される。 しかし0と入れると見た目1900/1/1と日付としてセットされる。 ーー 1900年前後は例外的なところなので気をつけるほか無い。 例データ A列 B列は=MONTH(A1) C列下記VBA実行結果 2006/5/5 5 5 2006/6/6 6 6 2006/8/7 8 8 2006/10/8 10 10 1 12 2006/5/10 5 5 1900/1/0 1 12 1 12 1900/1/1 1 12 1900/1/0 1 12 ーー Sub test01() For i = 1 To 10 MsgBox Month(Cells(i, "A")) Cells(i, "C") = Month(Cells(i, "A")) Next i End Sub を実行すると、小生の今の知識では納得きないところも有るが
お礼
頻繁にわからない事にぶつかりますが、 いつもどうやって解明したら良いかわかりません。 こういうプロセスを踏んでいくんだと知りました。 そして、1900年前後の部分は驚きました。 そのあたりのデータは気をつけてチェックしたいと思います。 広範囲で御指導いただけて感謝しております。 有難う御座いました。
- osamuy
- ベストアンサー率42% (1231/2878)
空白は、日付値としては「1899年12月30日00:00:00」に評価されます。 なのでMonth()は12を返します。 空白セルかどうかチェックするコードを組み込む必要があるかと。 with Cells(i,1) .offset(0,6) = iif( isdate(.value) and month(.value)=12,"○","×") end with
お礼
空白とばかり思い込んでいたので、 まっさらのセルなのにびっくりしました。 チェックするコードも教えていただき、助かりました。 御指導有難う御座いました。
- zap35
- ベストアンサー率44% (1383/3079)
例えばこんなマクロでもできます。 F列に表示させたいなら .Offset(0, 5) になると思います Sub Test() Dim i For i = 2 To 20 If IsDate(Cells(i, 1)) Then If Month(Cells(i, 1)) = 12 Then Cells(i, 1).Offset(0, 5) = "○" Else Cells(i, 1).Offset(0, 5) = "×" End If Else Cells(i, 1).Offset(0, 5) = "×" End If Next End Sub
お礼
F列とG列をまちがえました。 ご指摘ありがとうございます。 根本から変えずに修正出来て嬉しいです。 御指導ありがとうございました。
お礼
実は、どうやって空白セルが1899年12月・・・ とわかるのか不思議でした。 教えてもらったコードを実行して 本当だ!と実感出来ました。 IF文も完璧になり嬉しいです。 御指導ありがとうございました。