○の付いたデータを別シートに転記する【コピペVBA】

「この行と、この行と、こっちの行を別のシートにまとめて…」
なんて作業、ありませんか?
一つ一つコピペするのは時間がかかるし、ミスも起きやすいです。
特に、たくさんのデータの中から特定の条件に合うものだけを抜き出す作業は、本当に骨が折れます。

icocho

でも、もしそんな面倒な作業がボタン一つで終わるとしたら…?

実は、Excelに標準で搭載されている「VBA(Visual Basic for
Applications)」という機能を使えば、そんな夢のような自動化が実現できちゃうんです!✨

この記事を読めば、あなたの働き方がガラッと変わるかもしれません。
まさに「働き方改革」の第一歩です!さあ、一緒に「業務効率化」と「スキルアップ」の扉を開きましょう!

これが魔法のコード!

まずは、今回ご紹介するVBAコードの全体像です。

1 Sub CopyRowsWithCircle()
2     ' --- 設定 ---
3     ' ↓↓↓ ここを自分の環境に合わせて変更してください ↓↓↓
4     Const sourceSheetName As String = "Sheet1" ' <-- データを読み取るシート名
5     Const destSheetName As String = "Sheet2"   ' <-- データを転記するシート名
6     Const mark As String = "◯"               ' <-- 目印となる文字
7     ' ↑↑↑ ここまで ↑↑↑
8
9     ' --- 準備 ---
10    Dim ws1 As Worksheet
11    Dim ws2 As Worksheet
12    Dim lastRow As Long
13    Dim i As Long
14    Dim j As Long
15
16 ' --- シートの存在チェック ---
17 On Error Resume Next
18 Set ws1 = Worksheets(sourceSheetName)
19 If ws1 Is Nothing Then
20 MsgBox "シート「" & sourceSheetName & "」が見つかりません。", vbExclamation
21 Exit Sub
22 End If
23 Set ws2 = Worksheets(destSheetName)
24 If ws2 Is Nothing Then
25 MsgBox "シート「" & destSheetName & "」が見つかりません。", vbExclamation
26 Exit Sub
27 End If
28 On Error GoTo 0
29
30 ' --- 実行 ---
31 ' 転記先シートで次に書き込む行(j)を準備
32 ' A列の最終行の次の行を取得
33 j = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1
34 ' もし1行目も空っぽだったら、jを1にする(データが何もないシートへの最初の転記)
35 If ws2.Cells(1, "A").Value = "" Then j = 1
36
37 ' 読み取り元シートの最終行を取得
38 lastRow = ws1.Cells(ws1.Rows.Count, "A").End(xlUp).Row
39
40 ' 2行目から最終行までループしてチェック
41 For i = 2 To lastRow
42 ' A列の値が指定したマークと同じかチェック
43 If ws1.Cells(i, "A").Value = mark Then
44 ' 行全体をコピーして、転記先シートのj行目に貼り付け
45 ws1.Rows(i).Copy ws2.Cells(j, "A")
46 ' 次に書き込む行を1つ下にする
47 j = j + 1
48 End If
49 Next i
50
51 MsgBox "転記が完了しました!", vbInformation
52 End Sub

コードの詳しい解説

「うわ、なんか難しそう…」と思ったあなた、心配しないでください!
ここから、このコードが何をしているのか、一つ一つ丁寧に解説していきます。

Sub CopyRowsWithCircle()End Sub

これはVBAの「おまじない」のようなものです。
Subは「これからVBAのプログラム(プロシージャ)を始めますよ」という合図で、End Sub
は「ここで終わりですよ」という合図です。
CopyRowsWithCircleの部分はプログラムの名前なので、自分で分かりやすい名前に変えてもOKです。

' --- 設定 ---

‘ (シングルクォーテーション)から始まる行は「コメント」です。
プログラムの動作には影響せず、人間がコードを読みやすくするためのメモ書きです。ここでは、後から設定を変えやすいように、シート名や目印の文字をまとめています。

Const sourceSheetName As String = “Sheet1”

あなたがデータをチェックしたいシートの名前をここに書きます。
Constをつけることで、間違ってプログラムの途中で内容が書き換わってしまうのを防ぎます。

Const destSheetName As String = “Sheet2”

データをコピーしたい先のシートの名前です。

Const mark As String = “◯”

転記したい行についている目印の文字です。
ここでは、プログラムで使う「変数」という、データを入れておくための箱を用意しています。

ws1, ws2

Worksheet(ワークシート)の情報を入れておくための箱です。
ws1 に元データ、ws2に転記先のシートを入れます。

lastRow

元データの最終行が何行目か、その番号を覚えておくための箱です。

i, j

ループ(繰り返し処理)で使うカウンターです。i は元データの行番号、j
は転記先の行番号を覚えておきます。

' --- シートの存在チェック ---以降

ここは少し上級者向けですが、もし指定したシート名が存在しなかった場合にエラーで止まってしまうのを防ぐためのコードです。
On Error Resume Next は「もしエラーが起きても、とりあえず無視して次に進んでね」という意味です。
Set ws1 = Worksheets(sourceSheetName) でシートを実際に変数に入れますが、もしシートがなければ ws1は空っぽ(Nothing)のままです。
次の If ws1 Is Nothing Then で、「もし ws1が空っぽだったら」という条件分岐をして、メッセージボックスで知らせてプログラムを終了します。
最後に On Error GoTo 0 でエラー無視モードを解除しています。これは、プログラムをより安全に動かすための「保険」のようなものです。

