Categories: VBA

VBAでセルを検索する│一致する行のセル番地を取得する方法を説明

この記事では、VBAを使って特定の文字列が入力されたセルを検索し、該当するセル番地を取得する方法を実際のVBAコードも含めて説明します。

Excelには、オートフィルターという機能が存在しているように、データテーブル(表)の中から任意の文字列等を検索する機会は多いと思います。

VBAを使ってExcel業務の自動化を行うのであれば、セルの検索方法は、必須で習得しなければならないコードのひとつです。

セルの中から任意の文字列を検索し、該当するセル番地を取得する方法について、VBAコードを紹介しますので、ご参考になれば幸いです。

VBA│セルを検索する

この章では、ExcelのA列(A1からA7)に入力されている文字列の中から VBA という文字列を検索し、該当するセルのセル番地を取得するVBAコードを紹介します。セル番地は変数「r」に取得し、正確に取得していることを確認するため最後にメッセージボックスで表示する処理も加えています。

プログラミング全体で言えることですが、セルの検索は、該当する文字列が見つからなかった場合、エラーとなってプログラムの実行が停止してしまいます。今回のVBAコードでは、見つからなかった場合、エラーを回避するコードも加えています。これは特別なことではなく、基本かつ実践的な構文です。

基本構文

Set r = object.Find(What:=)
r.Address

  • Set r = 変数 r に検索文字を格納するステートメント
  • object = 検索対象のセル範囲
    この例では、A:Aです
  • Find(What:=) = 検索対象を指定するメソッド
    この例では、VBAです
  • r.Address = 該当したセルのセル番地を取得するプロパティ

セル検索のVBAコード

Sub Sample()


・・・①
Dim r As Range
Set r = Range(“A:A”).Find(what : =”VBA”)

・・・②
If r Is Nothing Then
MsgBox “ありませんでした”

Else: MsgBox r.Address

End If


End Sub

解説

①まず、変数rを宣言します。rは、セル番地を格納するための変数となりますので、Range型にしています。

次に、基本構文で紹介したように Set ステートメントを使ってA列全体から VBA という文字列を検索しています。

②Findメソッドは該当する文字列等が見つからなかった場合、Nothing という結果を返します。そのため、 Nothing が返ってきた場合の処理を、If構文で記述しています。このIf構文によって、見つからなかった場合のエラーを回避しています。

見つからなかった場合

なお、Else:MsgBox r.Address の部分のAddressプロパティについて。Addressプロパティを省いてしまうと、メッセージボックスには、取得した文字列しか返されません。つまり、結果が「VBA」という文字列になってしまい、セル番地の取得ができないのです。

msgBox r.Address
msgBox r

応用編:検索結果の右隣のセルを取得する

実業務において、Excelでセルを検索する場合には、該当するセルの右隣のセルを取得する必要があるケースは多いと思います。例えば、該当セルの右隣に日付が入力されている場合や性別など、何らかのステータスが入力されている場合などです。

この章では、前章で説明したセルの検索VBAコードを応用して、検索結果の右隣のセルの情報やセル番地を取得するVBAコードを紹介します。

右隣のセルの情報を取得するためには、Nextプロパティ を使います。

右隣のセルの情報を取得する

Elseの行でNextプロパティを使っています。(Next.Value)

Sub Sample()


Dim r As Range
Set r = Range(“A:A”).Find(what : =”VBA”)

If r Is Nothing Then
MsgBox “ありませんでした”

Else: MsgBox r.Next.Value

End If


End Sub

<メッセージボックスの結果>

右隣のセル番地を取得する

Elseの行でNextプロパティを使っています。 (Next.Address)

Sub Sample()


Dim r As Range
Set r = Range(“A:A”).Find(what : =”VBA”)

If r Is Nothing Then
MsgBox “ありませんでした”

Else: MsgBox r.Next.Address

End If


End Sub

<メッセージボックスの結果>

Webs

元事務処理担当者として、プログラミングを活用した業務改善を推進している。プログラマ出身ではない事務職の現場目線で情報を発信。 その他、webs-studio.jpをメインに、複数のブログサイトを立ち上げており、合計で月間10万PVのメディア運営を行っている。 姉妹サイト一覧