【VBA】つまらないことでハマった

制御文の罠?

お疲れモードのjimです。ども✋

今回は、VBAのくっだらないことでハマったという記事です。

『時間を入れる変数を文字列で定義してた』っていう凡ミスで、制御文が仕事をしていなかったという。。。

流れを説明すると⇒

1、hm1とhm2って変数を文字列で定義した

2、その変数2つを不等号(If文)で比較しようとした

3、10:00に9:00が勝った(9:00>10:00ってこと)

そゆ話。

 

10時よか9時

要するに文字列で比較してたんだよね。(当たり前だけど)

例えば、Dir関数使って1~11っていうファイル名を取得すると、1の次に10。10の次に11っていうファイル名がくるのと一緒ってこと。

だから、10:00より9:00のが大きいという判定になる。

↓10より2のが大きいという結果になる(ノーヒット)

Sub a()
Dim hm1 As String
Dim hm2 As String
    hm1 = "2"
    hm2 = "10"
    If hm1 < hm2 Then
        Debug.Print "ヒット"
    Else
        Debug.Print "ノーヒット"
    End If
End Sub

 

文字列で比較させたいなら、hh:mmのような表示形式で比較してやらないとだめってことだね。

↓Formatがないとノーヒットになります

Sub b()
Dim hm1 As String
Dim hm2 As String
    hm1 = "9:00"
    hm2 = "10:00"
    hm1 = Format(hm1, "hh:mm")
    hm2 = Format(hm2, "hh:mm")
    If hm1 < hm2 Then
        Debug.Print "ヒット"
    Else
        Debug.Print "ノーヒット"
    End If
End Sub

 

↓のように変数に代入する時に#で囲めばいいんだけどね

Sub c()
Dim hm1 As String
Dim hm2 As String
    hm1 = #9:00:00 AM#
    hm2 = #10:00:00 AM#
    If hm1 < hm2 Then
        Debug.Print "ヒット"
    Else
        Debug.Print "ノーヒット"
    End If
End Sub

 

でも今回はExcelのcellから取得したんだよね。

↓じゃあ、CDate関数で比較?

Sub d()
Dim hm1 As String
Dim hm2 As String
    hm1 = "9:00"
    hm2 = "10:00"
    If CDate(hm1) < CDate(hm2) Then
        Debug.Print "ヒット"
    Else
        Debug.Print "ノーヒット"
    End If
End Sub

 

しっかり定義しろ

いやぁ。。。

やり方は色々あるだろうけど、最初から時間(日付型)で定義しとけって話。

Sub e()
Dim hm1 As Date
Dim hm2 As Date
    hm1 = "9:00"
    hm2 = "10:00"
    If hm1 < hm2 Then
        Debug.Print "ヒット"
    Else
        Debug.Print "ノーヒット"
    End If
End Sub

 

まあ、人生色々あらぁな。

 

 

はい、そんな感じ。

今週も疲れてたからなぁ。。

吹き出物できてるし。。。

全然気づかなくて、20分くらいハマったわ😅

じゃ、またね✋