膨大なデータの中から瞬時に目的のセルを見つけ出したい!!
こんな処理をサクッとやりたいときってありませんか?
私は電気設備を保守管理する会社に勤めていた頃、
1万行を超える電気設備台帳から「不良になった設備情報」「取替をした設備情報」「取替要求をした設備情報」などを抜き出して一覧表にする
という作業をしていました。
フィルターを使えば簡単じゃん!と思われるかもしれませんが、情報量が多すぎてフィルターをかけるだけでも手間がかかります。
検索作業をもっとスムーズに処理したい!
こんな思いから導入したのが『検索VBA』です。
この記事では、「VBAを使った検索のテクニック」「実務に導入した検索VBAの概要、使い方」を解説しています。
また、本記事で紹介しているような『VBA開発に役立つ情報を配信するメルマガ』をスタートさせました。
「VBA学習用の教材」「エクセル作業自動化のアイデア」を無料でゲットすることができます。
手作業で行っている検索作業を自動化して仕事の効率をアップさせちゃいましょう。
目次
VBAでセルを検索する基本スキルを徹底解説!初心者でもすぐに使える検索テクニック
VBAでセルを検索する技術は、Excelの作業効率を劇的に改善する魔法のようなスキルです。
よく使用されるのが『Findメソッド』で、
膨大なデータの中から瞬時に目的の情報を見つけ出すことができる
超便利ツールです。
他にも『Offsetメソッド』や『For Next』など、いろんな方法で検索処理を実行することができます。
FindメソッドでExcelセルを簡単に探し出す方法
Findメソッドは、「指定した値を持つセルを瞬時に探し出す」ツールです。
具体的には、以下のように使用されます。
Sub FindCellExample()
Dim ws As Worksheet
Dim foundCell As Range
Set ws = ActiveSheet
Set foundCell = ws.Cells.Find(What:="検索したい値", LookIn:=xlValues)
If Not foundCell Is Nothing Then
MsgBox "セルが見つかりました!場所は " & foundCell.Address
Else
MsgBox "値が見つかりませんでした"
End If
End Sub
Findメソッドの構文
検索条件がこちら
What・・・検索したい値
LookIn・・・情報の種類を指定(数式、値、コメント分)
LookAt・・・一部を検索するのか、全部を検索するのか、を指定
ガッツポーズの人
Offsetを活用したセル検索の驚くべき効率化テクニック
Offsetメソッドは、
基準となるセルから相対的な位置にあるセルを参照
することができます。
たとえば、
「会社名」「代表氏名」「住所」が入力された一覧表で、「会社名」を検索するだけで「代表氏名」「住所」をまとめて検索する
このように活用稼働。
実践的なサンプルコードがこちら
Sub OffsetSearchExample()
Dim ws As Worksheet
Dim baseCell As Range
Dim relatedCell As Range
Set ws = ActiveSheet
Set baseCell = ws.Range("A1")
Set relatedCell = baseCell.Offset(2, 3)
MsgBox "基準セルから2行下、3列右のセルの値: " & relatedCell.Value
End Sub
offsetメソッドの構文
offset( 2 , 3 )とすれば、
検索したいセルから2行下、3列右のセルを検索
となります。
初心者が陥りがちな検索ミスと回避策
VBAでのセル検索がうまく動作しない場合のほとんどが、
範囲指定が適切に行われていないミス
です。
ミスを防止するためには、
常に明確な検索範囲を設定しエラーハンドリングを意識することが重要。
私がよくやってしまうエラーは
結合セルを中途半端に含むように検索範囲を指定してしまうこと
です。
エラーが発生した場合、慌てずにコードのどの部分でエラーが発生しているかをデバックしましょう。
Range(”A1”)・・・の前後のコードで止まっている場合、検索範囲ミスを疑ってみてください。
関連記事「VBAのデバック方法」では、
効率的なデバック方法をVBA初心者の方でもわかりやすく解説
しています。
VBAを設定したけどエラーが発生して思い通りに動作しない こんな問題を『デバック』で解決します。 私はエクセル業務の効率をアップさせるために、エクセル作業を自動化するVBAをいくつも開発してきました。 そこで問題となるのは、VBAを実行したらエラーが発生して作業が中断されてしまうことです。 疲れ果てた人なぜエラーが出るの?どこが間違ってるかわからない。。。 このようにお困りの方は、本記事で解説する『デバックのテクニック』を参考にしてみてください。 難しいと思われがちなVBA... 【VBAのデバック方法】初心者でも5分で解決するテクニックをご紹介 - mamemametochan.com |
VBAを設定していれば、エラーは必ず発生するものなので冷静に対処しましょう。
プロが教える!VBAセル検索の高度なテクニック
VBAでのセル検索は、
単なる値の検索にとどまらず驚くほど複雑で柔軟な検索が可能
です。
「どんな検索処理ができるのか」を具体的な事例を使ってご紹介します。
複雑な条件でセルを瞬時に見つける検索アルゴリズム
複雑な検索条件下でも、VBAは柔軟に対応できます。
Findメソッドを使ったサンプルコードがこちら
Sub AdvancedSearchExample()
Dim ws As Worksheet
Dim searchRange As Range
Dim foundCell As Range
Set ws = ActiveSheet
Set searchRange = ws.Range("A1:D100")
Set foundCell = searchRange.Find( _
What:="検索値", _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
If Not foundCell Is Nothing Then
MsgBox "条件に合うセルが見つかりました: " & foundCell.Address
End If
End Sub
A1セルからD100セルの範囲で検索値が見つかった場合、メッセージボックスが表示されます。
大量データから目的のセルを抽出する究極の方法
大量のデータから特定の条件に合うセルを抽出できるVBAをご紹介します。
下記のサンプルコードは、
AutoFilterとAdvancedFilterを組み合わせたもので、複雑な条件下でも瞬時にデータを抽出可能
です。
Sub ExtractSpecificCells()
Dim ws As Worksheet
Dim dataRange As Range
Dim criteriaRange As Range
Dim extractRange As Range
Set ws = ActiveSheet
Set dataRange = ws.Range("A1:E1000") ' データが存在する範囲
Set criteriaRange = ws.Range("G1:G3") ' 抽出条件を定義するrange
Set extractRange = ws.Range("I1") ' 抽出結果を出力する開始セル
' AdvancedFilterを使用したデータ抽出
dataRange.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=criteriaRange, _
CopyToRange:=extractRange, _
Unique:=False
' 抽出されたデータの数を表示
MsgBox "抽出されたデータ数: " & ws.Range("I:I").SpecialCells(xlCellTypeConstants).Rows.Count
End Sub
このコードの特徴はこちら
- データ範囲(dataRange)を明確に指定
- 抽出条件を別途定義可能(criteriaRange)
- 抽出結果を任意の場所に出力可能
- 一意の値のみ抽出するオプションも提供
実際の業務では、
売上データから特定の条件を満たす取引を抽出したり、大量の顧客リストから特定の属性を持つ顧客を瞬時に特定したり、
様々なシーンで活用できます。
エラー処理を考慮したセル検索の実践テクニック
VBAでのセル検索において、
エラー処理は安定したコードを作成する上で最も重要な要素の一つ
です。
予期せぬエラーや例外的な状況に適切に対応することで、マクロの信頼性と堅牢性を大幅に向上させることができます。
エラー処理VBAが導入された検索VBAのサンプルコードがこちら
Sub SafeCellSearch()
Dim ws As Worksheet
Dim searchRange As Range
Dim foundCell As Range
Dim searchValue As String
' エラーハンドリングの設定
On Error GoTo ErrorHandler
' 変数の初期設定
Set ws = ActiveSheet
Set searchRange = ws.Range("A1:Z1000")
searchValue = "検索対象の値"
' 検索処理
Set foundCell = searchRange.Find( _
What:=searchValue, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext)
' 結果の処理
If Not foundCell Is Nothing Then
' 値が見つかった場合の処理
MsgBox "セルが見つかりました!場所: " & foundCell.Address
Else
' 値が見つからない場合の処理
MsgBox "指定した値は見つかりませんでした。"
End If
' 正常終了
Exit Sub
ErrorHandler:
' 具体的なエラー処理
Select Case Err.Number
Case 1004
MsgBox "検索中にエラーが発生しました。検索範囲を確認してください。"
Case 424
MsgBox "オブジェクト変数が正しく設定されていません。"
Case Else
MsgBox "予期せぬエラーが発生しました。エラーコード: " & Err.Number
End Select
' エラーログの記録(オプション)
Call LogError(Err.Number, Err.Description)
End Sub
' エラーログ記録用のサブルーチン
Sub LogError(errNumber As Long, errDescription As String)
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Sheets("ErrorLog") ' エラーログ用のシート
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
ws.Cells(lastRow, 1).Value = Now
ws.Cells(lastRow, 2).Value = errNumber
ws.Cells(lastRow, 3).Value = errDescription
End Sub
このコードには、以下のエラー処理テクニックが含まれています。
- On Error GoTo ErrorHandler: 包括的なエラーハンドリングの設定
- 具体的なエラータイプに応じた異なる対応
- エラーログ記録の仕組み
- 検索結果がない場合の適切な処理
- オブジェクト変数の null チェック
このエラー処理は『検索VBA』以外のコードにも対応可能です。
エラー処理は、開発するマクロの信頼性を支える重要な技術なので自由に扱えるようにしておきましょう。
『入力したテキストと一致するデータを抽出するVBAを開発してみた
扱うデータ量が多すぎて目的のデータが見つからない。フィルターをかけても同じような内容の項目が多すぎてさらに検索しなければならない。
こんな問題を解決するために開発したのが、
『入力したテキストと一致するデータを抽出するVBA』
です。
このVBAを使えば、
大量のデータの中から「指定するテキストが含まれるデータ」を瞬時に検索する
ことができます。
検索VBAの理解を深めてもらうためにサンプル事例として紹介していきます。
『入力したテキストと一致するデータを抽出するVBA』とは?
『入力したテキストと一致するデータを抽出するVBA』は
検索したい日付を検索し該当するデータを表示する
というものです。
こんな感じ
左側にある一覧表内のデータを検索し、検索した日付と一致するデータを真ん中の表に表示させます。
『入力したテキストと一致するデータを抽出するVBA』の使い方
使い方は
日付を入力し実行ボタンを押下する
たったこれだけです。
VBAの処理結果がこちら
検索で該当するデータが左側の一覧表から真ん中の一覧表に転記されます。
しかも、
検索結果の最終行には自動的に合計が集計されます。
VBAの解説
設定されているVBAがこちら
Sub 検査日抽出()
On Error Resume Next
gyo = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 5), Cells(gyo, 6)).ClearContents
For i = 2 To gyo
gyo2 = Cells(Rows.Count, 5).End(xlUp).Row
If Cells(i, 3) = Cells(2, 8) Then
Cells(gyo2 + 1, 5) = Cells(i, 1)
Cells(gyo2 + 1, 6) = Cells(i, 2)
Else
End If
Next
gyo3 = Cells(Rows.Count, 6).End(xlUp).Row
Cells(gyo3 + 1, 5) = "合計"
Cells(gyo3 + 1, 5).Font.Bold = True
Cells(gyo3 + 1, 6) = Application.WorksheetFunction.Sum(Range(Cells(2, 6), Cells(gyo3, 6)))
Cells(gyo3 + 1, 6).Font.Bold = True
End Sub
シンプルな内容にするために「findメソッド」や「Offsetメソッド」は一切使っていません。
「For Next(繰り返し処理)」と「IF関数」で検索しています。
主な内容がこちら
- 5行目は、繰り返し処理を開始
- 6行目は、最終行にデータを転記し続けるための変数を定義
- 7行目は、IF関数で「日付と一致する場合」という条件を付加
- 13~17行目は、転記したデータの合計を集計
データを検索し別の一覧表に転記するVBAは実務でめちゃくちゃ使われます。
関連記事「抽出VBAで仕事の効率アップ」では
『入力したテキストと一致するデータを抽出するVBA』が設定されたエクセルファイルをダウンロード
することができます。
「日付を検索して転記するVBA」の他に、
「指定するテキストが含まれるデータを転記するVBA」と「【】内のテキストを抽出するVBA」が設定
されています。
- 仕事で使っているエクセルファイルに導入するもヨシ
- 設定されているコードをアレンジして使うもヨシ
- VBA学習用として活用するもヨシ
いろんな使い方ができます。
サンプルファイルを使って検索VBAの使い方をマスターしましょう。
まとめ:VBAでセルを検索するポイント
VBAでのセル検索は、
大量のデータから目的のセルを瞬時に検索する
ことが可能になります。
疲れ果てた人
『検索VBA』を設定するときのポイントがこちら
- 「Findメソッド」や「Offsetメソッド」がよく使用される
- For Nextと関数IFの組み合わせでも検索VBAが作れる
- AutoFilterとAdvancedFilterの組み合わせで複雑な検索が可能
- エラーを防止するVBAの設定が重要
大量のデータを編集するようなエクセル作業では、検索VBAの導入は必須です。
ちょっとした検索作業であっても積み重ねれば、多くの時間と労力が消費されてしまいます。
エクセルを使って仕事をする以上、検索作業がなくなることはないでしょう。
ならば、
早い段階で『検索VBA』を導入しちゃった方がいいと思いませんか?
VBAの導入が早ければ早いほど生涯検索作業で費やされる時間が削減できます。
この記事を読んで、
「VBAやってみたい!」「いろんなエクセル業務の自動化に挑戦したい!!」
と感じてくれた方はエクセルVBAの情報を定期的に配信しているメルマガへの登録を検討してみてください。
エクセル業務で苦しんだ私の経験を元に、実務で役立つVBA情報をお届けしています。
この記事が、あなたの業務効率化への第一歩となることを願っています。