• ベストアンサー

エクセル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

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

  • ベストアンサー
  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.3

>何故でしょうか。 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) = "○" とかする必要があると思います。

NEWYORKERS
質問者

お礼

実は、どうやって空白セルが1899年12月・・・ とわかるのか不思議でした。 教えてもらったコードを実行して 本当だ!と実感出来ました。 IF文も完璧になり嬉しいです。 御指導ありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

おかしく思った後 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 を実行すると、小生の今の知識では納得きないところも有るが    

NEWYORKERS
質問者

お礼

頻繁にわからない事にぶつかりますが、 いつもどうやって解明したら良いかわかりません。 こういうプロセスを踏んでいくんだと知りました。 そして、1900年前後の部分は驚きました。 そのあたりのデータは気をつけてチェックしたいと思います。 広範囲で御指導いただけて感謝しております。 有難う御座いました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

空白は、日付値としては「1899年12月30日00:00:00」に評価されます。 なのでMonth()は12を返します。 空白セルかどうかチェックするコードを組み込む必要があるかと。 with Cells(i,1) .offset(0,6) = iif( isdate(.value) and month(.value)=12,"○","×") end with

NEWYORKERS
質問者

お礼

空白とばかり思い込んでいたので、 まっさらのセルなのにびっくりしました。 チェックするコードも教えていただき、助かりました。 御指導有難う御座いました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

例えばこんなマクロでもできます。 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

NEWYORKERS
質問者

お礼

F列とG列をまちがえました。 ご指摘ありがとうございます。 根本から変えずに修正出来て嬉しいです。 御指導ありがとうございました。