【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分くらいハマったわ😅
じゃ、またね✋
ディスカッション
コメント一覧
まだ、コメントがありません