【VBA】ある特定の文字を抽出して指定のシートの最終行に書き写すコード

キャリア

集計表や商品簿で特定のキーワードを含む行を抽出したい場合のコードを紹介します。

ここでは主に下記の2つのマクロを組み合わせて指定の”キーワード”を抽出するようにしています。

①データのあるシートの中から抽出したいキーワードを含む行を取得し、指定するシートの最終行に貼り付け。

②データのあった元シートから、抽出したキーワードを含む行を削除。

そして上記2つのマクロを連続で実行するコード(Callステートメント)を書けばスムーズにマクロが実行されます。

実際に使う場合は、キーワードと抽出先のシート名を変更する必要があるのでご考慮ください。

それではいってみましょう。まずは①キーワードを含む行を指定のシートに出力するコードからです。

※モジュール1に書くコード

Option Explicit

'プログラム1|キーワードを抽出
Sub GetRowsWithKeywords_o()

    'プログラム2|キーワードを指定キーワード=「〇」
    Dim keywords As String
    keywords = "〇"
    
    'プログラム3|キーワードがない場合、プログラムを終了
    If keywords = "" Then: Exit Sub
    
    'プログラム4|抽出元のシート選択(元データシート)
    Dim ws1 As Worksheet
    Set ws1 = Worksheets("元データシート")
    
    'プログラム5|抽出データ出力用のシートを指定「〇シート」
    Dim ws2 As Worksheet
    Set ws2 = Worksheets("〇")
    
    'プログラム6|抽出先のシートの最終行を設定
    Dim Lastrow As Long
     Lastrow = ws2.Range("A" & Rows.Count).End(xlUp).Row
    
    'プログラム7|変数設定
    Dim rng As Range
    
    Dim keyword As Variant
    
    'プログラム8|対象データを行ごとに処理
    Dim i As Long
    For i = 1 To ws1.UsedRange.Rows.Count
        
        'プログラム9|1行目(ヘッダー)を抽出先のシートへ出力(コピー)
        If i = 1 Then
            ws1.Rows(1).Copy (ws2.Rows(1))
        End If
        
        'プログラム10|2行目以降を行ごとに取得
        If i >= 2 Then
            Set rng = ws1.UsedRange.Rows(i)
            
            'プログラム11|プログラム2のキーワードを全て取得
            For Each keyword In Split(keywords, ",")

                'プログラム12|各行にキーワードを含むセルがあれば
                If Not rng.Find(keyword, Lookat:=xlPart) Is Nothing Then
                    
                    'プログラム13|キーワードを含む行を抽出用シートへ出力
                    ws1.Rows(i).Copy (ws2.Rows(Lastrow))
                    Lastrow = Lastrow + 1
                    Exit For
                End If
            Next
                
        End If
    Next
        
'プログラム14|プログラム終了
End Sub

ここまででキーワードを含む行を指定したシートに抽出できるようになりました。

次は ②「データのあった元シートから、抽出したキーワードを含む行を削除」するマクロです。

'プログラム1|プログラム開始
Sub deleterows_o()

    'プログラム2|シート指定
    Dim i As Long
    Dim ws1 As Worksheet
    Set ws1 = Worksheets("元データ")
    
    'プログラム3|〇を含む行を削除
    For i = Range("A1").End(xlDown).Row To 2 Step -1
        With Cells(i, "E")
        If _
            .Value Like "〇*" Then
            .EntireRow.Delete
        End If
        End With
  Next i
  'プログラム4|プログラム終了
End Sub

上記で指定したキーワードを含む行を削除します。

では、①と②のマクロを連続で実行するコードを書いてみましょう。ここではモジュールを追加し、Callステートメントを用いてマクロ①とマクロ②を呼び出すコードを紹介します。

※モジュール2に書くコード

'プログラム1|プログラム開始
Sub run_continuously()
    
    'プログラム2|マクロ①と②の呼び出し
    Call GetRowsWithKeywords_o
    Call deleterows_o

'プログラム3|プログラム終了
End Sub

以上で一通りのコードは完了です。サンプルファイルを添付します。

サンプルには上記で紹介したコードに加えて二つのキーワードを一度のマクロ実行で抽出できるようにしていますので好きにキーワードとシート名を書き換えて使ってみてください。

最後までご拝読いただきありがとうございました。

コメント