• ベストアンサー

エクセル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/17068)
回答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列をまちがえました。 ご指摘ありがとうございます。 根本から変えずに修正出来て嬉しいです。 御指導ありがとうございました。

関連するQ&A

  • 【再質問】エクセルVBAのIF・・・Else文について

    質問投稿日時:09/05/06 13:16質問番号:4935685で 教えていただいたエクセルVBAのコードです。 A列の日付が12月なら、G列に○を付ける。 Sub Macro1() Dim i For i = 2 To 20 With Cells(i, 1) .Offset(0, 6) = IIf(IsDate(.Value) And Month(.Value) = 12, "○", "×") End With Next End Sub 思い通りの実行結果になりお礼を投稿した後、 Ifの前に"I"が付いている事に気づき、 これは、何か教えてもらいたくて再度質問させて頂きました。 二度手間になりすみませんが宜しく御願い致します。 http://oshiete1.goo.ne.jp/qa4935685.html

  • エクセル VBA If~Then~Else

    エクセルのA列に以下の文字列が入っています。 A1 A2=100-101 A3=102-103 A4=104-105 A5=106-107 A列の文字列を上から順に結合するため下記のVBAを実行しました。 結合の条件として、文字列の最後の数字と次のセルの最初の数字が連続しているならば、互いに消去して結合、そうでないなら「,」 (カンマ)でつなげて結合したいと思っています。 なので期待する結果としては A1=100----107 となってほしいのですが、実際は A1=100--103,104-105,106-107 となってしまいました。 (ループ中の1回目の条件分岐だけが成功し、2回目以降は違っている) 「IF~Then」の部分が間違っているようなのですが・・・・・わかりません。 プロパティの使い方など全体的に至らぬ点があるかもしれませんがよろしくお願いします。 Dim i As Integer Dim X As String Dim mojisu As String i = 3 X = Cells(i, 1) mojisu = 3 Cells(1, 1) = Cells(2, 1) Do Until Cells(i, 1).Value = "" If Left(X, mojisu) - Right(Cells(1, 1), mojisu) = 1 Then Cells(1, 1).Value = Left(Cells(1, 1), Len(Cells(1, 1)) - mojisu) & Right(X, Len(X) - mojisu) Else Cells(1, 1).Value = Cells(1, 1).Value & "," & Cells(i, 1).Value End If i = i + 1 Loop

  • VBAについて

    以下のプログラムは、1年間の価格合計を求めるプログラムです。 これを実行するとうまくいくこともありますが、エラーが起きることもあります。 どうやら下記コードが原因のようなのですが、間違いがわかりません。 Target.Offset(0, 1).Value = run * (13 - month) どこが間違っているのでしょうか。 また最終的に、A行かB行のどちらかが更新されたときにこのプログラムを 実行させたいのですが、方法がわかりません。 無知な質問ではありますが、どなたか教えてください。 --------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim month As Integer Dim run As Integer If Intersect(Target, Range("A25:A35")) Is Nothing Then Exit Sub Else If Target.Offset(0, -2).Value <> "" Then month = Target.Offset(0, -2).Value month = month - 3 If month = -2 Then month = 10 ElseIf month = -1 Then month = 11 ElseIf month = 0 Then month = 12 End If run = Target.Offset(0, 0).Value Target.Offset(0, 1).Value = run * (13 - month) End If End If End Sub

  • 【VBA】 IFの中にIF

    いつもこちらの識者の方々にはお世話になっています。 VBAの質問です。 やりたいことは下記構文を見ていただければわかると思うのですが、 ------------------------------------------------------------------------------ Sub Test() Dim f As Long Dim lRow As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row For f = lRow To 2 Step -1 If Cells(f, 2).Value = "りんご" Then Cells(f, 2).EntireRow.Delete Else Cells(f, 2).Value = Cells(f, 2) & "0" & Cells(f, 3) Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif End If Next f End Sub ------------------------------------------------------------------------------ Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif の部分が解決したい部分になります。 IFで条件分岐したあとの処理にさらにIFで分岐を加えたいのですが、無茶だと思いつつやってみたらやはり通りませんでした。 こういうのはなんというのでしょうか、ネストとも違うと思うのですが・・・ 上記のような場合、どのような構文が適していますでしょうか。

  • エクセルVBA

    A列を基準にBC列が空白ならAの数値を入れて、A>BならB列を更新、A<CならC列を更新 A列が数値以外ならその行をスキップ、という処理をしたいのですが Option Explicit Dim A As Range, B As Range, C As Range Dim i As Long Sub test() For i = 1 To 10 Set A = Cells(i, 1) Set B = A.Offset(0, 1) Set C = A.Offset(0, 2) If IsNumeric(A) Then Else Exit Sub End If If B.Value = "" Then B.Value = A.Value If C.Value = "" Then C.Value = A.Value If A.Value > B.Value Then B.Value = A.Value If A.Value < C.Value Then C.Value = A.Value Next i End Sub とすると数値以外の行の時点で停止してしまいます。 その行を飛ばして次の行に進むにはどうしたらいいのでしょうか?

  • VBAでelseに対応するifがありませんとエラー

    VBA初心者です 入力した数値(0から5)により、呼んでくる列を変えたいマクロを組んでいます if then elseif end ifで条件式を作ったのですが、 「elseに対応するifがありません」とエラーが出て進みません elseifが悪いのかと思い、条件を1つに絞ると上手く動きます(この際はendifは不要) ネット検索や参考書を見てますが、分かりません どなたか間違いを指摘して頂けませんか? Sub inputboxA() Dim nDat As String nDat = inputbox("何ヶ月目ですか?") If IsNumeric(nDat) = False Then MsgBox ("0から5までの値を入力して下さい") Exit Sub End If If nDat = 0 Then mm = 16 '0なら16列からデータを呼んでくる ElseIf nDat = 1 Then mm = 20 'ここでエラーが出る  1なら20列目からデータを呼んでくる ElseIf nDat = 2 Then mm = 24 '2なら24列目からデータを呼んでくる ElseIf nDat = 3 Then mm = 28 '3なら28列目からデータを呼んでくる ElseIf nDat = 4 Then mm = 32 '4なら32列目からデータを呼んでくる ElseIf nDat = 5 Then mm = 36 '5なら36列目からデータを呼んでくる End If 'データを呼んでくる For r = 4 To 2000 '処理するSheet1の行数範囲 b = Sheets(1).Cells(r, 1) 'bにA列の値を代入 For t = 6 To 2000 '検索するSheet3の行数範囲 If Sheets(3).Cells(t, 7) = b Then 'Sheet1のA列の値とSheet3のA列が一致した場合 y = Sheets(3).Cells(t, mm) 'yにB列の値を代入 Sheets(1).Cells(r, 6).Value = y 'Sheet1のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub

  • VBA(エクセル)でのCOUNTAについて

    エクセルのSheet1のB列にSheet2の内容をコピーして、(ここまではできました) Sheet1のB列に入ってきたデータの横(A列に)連番を振りたいと思っています。 そのため、以下のように作ってみたのですが、 A列に表示される連番が現在のB列の最後の数“54”をA列全て(B列にデータがあるところ)に表示してしまいます。 どの部分が悪いのかさっぱりわからず、どのように修正すべきかもわからず・・・困ってしまっています。 よろしくお願いします。 Dim i As Range Dim mycount As Range Set mycount = Application.Intersect(Target, Me.Range("b:b")) If mycount Is Nothing Then Exit Sub End If Application.EnableEvents = False For Each i In mycount If IsEmpty(i.Value) Then i.Offset(0, -1).ClearContents Else i.Offset(0, -1).Value = Application.WorksheetFunction.CountA(Range("b2:b200")) End If Next i Application.EnableEvents = True End Sub

  • Excel VBAで半角

    Excel VBAで半角 A列が半角のときに、B列にoと表示させるために下記のソースを考えたのですがうまくいきません。初歩的な質問だとは思いますがよろしくお願いします。 Sub 半角判定() Dim i For i = 2 To Range("g65536").End(xlUp).Row If Application.Len(Cells(i, 1)) = Application.LenB(Cells(i, 1)) Then Cells(i, 2) ="o" End If Next End Sub

  • vba検索結果を保持しつつ、次の検索結果が欲しい

    a列にあるセルがe列にないか検索し、あった場合は、b列にあるセルがf列にないか検索し、あった場合は、c列にあるセルがg列にないか検索し、あった場合は、c列とg列が合致した2つ隣のセル(i列)に、d列にあるセルとh列にあるセルを結合させた結果を、表示させたいです。 以下のコードを走らせましたが、何も起こりませんてした。 お手数ですが、ご教示いただけますと幸いですm(_ _)m sub merge () dim i as long for i = 1 to cells(rows.count,1).end(xlup).row if cells(i,1) = cells(i,5) then if cells(i,2) = cells(i,6) then if cells(i,3) = cells(i,7) then cells(i,7).offset(0,2) = cells(i,4) and cecls(i,8) i = i + 1 end if end if end if next end sub

  • if文について

    Excel 2007 VBAを使用しています。 ↓のクリックイベントを実行するとif文のところで不具合があります。 商品シートのC列には、状況が保存されています。 該当した年月、"受取済み"、"注文中"以外の行データをリストさせます。 商品シートのJ列、W列には、該当した年月、"受取済み"、"注文中"以外の行データが存在するのですが、まったく検出してくれません。 対処方法を教えてくれませんか? ------------------------------------------- Option Explicit Private Sub CB1_Click() '変数を定義 Dim i As Long Dim maxRow As Long Dim inSheet As Worksheet Dim outSheet As Worksheet '入出力先のシートをオブジェクト変数へ格納 Set inSheet = Worksheets("商品") Set outSheet = Worksheets("結果") 'テキストボックスの内容を判定 If (Me.TextBox21.Value = "") Or (Not IsDate(Me.TextBox21.Value)) Then MsgBox "日付が入力されていません" Exit Sub End If '最終行番号を取得 maxRow = Me.Cells(Rows.Count, "A").End(xlUp).Row '商品シートの最終行番号で分岐処理 If maxRow > 3 Then '出力先を削除してヘッダーをコピー outSheet.Cells.Delete inSheet.Range("A3").EntireRow.Copy outSheet.Range("A1") Application.CutCopyMode = False Else '4行目以降にデータが入力されていなければメッセージで終了 MsgBox "該当データがありません" Exit Sub End If '4行目から最終行まで繰り返し For i = 4 To maxRow 'J列が日付であれば処理 If IsDate(inSheet.Cells(i, "J").Value) Then '--------機能しない箇所(開始) If Year(inSheet.Cells(i, "J").Value) <= Year(Me.TextBox21.Value) And _ Month(inSheet.Cells(i, "J").Value) <= Month(Me.TextBox21.Value) And _ CStr(inSheet.Cells(i, "W").Value) <> "受取済み" And CStr(inSheet.Cells(i, "W").Value) <> "注文中" Then '--------機能しない箇所(終了) inSheet.Rows(i).Copy outSheet.Rows(cnt + 2) End If End If Next i End Sub

専門家に質問してみよう