VBAでチェックが付いた行だけを別シートに抽出する方法|フラグ列の条件判定・PasteSpecialの使い方

VBAで特定のチェック列に「○」や「TRUE」が入っている行だけを別シートに抽出するには、ループで条件を確認しながら対象行をコピーするだけで実現できます。TODOリストの完了タスク抽出・アンケートの確認済み抽出など、日常業務のさまざまな場面で応用できます。

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

  • チェック列の値を判定して別シートに抽出する基本コード
  • チェックボックス(フォームコントロール)と組み合わせる方法
  • 複数条件でチェックして抽出する応用パターン
  • 抽出結果を毎回クリアしてから書き出す安全な実装

チェック済みの行を別シートに抽出するには?

元データのE列に「○」が入っている行だけを、別シート「抽出結果」にコピーします。抽出先は毎回クリアしてから書き込むことで、前回の残りデータが混ざらないようにします。

Sub CopyCheckedRows()

    Dim wsSrc  As Worksheet   '元データのシート
    Dim wsDst  As Worksheet   '抽出先のシート
    Dim i      As Long
    Dim dstRow As Long
    Dim lastRow As Long

    Set wsSrc = Worksheets("Sheet1")
    Set wsDst = Worksheets("抽出結果")

    '抽出先をクリア
    wsDst.Cells.ClearContents

    '見出し行をコピー
    wsSrc.Rows(1).Copy wsDst.Rows(1)

    lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
    dstRow  = 2

    For i = 2 To lastRow
        'E列(5列目)が「○」なら抽出
        If wsSrc.Cells(i, 5).Value = "○" Then
            wsSrc.Rows(i).Copy
            wsDst.Cells(dstRow, 1).PasteSpecial Paste:=xlPasteValues
            dstRow = dstRow + 1
        End If
    Next i

    Application.CutCopyMode = False

    MsgBox dstRow - 2 & " 件を抽出しました。"

End Sub

チェック列に使われる値の種類に合わせて条件を変えます。

チェックの種類条件式
「○」が入っているwsSrc.Cells(i, 5).Value = "○"
「TRUE」またはTrue(Boolean)wsSrc.Cells(i, 5).Value = True
「完了」という文字列wsSrc.Cells(i, 5).Value = "完了"
1が入っている(数値フラグ)wsSrc.Cells(i, 5).Value = 1
空欄でない(何か入っていれば)wsSrc.Cells(i, 5).Value <> ""

フォームコントロールのチェックボックスと連動させるには?

シート上にフォームコントロールのチェックボックスを配置している場合、「リンクするセル」をE列に設定すると、チェックのオン・オフがそのセルに TRUE / FALSE として反映されます。VBA側はそのセルの値を見るだけでよく、チェックボックスを直接操作する必要はありません。

リンクするセルの設定手順:

  1. チェックボックスを右クリックして「コントロールの書式設定」を開く
  2. 「コントロール」タブの「リンクするセル」欄に対象セルのアドレス(例:$E$2)を入力する
  3. OKを押す

これで wsSrc.Cells(i, 5).Value = True という条件でチェックボックスのオン・オフを判定できます。

複数条件を組み合わせて抽出するには?

「チェックが○、かつ担当者が山田」のように複数の条件を組み合わせた抽出も、And条件を追加するだけで対応できます。

Sub CopyByMultipleConditions()

    Dim wsSrc   As Worksheet
    Dim wsDst   As Worksheet
    Dim i       As Long
    Dim dstRow  As Long
    Dim lastRow As Long

    Set wsSrc = Worksheets("Sheet1")
    Set wsDst = Worksheets("抽出結果")

    wsDst.Cells.ClearContents
    wsSrc.Rows(1).Copy wsDst.Rows(1)

    lastRow = wsSrc.Cells(wsSrc.Rows.Count, 1).End(xlUp).Row
    dstRow  = 2

    For i = 2 To lastRow
        'E列が「○」 かつ C列が「山田」の行を抽出
        If wsSrc.Cells(i, 5).Value = "○" And _
           wsSrc.Cells(i, 3).Value = "山田" Then

            wsSrc.Rows(i).Copy
            wsDst.Cells(dstRow, 1).PasteSpecial Paste:=xlPasteValues
            dstRow = dstRow + 1

        End If
    Next i

    Application.CutCopyMode = False
    MsgBox dstRow - 2 & " 件を抽出しました。"

End Sub

抽出結果を毎回クリアして安全に書き出すには?

抽出先シートを毎回クリアせずに追加してしまうと、前回の結果が残ったまま重複データになります。安全な実装のポイントをまとめます。

処理コード理由
値のみ貼り付けPasteSpecial Paste:=xlPasteValues元の書式・数式を持ち込まない
抽出先をクリアwsDst.Cells.ClearContents前回の結果が残らないようにする
コピーモード解除Application.CutCopyMode = False点線(マーキーアニメーション)を消す
見出し行を先にコピーwsSrc.Rows(1).Copy wsDst.Rows(1)抽出結果に列タイトルを付ける

まとめ

  • チェック列の値を If条件で判定し、合致する行を別シートにコピーするのが基本パターン
  • チェックの種類は「○」「TRUE」「完了」「1」など用途に合わせて条件を変えるだけ
  • フォームコントロールのチェックボックスは リンクするセルを使えばVBA側からシンプルに判定できる
  • PasteSpecial Paste:=xlPasteValues で値だけ貼り付けると書式の影響を受けない安定した転記になる
  • 抽出先は実行前に ClearContents で毎回クリアすると前回データが残らない

よくある質問

抽出先のシートが存在しない場合にエラーになります

あらかじめシートを作成しておくか、マクロ内でシートの存在を確認して、なければ作成する処理を追加しましょう。On Error Resume Next でシートを取得し、Nothing なら Worksheets.Add で新しいシートを作る方法がよく使われます。

書式もそのまま抽出先にコピーしたいです

PasteSpecial Paste:=xlPasteValuesPaste:=xlPasteAllUsingSourceTheme または単純に .Paste に変えると書式ごとコピーできます。ただし貼り付け先の幅や書式と競合することがあるため、用途に合わせて使い分けてください。

チェックを外した行は抽出結果から削除されますか?

マクロを再実行するたびに抽出先をクリアしてから書き直すため、再実行すれば最新のチェック状況が反映されます。自動的にリアルタイムで更新したい場合は Worksheet_Change イベントと組み合わせる方法もあります。

元データの行を削除せずに抽出だけしたいです

このコードはコピーで転記するため、元データは削除されません。CopyPasteSpecial の組み合わせは元データをそのまま維持します。

抽出件数が0件のときにメッセージを変えたいです

dstRow - 2 が0のときの分岐を追加します。If dstRow = 2 Then MsgBox "抽出対象が見つかりませんでした。" Else MsgBox dstRow - 2 & " 件を抽出しました。" End If のように条件で表示を変えると親切です。


動画で学びたい方へ

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

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

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

コメントする

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

上部へスクロール