• ベストアンサー

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

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