エクセルで毎日・毎週繰り返し発生する転記作業を、ボタンひとつで自動完了させたいと思ったことはないでしょうか。
VBAマクロを使えば、別シートへの転記を繰り返し自動実行する仕組みを構築でき、手作業の転記から完全に解放されます。
ループ処理と条件分岐を組み合わせることで、「特定の条件を満たす行だけを転記する」「転記した後に元データにフラグを立てる」「転記先の既存データと重複しないように管理する」といった実務的なニーズにも対応できます。
本記事では、エクセルのマクロで別シートへの転記を繰り返し実行するための方法を、VBAコードの基本からループ処理・条件分岐の応用・実際の業務シナリオへの適用まで体系的に解説していきます。
VBA初心者の方でも理解できるよう、具体的なコード例を交えながら丁寧に説明しますので、ぜひ最後までご覧ください。
エクセルのマクロで別シートへ繰り返し転記を実現するための基本設計
それではまず、VBAマクロで別シートへの繰り返し転記を行うための基本的な設計思想と、必要な知識の全体像について解説していきます。
転記マクロを作成するにあたって、「どのデータを」「どの条件で」「どこに」転記するかを事前に明確に定義しておくことが、コードを書き始める前の重要なステップです。
繰り返し転記マクロを設計する際に決めておく4つの要素
1. 転記元の定義:どのシートの・何行目から何行目のデータを転記するか
2. 転記条件の定義:すべての行を転記するか、特定の条件を満たす行だけを転記するか
3. 転記先の定義:どのシートの・どの位置(最終行以降・特定セルなど)に転記するか
4. 転記後の処理の定義:元データにフラグを立てる・入力欄をクリアする・完了メッセージを表示するなど
繰り返し転記マクロに必要な3つのVBA基本構文
別シートへの繰り返し転記を実現するために、最低限理解しておくべきVBAの基本構文が3つあります。
第一がForループ(For Next)です。
指定した範囲の行を順番に処理するために使います。
第二がIf文(条件分岐)です。
転記するかどうかの判断基準をコードで表現するために使います。
第三がシートオブジェクトとCells・Rangeによるセル参照です。
転記元・転記先のシートとセルを特定し、値のやりとりをするために使います。
この3つの構文を組み合わせることで、大部分の転記業務に対応するマクロを作成できます。
転記マクロを実行するためのボタン設置と起動方法
作成した転記マクロをワークシート上のボタンに割り当てることで、誰でも直感的に転記を実行できるようになります。
ボタンの設置方法は、「開発」タブ→「挿入」→「フォームコントロール」の「ボタン(フォームコントロール)」を選択し、シート上でドラッグして作成します。
ボタンを作成すると「マクロの登録」ダイアログが自動的に表示されるため、作成した転記マクロを選択して登録します。
ボタンの名前(ラベル)は右クリック→「テキストの編集」から変更でき、「転記実行」「データ登録」など処理内容がわかるラベルにしておくと使いやすいでしょう。
マクロファイルの保存形式と共有時の注意点
VBAマクロを含むエクセルファイルは、必ず「.xlsm(Excel マクロ有効ブック)」形式で保存する必要があります。
通常の「.xlsx」形式で保存しようとすると、「マクロが失われます」という警告が表示されます。
ファイルを他のユーザーと共有する場合、受け取った側もマクロを有効化する必要があるため、事前にその旨を伝えておくとトラブルを防げます。
セキュリティ上の観点から、信頼できる場所(トラストセンターで設定)に保存されていないマクロファイルを開く際には警告が表示される点も覚えておきましょう。
ループ処理を使って別シートへ繰り返し転記するVBAコードの書き方
続いては、実際にVBAのループ処理を使って別シートへデータを繰り返し転記するコードの具体的な書き方を確認していきます。
さまざまなループ構文を使い分けることで、転記処理の柔軟性が大きく向上します。
For Nextループで全行を順番に転記するコードの実装
転記元シートの全行データを転記先シートに順番に書き込む、最も基本的なパターンのコードです。
For Nextループで全行を転記する基本コード
Sub 全行転記()
Dim ws元 As Worksheet
Dim ws先 As Worksheet
Dim i As Long
Dim 最終行元 As Long
Dim 書込行 As Long
Application.ScreenUpdating = False
Set ws元 = ThisWorkbook.Sheets(“転記元データ”)
Set ws先 = ThisWorkbook.Sheets(“転記先一覧”)
最終行元 = ws元.Cells(Rows.Count, 1).End(xlUp).Row
書込行 = ws先.Cells(Rows.Count, 1).End(xlUp).Row + 1
For i = 2 To 最終行元
ws先.Cells(書込行, 1).Value = ws元.Cells(i, 1).Value
ws先.Cells(書込行, 2).Value = ws元.Cells(i, 2).Value
ws先.Cells(書込行, 3).Value = ws元.Cells(i, 3).Value
ws先.Cells(書込行, 4).Value = ws元.Cells(i, 4).Value
ws先.Cells(書込行, 5).Value = Now()
書込行 = 書込行 + 1
Next i
Application.ScreenUpdating = True
MsgBox (最終行元 – 1) & “件の転記が完了しました。”
End Sub
「書込行」変数を使って転記先の現在の行を管理しているため、既存データの最終行の次から追記される仕組みになっています。
最後のメッセージボックスに転記件数を表示することで、実行後の確認もしやすくなっています。
Do Whileループで柔軟にデータ末尾を検出しながら転記する方法
データの行数が毎回変わる場合や、特定のセルが空になるまで処理を続けたい場合はDo Whileループが適しています。
Do Whileループを使った転記コード
Sub DoWhile転記()
Dim ws元 As Worksheet
Dim ws先 As Worksheet
Dim 読取行 As Long
Dim 書込行 As Long
Application.ScreenUpdating = False
Set ws元 = ThisWorkbook.Sheets(“入力データ”)
Set ws先 = ThisWorkbook.Sheets(“転記先DB”)
読取行 = 2
書込行 = ws先.Cells(Rows.Count, 1).End(xlUp).Row + 1
Do While ws元.Cells(読取行, 1).Value <> “”
ws先.Cells(書込行, 1).Value = ws元.Cells(読取行, 1).Value
ws先.Cells(書込行, 2).Value = ws元.Cells(読取行, 2).Value
ws先.Cells(書込行, 3).Value = ws元.Cells(読取行, 3).Value
読取行 = 読取行 + 1
書込行 = 書込行 + 1
Loop
Application.ScreenUpdating = True
MsgBox “転記処理が完了しました。”
End Sub
Do Whileループはコードを読んだだけで「何が起きているか」が直感的にわかりやすいという利点があります。
「A列が空白でない間」というシンプルな条件で終端を判定するため、データ件数が変動する転記処理に対応しやすいでしょう。
For Eachループで複数シートを処理対象にする方法
ブック内の複数のシートを一括で処理する場合は、For Each ws In Worksheetsというループが便利です。
For Eachループで複数シートから集約転記するコード
Sub 複数シート集約転記()
Dim ws As Worksheet
Dim ws集約 As Worksheet
Dim 最終行 As Long
Dim 書込行 As Long
Set ws集約 = ThisWorkbook.Sheets(“集約シート”)
書込行 = 2
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> “集約シート” And ws.Name <> “設定” Then
最終行 = ws.Cells(Rows.Count, 1).End(xlUp).Row
Dim j As Long
For j = 2 To 最終行
ws集約.Cells(書込行, 1).Value = ws.Name
ws集約.Cells(書込行, 2).Value = ws.Cells(j, 1).Value
ws集約.Cells(書込行, 3).Value = ws.Cells(j, 2).Value
ws集約.Cells(書込行, 4).Value = ws.Cells(j, 3).Value
書込行 = 書込行 + 1
Next j
End If
Next ws
MsgBox “全シートの集約転記が完了しました。”
End Sub
このコードは、「集約シート」と「設定」シート以外のすべてのシートからデータを集約シートに転記し、転記元シート名も一緒に記録する処理を行っています。
月別・部門別など複数シートに分散したデータをひとつにまとめる集計業務に最適なパターンです。
条件分岐を組み合わせた実務レベルの転記マクロの実装
続いては、If文による条件分岐を転記ループと組み合わせた、実務で使えるレベルの転記マクロの実装方法を確認していきます。
条件付き転記・転記後のフラグ処理・重複チェックなど、実際の業務でよく求められるパターンを紹介します。
条件を満たす行だけを転記する条件付き転記マクロ
実務では全行転記ではなく、特定のステータスや値を持つ行だけを転記したいケースが非常に多いです。
ステータスが「承認済み」の行だけを転記するコード例
Sub 条件付き転記()
Dim ws元 As Worksheet
Dim ws先 As Worksheet
Dim i As Long
Dim 最終行 As Long
Dim 書込行 As Long
Dim 転記件数 As Long
Application.ScreenUpdating = False
Set ws元 = ThisWorkbook.Sheets(“申請一覧”)
Set ws先 = ThisWorkbook.Sheets(“承認済み一覧”)
最終行 = ws元.Cells(Rows.Count, 1).End(xlUp).Row
書込行 = ws先.Cells(Rows.Count, 1).End(xlUp).Row + 1
転記件数 = 0
For i = 2 To 最終行
If ws元.Cells(i, 5).Value = “承認済み” Then
ws先.Cells(書込行, 1).Value = ws元.Cells(i, 1).Value
ws先.Cells(書込行, 2).Value = ws元.Cells(i, 2).Value
ws先.Cells(書込行, 3).Value = ws元.Cells(i, 3).Value
ws先.Cells(書込行, 4).Value = ws元.Cells(i, 4).Value
ws先.Cells(書込行, 5).Value = ws元.Cells(i, 5).Value
書込行 = 書込行 + 1
転記件数 = 転記件数 + 1
End If
Next i
Application.ScreenUpdating = True
MsgBox 転記件数 & “件の承認済みデータを転記しました。”
End Sub
5列目(E列)のステータスが「承認済み」の場合のみ転記するコードです。
転記件数カウンターを設けることで、実行後に何件転記されたかが確認できる親切な設計になっています。
転記後に元データへフラグを記録するコードの追加方法
転記済みのデータを管理するために、転記が完了した行に「転記済み」フラグを自動的に記録する処理を追加できます。
先ほどの条件付き転記コードのIf文の中に、転記処理の後に以下のコードを追加します。
転記後にフラグを記録するコードを追加する例
If ws元.Cells(i, 5).Value = “承認済み” Then
‘転記処理(省略)
ws元.Cells(i, 6).Value = “転記済み” ‘F列に転記済みフラグを記録
ws元.Cells(i, 7).Value = Now() ‘G列に転記日時を記録
書込行 = 書込行 + 1
転記件数 = 転記件数 + 1
End If
フラグを記録することで次回実行時に「転記済み」行をスキップする条件を追加でき、重複転記を防ぐ仕組みが完成します。
次回実行時のループ内に「F列が”転記済み”の場合はスキップ」というCondition Checkを追加することで完全な重複防止ロジックになるでしょう。
エラーハンドリングで転記マクロを堅牢にする方法
転記マクロが実行中に予期せぬエラーで中断してしまうと、データが中途半端な状態になるリスクがあります。
On Error GoTo文を使ったエラーハンドリングを組み込むことで、エラーが発生した際に適切なメッセージを表示して安全に処理を終了させられます。
エラーハンドリングを組み込んだ転記マクロの構造
Sub 堅牢な転記マクロ()
On Error GoTo エラー処理
Application.ScreenUpdating = False
‘転記処理(省略)
Application.ScreenUpdating = True
MsgBox “転記が正常に完了しました。”
Exit Sub
エラー処理:
Application.ScreenUpdating = True
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号:” & Err.Number & vbCrLf & _
“エラー内容:” & Err.Description
End Sub
エラーが発生した際にエラー番号と内容をメッセージボックスで表示することで、問題の特定と修正が格段に行いやすくなります。
本番運用する転記マクロには必ずこのようなエラーハンドリングを組み込んでおきましょう。
まとめ
本記事では、エクセルのマクロで別シートへ転記を繰り返し実行する方法として、VBAの基本設計からFor Nextループ・Do Whileループ・For Eachループ・条件分岐・エラーハンドリングまでを体系的に解説してきました。
繰り返し転記マクロを作成するポイントは、「転記元・転記先・転記条件・転記後の処理」の4要素を事前に明確に定義しておくことです。
For Nextループは行数が決まっている転記に、Do Whileループはデータ末尾が不定の転記に、For Eachループは複数シートの一括集約に、それぞれ適したループ構文です。
条件分岐・フラグ管理・エラーハンドリングを組み合わせることで、実務の複雑な転記要件に対応できる堅牢なマクロが完成するでしょう。
転記作業を自動化するVBAマクロを一度構築すれば、毎日繰り返していた手作業がボタンひとつで完了するようになり、業務時間を大幅に節約できます。
ぜひ本記事のコード例を参考に、自身の業務に合わせた転記マクロを作成してみてください。