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側はそのセルの値を見るだけでよく、チェックボックスを直接操作する必要はありません。
リンクするセルの設定手順:
- チェックボックスを右クリックして「コントロールの書式設定」を開く
- 「コントロール」タブの「リンクするセル」欄に対象セルのアドレス(例:
$E$2)を入力する - 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:=xlPasteValues を Paste:=xlPasteAllUsingSourceTheme または単純に .Paste に変えると書式ごとコピーできます。ただし貼り付け先の幅や書式と競合することがあるため、用途に合わせて使い分けてください。
チェックを外した行は抽出結果から削除されますか?
マクロを再実行するたびに抽出先をクリアしてから書き直すため、再実行すれば最新のチェック状況が反映されます。自動的にリアルタイムで更新したい場合は Worksheet_Change イベントと組み合わせる方法もあります。
元データの行を削除せずに抽出だけしたいです
このコードはコピーで転記するため、元データは削除されません。Copy と PasteSpecial の組み合わせは元データをそのまま維持します。
抽出件数が0件のときにメッセージを変えたいです
dstRow - 2 が0のときの分岐を追加します。If dstRow = 2 Then MsgBox "抽出対象が見つかりませんでした。" Else MsgBox dstRow - 2 & " 件を抽出しました。" End If のように条件で表示を変えると親切です。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



