日時(日付と時刻)を配列で検索/文字列で扱う

日付と時刻を配列で探す方法です。

Findメゾットの日時(日付と時刻)の検索・VBAは注意

検索結果はの値の行番号を表示します。

検索
目次

サンプルコード

検索データを文字列で格納し、検索値はdata型で宣言しますがテキスト扱いします。

検索データ数指定の場合

For~Next文の開始と終了の値を直接指定する例です。

 Sub smple1()
    Dim kw As Date: kw = Range("D1").Text
    Dim rng(10) As String
    Dim i As Long, j As Long
    
    For i = 1 To 10
        rng(i) = Cells(i, 1)
    Next i
    
    For j = LBound(rng) + 1 To UBound(rng)
        If rng(j) = kw Then
            Debug.Print j
            Exit Sub
        End If
    Next j
     Debug.Print "該当なし"   
End Sub

説明
  • 2行目:変数はdata型
  • 6~8行目:検索データを配列に文字列として格納します。
    配列は0から始まりますが、わかりやすくするために1からはじめます。
  • 10行目:配列を1から格納しているので「LBound(rng) + 1」
ローカルウィンドウ
ローカルウィンドウ

行目を「Dim kw As string: kw = Range("D1").Text」にした場合は検索できません。変数kwは2021/12/1・・・と日が1桁だが、検索データの日は「01」と2桁です。

検索データを変数で指定する場合

For~Next文の開始と終了の値を変数で指定する方法です。

 Sub smple2()
 Dim kw As Date: kw = Range("D1").Text
 Dim rng() As String
 Dim n As Long
 n = WorksheetFunction.CountA(Range("A:A"))
 ReDim rng(n)
 Dim i As Long, j As Long

For i = 1 To n
    rng(i) = Cells(i, 1)
Next i

For j = LBound(rng) + 1 To UBound(rng)
    If rng(j) = kw Then
        Debug.Print j
        Exit Sub
    End If
Next j
 Debug.Print "該当なし" 
End Sub
説明
  • 3行目:配列の要素数を指定しません
  • 4~5行目:A列のデータ個数を調べます
  • 6行目:配列の要素数をしていします

14行目の「LBound(rng) + 1 To UBound(rng)」は「1 To n」でも同じ結果です。

検索データに検索値があるのに見つからない例

データは日時なのでdate型の変数を使うと検索できない例です。

失敗する理由:日時(日付と時刻)の検索・VBAのFindメゾットは注意

Sub smple3()
    Dim kw As Date: kw = Range("D1")
    Dim rng() As Variant
    rng = Range("A1").CurrentRegion
        
    Dim i As Long
    For i = LBound(rng, 1) To UBound(rng, 1)
        If rng(i, 1) = kw Then
            Debug.Print i
            Exit Sub
        End If
    Next i
     Debug.Print "該当なし"
End Sub

4行目:Range("A1").CurrentRegionで一気に要素を代入します。

ローカルウィンドウで確認した画面です。検索データと検索値の両方ともdata型です。

ローカルウィンドウ
エクセルシート

時刻の「0:00:00」の検索

時刻が「0:00:00」の時の検索を確認すると、変数kwの値も「0:00:00」の表示です。

ローカルウィンドウ

参照:【VBAの配列】値の一括代入と高速処理

上記リンク先は配列についてです。

目次