プロが教えるわが家の防犯対策術!

エクセルのB列に「10:20:00」といった時間が入力されています。
ある時間を条件にして、マクロに

For i=1 to 100
If cells(i,2)="10:20:00" then ・・・

といった条件分岐のコードを書いたのですが、デバッグすると10:20:00の部分が認識されていないようです。
セルの書式設定で表示形式は「時刻」になっています。
試しに、同じ部分を「A」という文字に置き換えるとマクロはちゃんと動くようです。
時刻を認識させるにはどうすればよいでしょうか。

A 回答 (4件)

If Cells(i, 2) = TimeValue("10:20:00") Then



ではいかがでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 22:21

シリアル時刻ならば次の方法は如何でしょうか。


TimeValue("10:20:00") or TimeSerial(10, 20, 0)
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 22:23

こんにちは。



なかなか、難しい質問ですね。日付の比較は分かっているけれども、時間の比較というのは、私は、検証したことがありません。シリアル値の比較で本当に良いのかは、私は、疑問に残ります。

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 メソッドの検索の仕組みは、少し複雑になっているようです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 22:40

#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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!