【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分くらいハマったわ😅
じゃ、またね✋



ディスカッション
コメント一覧
まだ、コメントがありません