' --- 実行 ---以降

ここからが、実際の転記処理のメイン部分です!

j = ws2.Cells(ws2.Rows.Count, “A”).End(xlUp).Row + 1

これは、転記先のシート(ws2)で、A列にデータが既に入っている場合、その次の空の行からペーストするための準備です。
ws2.Rows.Count でシートの最大行数を取得し、.End(xlUp)でそこから上に向かってデータのある最初のセルを見つけ、その行番号(Row)に + 1 しています。

lastRow = ws1.Cells(ws1.Rows.Count, “A”).End(xlUp).Row

こちらは元データシート(ws1)のA列の最終行番号を取得しています。
これにより、データが100行あっても10000行あっても、自動で最後までチェックしてくれます。

For i = 2 To lastRow

For…Next は繰り返し処理を行うための構文です。「変数 i を2から lastRow(最終行)まで1ずつ増やしながら、中の処理を繰り返してください」という意味です。
なぜ 2 から始めるかというと、Excelの表は1行目が見出し(ヘッダー)になっていることが多いからです。見出しは転記する必要がないので、2行目からチェックを始めるのです。

If ws1.Cells(i, “A”).Value = mark Then

If…End If は条件分岐です。「もし〜だったら、中の処理を実行してください」という意味です。
ws1.Cells(i, “A”).Value は、「ws1 シートの i 行目、”A” 列(つまりA列)のセルの値」を指します。
これが、設定で決めた mark (今回は “◯”) と同じかどうか (=) をチェックしています。

ws1.Rows(i).Copy ws2.Cells(j, “A”)

条件に一致した場合(A列に “◯” があった場合)に実行される、コピー&ペーストの処理です。
ws1.Rows(i) で「ws1 シートの i 行目全体」を選択し、.Copy でコピーします。
ws2.Cells(j, “A”) は貼り付け先を指定しており、「ws2 シートの j 行目、”A”列」に貼り付ける、という意味になります。

j = j + 1

無事に1行貼り付けが終わったら、次に貼り付ける行を1つ下にずらすために、カウンター j
の数字を1つ増やしています。これをしないと、ずっと同じ行に上書きされてしまいます。

Next i

For ループの終わりです。
ここまで来ると、iの値が1つ増えて、次の行のチェックに移ります。これを最終行まで繰り返します。

MsgBox “転記が完了しました!”, vbInformation

すべての行のチェックが終わったら、最後に「転記が完了しました!」というメッセージボックスを表示してお知らせしてくれます。これで、処理が終わったことが一目でわかりますね!

簡単アレンジで、もっと便利に!

このコード、実は少し変えるだけで、もっと色々な使い方ができます。
ここでは、初心者でも簡単にできるアレンジを2つご紹介します!

アレンジ1:目印の文字を変えてみよう!

“◯” 以外にも、「重要」とか「要確認」といった特定のキーワードで管理したい場合もありますよね。そんな時は、コードのこの部分を変えるだけです。

変更前:
1 Const mark As String = "◯"
変更後 (例: 「重要」を目印にする場合):
1 Const mark As String = "重要"

たったこれだけで、A列に「重要」と書かれた行だけを抜き出せるようになります。自分の業務に合わせて、自由にカスタマイズしてみてください!

アレンジ2:転記する前に、転記先のシートを毎回まっさらにする!

このマクロを何回も実行すると、前回のデータの後ろにどんどん新しいデータが追加されていってしまいます。
毎回、最新のデータだけを転記したい場合は、処理の最初に転記先シートをクリアするコードを追加しましょう。
‘ — 実行 — のセクションのすぐ下に、以下の1行を追加します。

1 ' --- 実行 ---
2 ws2.Cells.ClearContents ' <-- この行を追加!
3
4 ' 転記先シートで次に書き込む行(j)を準備
5 j = 1 ' クリアしたので、必ず1行目から書き始める

ws2.Cells.ClearContents は、「ws2 シートのすべてのセルの内容を消去する」という命令です。そして、j の値も 1 に固定します。
これで、マクロを実行するたびに、転記先シートが一度リセットされ、常にA1セルから新しいデータが書き込まれるようになります。
データの重複を防ぎたい場合に非常に便利ですよ!

まとめ

いかがでしたか?
今回は、「データ行の先頭に◯がついていたらその行データを別シートへ転記する」VBAコードをご紹介しました。

最初は難しく感じるかもしれませんが、一つ一つの意味を理解すれば、思ったよりもシンプルだということがお分かりいただけたのではないでしょうか。
このコードをあなたのExcelに導入すれば、面倒なコピペ作業から解放され、大幅な「業務効率化」が期待できます。空いた時間で新しいスキルを学んだり、より重要な業務に集中したりと、ポジティブな連鎖が生まれるはずです。

VBAは、あなたの「働き方改革」を力強くサポートしてくれる最高の相棒です。ぜひ今回のコードをきっかけに、VBAを使った「自動化」の世界に足を踏み入れてみてください。
あなたのExcelライフが、もっと快適でクリエイティブなものになることを願っています!✨