はじめに
VBAで日付を扱う処理をしていると、「指定した範囲に今日の日付が入力されているセルがあるかどうかを判定したい」というニーズはよくあります。
私自身も、A列に連続した日付が入力されているシートにおいて、
「今日」の日付が入力されたセルの位置を特定したいと考え、その方法をVBAで実装してみました。
使用する関数:WorksheetFunction.Match
VBAには、Excel関数をそのまま使えるWorksheetFunction
という便利な機能があります。
今回使用するのは、その中のMatch
関数です。
これを使うことで、A列の中にある「今日の日付」と一致するセルの位置を取得することができます。
コード例:A1〜A1000に今日の日付があるか検索
Dim find_date As Variant
find_date = WorksheetFunction.Match(CLng(Date), Range("A1:A1000"), 0)
コードの解説
CLng(Date)
Date
関数で取得した「今日の日付」は、VBAでは**日付型(Date型)**として扱われます。- しかし、
Match
関数では**Excelシート上のシリアル値(Long型)**と一致させる必要があるため、CLng()
で変換します。
Range("A1:A1000")
- 検索対象範囲をA1からA1000に設定しています。必要に応じて変更可能です。
0
(完全一致)
- Match関数の第3引数に
0
を指定することで、「完全一致」モードになります。 - 今日の日付とまったく同じ日付が入力されているセルだけを対象とします。
実行結果の例
たとえば、A列の5行目に2024/05/01
という日付が入力されており、
今日の日付が同じであれば、find_date
には「5」という値が格納されます。
この「5」は範囲内(A1:A1000)の5番目という意味であり、行番号そのものではないことに注意してください。
エラー対策:今日の日付が存在しない場合の処理
Match関数は、対象が見つからないとエラーになるという特徴があります。
そのため、事前にエラーハンドリングを入れておくと安全です。
簡易的なエラーハンドリング例
Dim find_date As Variant
On Error Resume Next
find_date = WorksheetFunction.Match(CLng(Date), Range("A1:A1000"), 0)
If IsError(find_date) Then
MsgBox "今日の日付は見つかりませんでした。"
End If
On Error GoTo 0
このようにしておけば、対象が見つからない場合でも処理が中断されることはなく、
ユーザーにメッセージを表示して次の処理に移ることが可能です。
まとめ
VBAで「今日の日付が入力されたセルを検索したい」場合には、以下のポイントを押さえることでスムーズに実装できます。
WorksheetFunction.Match
で検索位置を取得するDate
関数で今日の日付を取得し、CLng()
でシリアル値に変換するMatch
の第3引数に**完全一致(0)**を指定する- 対象が見つからなかった場合のエラーハンドリングも忘れずに
このテクニックを活用すれば、日付をキーにした自動化処理がよりスマートに構築できるようになります。