こんにちは!Excelでデータ表から特定の条件に合う複数の項目を抽出するのは、手作業では時間がかかることがありますよね。そこで、今回はVBAを使って、単独の条件に合致する行から複数の項目を効率よく抽出する方法をご紹介します。これにより、データ処理が大幅に効率化され、正確に必要な情報を取り出すことができます。手作業の煩わしさを解消し、業務をスムーズに進めるための実践的なテクニックをぜひ参考にしてください。
また、特定の項目のみを返す方法についてもぜひご覧ください。
使用するデータ表
まず使用するデータ表について解説します。
データ表の構成
データ表は「№」「購入日」「メーカー」「品名」「価格」という構成となっており、今回はデータを24行分作成しました。
検索条件
次に検索条件の説明を行います。
今回の検索条件には「品名」のみを指定しており、下図のように「検索条件」というワークシート上のB4セルに入力した値が条件として使用されます。ちなみにB4セルは入力規則にてリスト化して選択肢を出すようにしました。
検索結果の表示
VBAを実行した結果は下図のように検索条件欄の下に設けた表に出力されます。構成としてはデータ表と同様です。図では「伊勢海老」を検索して該当するレコードが6行分抽出されています。
コード解説★★★(コピーはここ)★★★
Sub Search()
‘ 検索条件を格納する変数の宣言
Dim Cond1 As String
‘ 検索開始行と結果を格納する行番号の宣言
Dim Search_Y, R_Y As Long
‘ 検索結果を格納するための二次元配列の宣言(最大100行、5列)
Dim Result(100, 5) As String
‘ 検索条件を「検索条件」シートのB4セルから取得
Cond1 = Range(“検索条件!B4”).Value
‘ 検索を開始する行番号を設定
Search_Y = 4
‘ 検索結果を格納する行番号を初期化
R_Y = 0
‘ データシートの行を順に検索し、空白行が出るまで処理を繰り返す
Do While Worksheets(“データ”).Cells(Search_Y, 3).Value <> “”
‘ 検索対象行の品名が検索条件と一致するか確認
If Worksheets(“データ”).Cells(Search_Y, 5).Value = Cond1 Then
‘ResultへNoを格納
Result(R_Y, 0) = Worksheets(“データ”).Cells(Search_Y, 2).Value
‘Resultへ購入日を格納
Result(R_Y, 1) = Worksheets(“データ”).Cells(Search_Y, 3).Value
‘Resultへメーカーを格納
Result(R_Y, 2) = Worksheets(“データ”).Cells(Search_Y, 4).Value
‘Resultへ品名を格納
Result(R_Y, 3) = Worksheets(“データ”).Cells(Search_Y, 5).Value
‘Resultへ価格を格納
Result(R_Y, 4) = Worksheets(“データ”).Cells(Search_Y, 6).Value
‘ 次の結果を格納するため、行番号を1つ進める
R_Y = R_Y + 1
End If
‘ 次の行に移動
Search_Y = Search_Y + 1
Loop
‘ 検索結果を「検索条件」シートのB8セルから始まる範囲に出力
Range(“検索条件!B8”).Resize(UBound(Result), 5).Value = Result
End Sub
解説
今回のコードは大きく分けて「変数の宣言」「検索条件の取得」「検索/価格取得」「検索結果の格納」の4つに分かれています。ではそれぞれ順番に説明していきます。
「変数の宣言」
Sub Search()
Dim Cond1 As String
Dim Search_Y, R_Y As Long
Dim Result(100, 5) As String
この4行でコードで使用する変数を宣言しています。
1行目:マクロ名を「Search」と定義
2行目:検索条件を格納する変数
3行目:検索する対象行と結果を貼り付ける行番号を管理する変数
4行目:検索結果を一時的に格納するための二次元配列を宣言
検索条件や入力位置などの情報を指定
Cond1 = Range(“検索条件!B4”).Value
Search_Y = 4 ‘検索開始行
R_Y = 0
1行目:検索条件を変数に格納
2行目:検索開始行を変数に格納
3行目:出力位置を変数に格納
検索ループ処理と結果の格納
Do While Worksheets(“データ”).Cells(Search_Y, 3).Value <> “”
If Worksheets(“データ”).Cells(Search_Y, 5).Value = Cond1 Then
Result(R_Y, 0) = Worksheets(“データ”).Cells(Search_Y, 2).Value
Result(R_Y, 1) = Worksheets(“データ”).Cells(Search_Y, 3).Value
Result(R_Y, 2) = Worksheets(“データ”).Cells(Search_Y, 4).Value
Result(R_Y, 3) = Worksheets(“データ”).Cells(Search_Y, 5).Value
Result(R_Y, 4) = Worksheets(“データ”).Cells(Search_Y, 6).Value
R_Y = R_Y + 1
End If
Search_Y = Search_Y + 1
Loop
1行目:データ表の空白行が出てくるまで2~9行目の処理を繰り替えす
2行目:検索対象行の品名が検索条件と一致するかを確認
3~7行目:検索条件に合致する時、配列にそれぞれの情報を格納
8行目:格納する配列番号を1つ増やす
9行目:検索条件に一致しない時、2行目からここまでスキップする
10行目:検索対象行を1行下へ移動する
11行目:1行目に戻る
抽出結果を貼付け
Range(“検索条件!B8”).Resize(UBound(Result), 5).Value = Result
End Sub
1行目:検索条件に合致し、配列に格納したデータをすべて一括で入力する。
2行目:このマクロ処理がここで終了という意味。
使用している技術
基本:DO-LOOP、二次元配列、Resize
まとめ
この記事では、VBAを使ってExcelのデータ表から条件に合う複数の項目を抽出する方法を解説しました。このスクリプトを活用することで、在庫管理、販売データの分析、顧客リストの抽出など、さまざまなビジネスシーンで作業効率が大幅に向上します。次のステップとして、エラーハンドリングや条件を追加してさらに精密なデータ抽出を行う方法も学んでみてください。VBAの力で、あなたの業務をよりスマートにしていきましょう!
コメント