• ベストアンサー

エクセルマクロで時間のセル内容が認識されない

エクセルのB列に「10:20:00」といった時間が入力されています。 ある時間を条件にして、マクロに For i=1 to 100 If cells(i,2)="10:20:00" then ・・・ といった条件分岐のコードを書いたのですが、デバッグすると10:20:00の部分が認識されていないようです。 セルの書式設定で表示形式は「時刻」になっています。 試しに、同じ部分を「A」という文字に置き換えるとマクロはちゃんと動くようです。 時刻を認識させるにはどうすればよいでしょうか。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 なかなか、難しい質問ですね。日付の比較は分かっているけれども、時間の比較というのは、私は、検証したことがありません。シリアル値の比較で本当に良いのかは、私は、疑問に残ります。 Cells(i,2) ----Cells(i,2).Text とすれば、"10:20:00" は、比較できるはずです。         Cells(i,2).Value とすれば、格納されたものは、見かけ上は、10:20:00 ですが、Date型になっています。 本来は、以下のように、リテラル値(#10:20:00# を直接入れること)は、コーディングの暗黙のルールとしてはいけません。必ず、変数を置いてから、変数に代入して、比較するようにします。 If Cells(i, 1).Value = #10:20:00# Then If Cells(i, 1).Text = "10:20:00" Then 上手く行けば、両方ともヒットするはずです。 ワークシート関数のMatch を使う方法もあるとは思います。 それでは、どれがより良いでしょうか。 私は、この中では、文字列比較が上位に位置すると思います。 理由は、日付値は、Long 型ですからブレはありませんが、時間値は、無限小数のことがあるから、厳密な比較はできないのではないかという不安があります。オートフィルなどで入れると、誤差が発生します。だから、文字列比較が良いのではないか、と考えます。 したがって、以下のように、Text プロパティを入れればよいのではないか、というのが私の回答です。 Sub Test() Dim i As Long Dim myDate As String myDate = "10:20:00" For i = 1 To 100  If Cells(i, 1).Text = myDate Then   MsgBox i  End If Next End Sub Find メソッドの検索の仕組みは、少し複雑になっているようです。

blackleon
質問者

お礼

Wendy02さんには再びお世話になりました。 この一つの質問に対して、様々なことを教えていただき、とても勉強になりました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3の追加 >Find メソッドの検索の仕組みは、少し複雑になっているようです。 Excel2002以上で、その仕様が変わったのだったと思います。 データは時間値のシリアル値で、文字列で検索するのは、ワークシートでは可能でしたが、こういうコードは、前のバージョンでは不可能だったと思います。 ----------------------------------------- Sub FindTest()  Dim rng As Range  Dim FirstAdd As String  Dim c As Variant  Dim srch As Variant  srch = "10:20:00"  Set rng = Range("A1:A100")  Set c = rng.Find( _  What:=srch, _  LookIn:=xlValues, _  LookAt:=xlWhole)    If Not c Is Nothing Then    FirstAdd = c.Address     Do     MsgBox c.Row     Set c = rng.FindNext(c)     If c.Address = FirstAdd Then Exit Sub    Loop Until c Is Nothing    End If End Sub 補足として、Value の比較を、検証してみて、正しいことが分かりました。 [Cells(i,1) と書くと、Value 値になる。暗黙のプロパティといいます] 同じ、時間値でも、以下のような例があります。 最初の時間にはヒットして、次の時間にはヒットしません。 10:20:00  0.430555555555556 10:20:00  0.430555555555555

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

シリアル時刻ならば次の方法は如何でしょうか。 TimeValue("10:20:00") or TimeSerial(10, 20, 0)

blackleon
質問者

お礼

ご回答ありがとうございました。 お蔭様でうまくいきました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

If Cells(i, 2) = TimeValue("10:20:00") Then ではいかがでしょうか?

blackleon
質問者

お礼

ご指摘の方法でうまくいきました。 ありがとうございました。

関連するQ&A

  • マクロについて

    マクロであるプログラムを組んでいますが、うまくいきません。 かなり簡素化していいますと、次のような状況です。 エクセルのcells(1,1)に「9:30」という文字が入っています。 この"9:30"という文字列を読み出そうとするのですが読み出した値は0.39583…という数値になってしまっています。 具体的に言うと、 sub macro1() 開始時刻="9:30" 時刻=cells(1,1) if 開始時刻=時刻 then a=1 endif end というようなプログラム(実際はもう少し複雑ですが)を組んだのですが、どうしても「a=1」にならないので、デバッグ式で見てみると「時刻」の中味は"9:30"ではなく0.39583という数値だったということです。 ちなみにエクセルのそのセルの書式は、「表示形式:時刻、種類13:30」となっています。 どうすれば"9:30"という時刻(文字列)を読み出せるのでしょうか。教えてください。よろしくお願いいたします。

  • エクセルマクロ セルの色つけ

    エクセルのマクロです。 条件で複数セルに色をつけたいのですが以下の方法しかないですか。 もっと多くのセルに一度に色を付ける良い方法がありましたら教えて下さい。 If days = "日" Then With Cells(i, 2).Interior .ColorIndex = 3 .Pattern = xlSolid End With With Cells(i, 13).Interior .ColorIndex = 3 .Pattern = xlSolid End With End If 以上 お願いします。

  • エクセルマクロで特定の範囲内の検索

    A10からA100までのセルを上から順に調べて、セルにAという文字が入力されているときに、その隣にBという文字を入力するマクロを下記のように作りました。 「セルにAという文字が入力されているとき」という条件に加え、「検索しているセルから上の9個のセル(cells(i-9,1)からcells(i-1,1)まで)にAという文字が入力されていない」という条件を加えたいのです。 Sub 検索() Dim i As Integer For i = 10 To 100 If Cells(i, 1).Value = "A" Then Cells(i, 2).value = "B" End If Next i End Sub つまり If Cells(i, 1).Value = "A" Then  の部分を If Cells(i, 1).Value = "A" かつ Range(cells(i-9,1),cells(i-1,1))にAが入力されていない Then という形にしたいのですが、表現の仕方がわかりません。 ご教示よろしくお願いします。

  • 判定してセルを塗りつぶすマクロについて

    判定してセルを塗りつぶすマクロについて教えて下さい。 現在下記のようなマクロがあります。 Sub オニオン判定() Dim i As Integer, j As Integer, r As Integer Dim k As Double Range(Cells(17, 9), Cells(26, 14)).Interior.ColorIndex = 0 Range(Cells(30, 9), Cells(39, 14)).Interior.ColorIndex = 0 k = Cells(5, 2) 'B5セルの値 For j = 9 To 14 For i = 17 To 26 For r = 30 To 39 If Abs(Cells(i, j).Value - Cells(r, j).Value) <= 0.05 Then Cells(r, j).Interior.Color = vbYellow Cells(i, j).Interior.Color = vbYellow End If Next  Next   Next End Sub 対象のIf Abs(Cells(i, j).Value - Cells(r, j).Value) <= 0.05 Then で、それぞれ見比べて、0.05以上のずれがあるとセルが塗りつぶされないというマクロなのですが これを、If Abs(Cells(i, j).Value - Cells(r, j).Value) = 0 Thenという条件も追加して その時はセルを青に塗りつぶし、逆に0.05以上のずれがあるセルは赤に塗りつぶす。 みたいなマクロを書きたいです。 If Abs(Cells(i, j).Value - Cells(r, j).Value) = 0 Thenは一度追加してみましたが 上手く機能しませんでした。 やりたい事 ・数値が動いているけど、0.05以内の時は黄色 ・数値変動が0の場合は青 ・数値変動が0.05以上の場合は赤 です。 宜しくお願いします。

  • excelのマクロで2007だとエラーが。

    excel2003では動いていたマクロが2007では、エラーになってしまいます。 中断→デバッグ→再開→中断→デバッグ→再開、、、、 と中断しながらも10~20行ずつ進みます。 解決法がありましたら教えてください。 ※デバッグで確認すると「end if」で中断します。 Sub 仕分() Dim n As Long Dim nRow As Long Worksheets("シート名").Activate nRow = Range("A1").End(xlDown).Row For n = 2 To nRow If Cells(n, 6) = "条件1" Then Cells(n, 22) = "仕分け" ElseIf Cells(n, 6) = "条件2" Then Cells(n, 22) = "仕分けしない" ElseIf Cells(n, 6) = "条件1" And Cells(n, 7) = "条件2" Then Cells(n, 22) = "仕分け2" Else Cells(n, 22) = "OK" End If Next n End Sub

  • エクセル マクロ 複数セルの色付けについて

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問2_1 、問2_2 、問2_10 (全部で問は2_28まであります)等の文字列があり、その文字に合わせて、そのセルだけ色を付けたいと考えております。 今書いているコードだと、ワークシートのA列にある場合は色が付けられるのですが、それ以外に色が付けられません。どこが間違っているでしょうか? どうぞご指導お願いいたします。 Sub 色つけ() Dim Maxrow As Long Dim i As Long Maxrow = Cells(Rows.Count, i).End(xlUp).Row For i = 1 To Maxrow If InStr(Cells(i, 1), "2_1 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_2 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_23 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 23 If InStr(Cells(i, 1), "2_13 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 4 If InStr(Cells(i, 1), "2_6 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 7 Next i End Sub

  • エクセル2003でのマクロで質問です。

    エクセル2003でのマクロで質問です。 セル(2,22)には"1"という値が入っています。 セル(2,13)には"20100521"という値が入っています。 セル(3,13)には"20100521"という値が入っています。 セル(4.13)には"20100525"という値が入っています。 セル(5,13)には"20100525"という値が入っています。 このようなときに セル(3,22)の値は"1" セル(4,22)の値は"2" セル(5,22)の値は"2" となるように以下のようなマクロを作成しました。 Dim i As Integer, j As Integer, date1 As String i = 2 j = 3 Do While Cells(i, 1).Value <> "" If Cells(i, 13) = Cells(j, 13) Then Cells(j, 22) = Cells(i, 22) Else Cells(j, 22) = Cells(i, 22) + 1 End If i = i + 1 j = j + 1 Loop しかし、結果は セル(3,22)の値は"2" セル(4,22)の値は"3" セル(5,22)の値は"4" となってしまいます。 どこに原因があるのかわかりません。 助けてください。 宜しくお願いします。

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 空白セルを空白と認識しない?

    範囲指定をしてジャンプで「空白セル」を実行すると、きちんとグレー反転するセルがあるのですが、 VBAで if Isnull(Cells(I,3) then… と指定すると、そうではないセルとして認識されています。 なぜでしょうか?

  • エクセル2007 参照セルの値が認識されない

    エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

専門家に質問してみよう