- ベストアンサー
エクセルマクロで時間のセル内容が認識されない
エクセルのB列に「10:20:00」といった時間が入力されています。 ある時間を条件にして、マクロに For i=1 to 100 If cells(i,2)="10:20:00" then ・・・ といった条件分岐のコードを書いたのですが、デバッグすると10:20:00の部分が認識されていないようです。 セルの書式設定で表示形式は「時刻」になっています。 試しに、同じ部分を「A」という文字に置き換えるとマクロはちゃんと動くようです。 時刻を認識させるにはどうすればよいでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 なかなか、難しい質問ですね。日付の比較は分かっているけれども、時間の比較というのは、私は、検証したことがありません。シリアル値の比較で本当に良いのかは、私は、疑問に残ります。 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 メソッドの検索の仕組みは、少し複雑になっているようです。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
#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)
シリアル時刻ならば次の方法は如何でしょうか。 TimeValue("10:20:00") or TimeSerial(10, 20, 0)
お礼
ご回答ありがとうございました。 お蔭様でうまくいきました。
- merlionXX
- ベストアンサー率48% (1930/4007)
If Cells(i, 2) = TimeValue("10:20:00") Then ではいかがでしょうか?
お礼
ご指摘の方法でうまくいきました。 ありがとうございました。
お礼
Wendy02さんには再びお世話になりました。 この一つの質問に対して、様々なことを教えていただき、とても勉強になりました。