VBAで特定の文字を含む行を別シートにコピーする方法|InStr関数で抽出

VBAで特定の文字を含む行だけを別シートにコピーするには、InStr 関数で文字が含まれているかチェックして、含まれていたら行をコピーする、という処理を全行分繰り返します。たとえば「東京都」を含む行だけをSheet2に抜き出す、といった作業を一瞬で終わらせることができます。

この記事では、次の内容を順番に解説します。

  • 特定の文字を含む行を別シートにコピーする基本のコード
  • InStr 関数の使い方
  • 複数の文字のどれかに当てはまる行を抽出する方法

特定の文字を含む行を別シートにコピーするには?

次のコードを実行すると、Sheet1のA列に「東京都」が含まれている行だけをSheet2にコピーします。

Sub ContainingText()

    Dim sourceWs As Worksheet
    Dim targetWs As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim searchText As String

    ' 元のシートとコピー先のシートを設定
    Set sourceWs = ThisWorkbook.Sheets("Sheet1")
    Set targetWs = ThisWorkbook.Sheets("Sheet2")

    ' 検索する文字
    searchText = "東京都"

    ' 元のシートの最終行を取得
    lastRow = sourceWs.Cells(sourceWs.Rows.Count, 1).End(xlUp).Row

    ' コピー先のシートをいったん空にする
    targetWs.Cells.Clear

    ' 1行目のヘッダーをコピーする
    sourceWs.Rows(1).Copy targetWs.Rows(1)

    ' 2行目から最終行まで1行ずつチェックする
    For i = 2 To lastRow
        If InStr(sourceWs.Cells(i, 1).Value, searchText) > 0 Then
            sourceWs.Rows(i).Copy Destination:= _
                targetWs.Rows(targetWs.Cells(targetWs.Rows.Count, 1).End(xlUp).Row + 1)
        End If
    Next i

    MsgBox "処理が完了しました!"

End Sub

コードの流れ

  • Sheet1を元のシート、Sheet2をコピー先として設定します。
  • コピー先のSheet2をいったん空にして、1行目のヘッダーだけをコピーします。
  • 2行目から最終行まで1行ずつ確認して、「東京都」が含まれていたらその行をSheet2にコピーします。
  • 全部チェックし終わったら完了のメッセージを表示します。

InStr関数とは?

InStr(文字列, 探したい文字) は、文字列の中に探したい文字が含まれているかどうかを調べる関数です。含まれていれば1以上の数字が返り、含まれていなければ0が返ります。

' 「東京都渋谷区」の中に「東京都」が含まれているか調べる
InStr("東京都渋谷区", "東京都")  ' → 1(含まれている)
InStr("大阪府大阪市", "東京都")    ' → 0(含まれていない)

コードの中で If InStr(...) > 0 Then と書いているのは「含まれていたら」という意味です。

複数の文字のどれかに当てはまる行を抽出するには?

「東京都」か「大阪府」のどちらかを含む行を抽出したい場合は、Or(または)でつなげます。

Sub MultipleTexts()

    Dim sourceWs As Worksheet
    Dim targetWs As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim stxt1 As String
    Dim stxt2 As String

    Set sourceWs = ThisWorkbook.Sheets("Sheet1")
    Set targetWs = ThisWorkbook.Sheets("Sheet2")

    stxt1 = "東京都"
    stxt2 = "大阪府"

    lastRow = sourceWs.Cells(sourceWs.Rows.Count, 1).End(xlUp).Row

    targetWs.Cells.Clear
    sourceWs.Rows(1).Copy targetWs.Rows(1)

    For i = 2 To lastRow
        If InStr(sourceWs.Cells(i, 1).Value, stxt1) > 0 Or _
           InStr(sourceWs.Cells(i, 1).Value, stxt2) > 0 Then
            sourceWs.Rows(i).Copy _
                targetWs.Rows(targetWs.Cells(targetWs.Rows.Count, 1).End(xlUp).Row + 1)
        End If
    Next i

    MsgBox "処理が完了しました!"

End Sub

検索したい文字を増やしたい場合は、stxt3 を追加して Or InStr(..., stxt3) > 0 とつなげていくだけです。

まとめ

特定の文字を含む行を別シートに抽出する処理は、InStr と行のコピーを組み合わせるだけで作れます。条件を変えれば、さまざまなデータ抽出に応用できます。

  • 文字が含まれているかチェックInStr(セルの値, 探したい文字) > 0 で判断する。
  • 行をコピーRows(i).Copy Destination:= でコピー先の行を指定する。
  • 複数の条件Or でつなげて「どれかに当てはまる行」を抽出できる。
  • コピー先をリセット:実行前に targetWs.Cells.Clear で前回の結果を消しておく。

よくある質問

A列以外の列で検索したい場合は?

sourceWs.Cells(i, 1)1 の部分を変えます。1がA列、2がB列、3がC列に対応しています。たとえばB列で検索したい場合は sourceWs.Cells(i, 2) と書きます。

大文字・小文字を区別せずに検索したい場合は?

InStr はそのままだと大文字・小文字を区別します。区別せずに検索したい場合は InStr(1, セルの値, 探したい文字, vbTextCompare) と書くと、大文字・小文字を問わず検索できます。

コピー先のシートが存在しない場合はどうなる?

指定したシート名が存在しない場合はエラーになります。あらかじめSheet2を作っておくか、コードの中でシートがなければ自動で作る処理を追加しておくと安心です。

完全一致で検索したい場合は?

完全一致で検索したい場合は InStr の代わりに If sourceWs.Cells(i, 1).Value = searchText Then と書きます。「東京都」だけに完全一致する行が対象になり、「東京都渋谷区」のような行は対象外になります。

抽出した行数を最後に表示したい場合は?

コピーした行数を数える変数を用意して、コピーするたびに1ずつ増やしていくと、最後に「〇件抽出しました」と表示できます。Dim count As Long で変数を用意して、count = count + 1 をコピー処理の直後に追加し、MsgBox count & "件抽出しました" と表示します。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール