Excel VBAで検索結果を別シートへ自動コピー!初心者向け実践ガイド

Excel・VBA

はじめに:手作業はもう終わり!VBAでExcel検索を自動化

Excel作業で「このデータを探して、別のシートにコピペ」を繰り返していませんか?手作業は時間もかかり、ミスも起こりがちです。この記事では、Excel VBAを使って特定の条件に合致するデータを自動で検索し、別のシートへコピーする方法を、初心者の方でも理解できるよう丁寧に解説します。日々のデータ処理作業を効率化し、あなたの時間を有効活用しましょう。

VBAで検索・コピー処理を実装する基本ステップ

まずは、VBAで検索・コピー処理を行う際の基本的な流れを把握しましょう。

  • 検索元のシートとコピー先のシートを明確にする。
  • 検索したいキーワード(条件)を設定する。
  • 検索元のシートのデータを1行ずつ確認する。
  • 条件に合致する行を見つけたら、その行全体をコピー先のシートへコピーする。
  • ヘッダー行の扱いも考慮する。

【サンプルコード】基本的な検索・コピー処理

「Sheet1」のA列からキーワードを検索し、一致する行を「Sheet2」へコピーする基本的なVBAマクロです。コピー先の「Sheet2」は実行前に2行目以降のデータがクリアされ、「Sheet1」のヘッダーがコピーされます。

Sub SearchAndCopyToAnotherSheetBasic()
    ' 変数の宣言
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim lastRowSource As Long
    Dim nextRowDest As Long
    Dim searchKeyword As String
    Dim i As Long

    ' シートの設定
    Set wsSource = ThisWorkbook.Sheets("Sheet1") ' 検索元シート名を指定
    Set wsDest = ThisWorkbook.Sheets("Sheet2")   ' コピー先シート名を指定

    ' 検索キーワードの設定
    searchKeyword = "りんご" ' ここに検索したいキーワードを入力してください

    ' コピー先シートの既存データをクリア(ヘッダー行は残す)
    ' A列の最終行が1より大きい場合(ヘッダー行以外にデータがある場合)
    If wsDest.Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
        wsDest.Range("A2", wsDest.Cells(Rows.Count, 1).End(xlUp)).EntireRow.ClearContents
    End If
    
    ' コピー先シートの次の書き込み行を特定(ヘッダーがある場合は2行目から)
    nextRowDest = 2

    ' 検索元シートの最終行を取得(A列を基準)
    lastRowSource = wsSource.Cells(Rows.Count, 1).End(xlUp).Row

    ' ヘッダー行をコピー先シートにコピー(初回のみ)
    ' wsDestが空の場合でも、wsSourceの1行目をコピー
    wsSource.Rows(1).Copy Destination:=wsDest.Rows(1)

    ' 検索元シートの2行目から最終行までループ
    For i = 2 To lastRowSource
        ' A列の値がキーワードと完全に一致するかチェック
        If wsSource.Cells(i, 1).Value = searchKeyword Then
            ' 一致した場合、その行全体をコピー先シートへコピー
            wsSource.Rows(i).Copy Destination:=wsDest.Rows(nextRowDest)
            nextRowDest = nextRowDest + 1 ' 次の書き込み行を更新
        End If
    Next i

    MsgBox "検索とコピーが完了しました!", vbInformation
End Sub

コードの解説

  • 変数の宣言とシートの設定: wsSourceとwsDestで、それぞれ検索元とコピー先のシートオブジェクトを設定します。シート名はご自身のExcelファイルに合わせて変更してください。
  • 検索キーワードの設定: searchKeywordに検索したい文字列を代入します。
  • コピー先シートのクリア: 既存の検索結果を上書きするために、コピー先シートの2行目以降のデータをクリアしています。これにより、前回の検索結果が残ってしまうのを防ぎます。
  • ヘッダー行のコピー: 検索元シートの1行目(ヘッダー)をコピー先シートの1行目にコピーします。
  • ループ処理: 検索元シートの2行目から最終行までをForループで1行ずつ処理します。
  • 条件判定とコピー: If wsSource.Cells(i, 1).Value = searchKeyword Thenで、現在の行のA列の値がsearchKeywordと完全に一致するかを判定します。一致すれば、wsSource.Rows(i).Copy Destination:=wsDest.Rows(nextRowDest)でその行全体をコピー先シートのnextRowDest行目へコピーします。nextRowDestはコピーするたびに1ずつ増え、次の行にコピーされるように制御しています。

さらに便利に!応用テクニック

上記の基本コードをベースに、より実用的な機能を追加してみましょう。

1. 検索キーワードをユーザーに入力させる

マクロを実行するたびにコードを編集しなくても済むように、InputBox関数を使ってキーワードを入力できるようにします。

    ' 検索キーワードをユーザーに入力させる
    searchKeyword = InputBox("検索したいキーワードを入力してください。", "キーワード入力")
    If searchKeyword = "" Then
        MsgBox "キーワードが入力されませんでした。処理を中止します。", vbExclamation
        Exit Sub ' キーワードが空の場合は処理を終了
    End If

2. 大文字・小文字を区別しない検索

LCase関数やUCase関数を使って、比較する両方の文字列を同じケースに変換することで、大文字・小文字を区別しない検索が可能です。

    ' A列の値がキーワードと一致するかチェック(大文字・小文字を区別しない)
    If LCase(wsSource.Cells(i, 1).Value) = LCase(searchKeyword) Then
        ' ... コピー処理 ...
    End If

3. 部分一致検索

特定の文字列が含まれている行を抽出したい場合は、InStr関数を使用します。これにより、「りんご」というキーワードで「青りんご」や「りんごジュース」も検索対象にできます。

    ' A列の値にキーワードが含まれるかチェック(部分一致、大文字・小文字を区別しない)
    If InStr(1, LCase(wsSource.Cells(i, 1).Value), LCase(searchKeyword)) > 0 Then
        ' ... コピー処理 ...
    End If

まとめ

Excel VBAを使って検索結果を別のシートへ自動コピーする方法を解説しました。基本的なコードから、ユーザー入力、大文字・小文字の区別、部分一致といった応用テクニックまでご紹介しました。これらのテクニックを組み合わせることで、日々のデータ処理作業を大幅に効率化できます。ぜひご自身の業務に合わせてカスタマイズし、VBAの力を最大限に活用してください。この自動化が、あなたのExcel作業の生産性向上に役立つことを願っています!

コメント

タイトルとURLをコピーしました