エクセルで毎日同じようなデータの転記作業を繰り返していませんか。
売上データを集計シートに貼り付けたり、入力フォームの内容を台帳に転記したりといった作業は、手作業で行うと時間がかかるうえにミスのリスクも伴います。
エクセルのマクロ・VBAを使えば、こうした繰り返しの転記作業を完全に自動化できます。
ループ処理や条件分岐を組み合わせることで、複雑な転記ルールにも対応でき、ボタンひとつで大量のデータを正確に転記できる仕組みが作れるでしょう。
本記事では、エクセルで転記作業を自動化するためのマクロ・VBAの基本から、繰り返し処理・別シート連携・条件付き転記までを体系的に解説していきます。
プログラミング初心者の方でもわかりやすいよう、具体的なコード例を交えながら説明しますのでぜひ最後までご覧ください。
エクセルで転記作業を自動化する最も効果的な手段はVBAマクロの活用にある
それではまず、エクセルの転記作業を自動化するうえで中心となるVBAマクロの概要と、自動化がもたらすメリットについて解説していきます。
VBA(Visual Basic for Applications)とは、エクセルをはじめとするMicrosoft Officeアプリケーションに内蔵されたプログラミング言語のことです。
VBAを使えば、人間が手作業で行っているエクセル操作を、コードとして記述して自動実行させることができます。
転記作業をVBAで自動化することで得られる主なメリット
・転記ミスがなくなる:人間の手作業では避けられないコピー&ペーストのミスが根本からなくなる
・処理速度が飛躍的に上がる:数千行のデータでも数秒で転記が完了する
・繰り返し実行できる:毎日・毎週の定型転記作業をボタンひとつで実行できる
・複雑な条件にも対応できる:特定の条件を満たすデータだけを転記するなど柔軟な処理が可能
マクロとVBAの違いを正しく理解する
「マクロ」と「VBA」は混同されがちですが、正確には意味が異なります。
マクロとは、エクセルの操作を記録・自動実行する機能全般を指す言葉です。
VBAはそのマクロをプログラムとして記述するための言語であり、マクロはVBAで書かれたプログラムを実行することで動作します。
エクセルには「マクロの記録」機能があり、操作を自動的にVBAコードとして記録してくれる便利な機能があります。
転記作業を自動化する際は、まず「マクロの記録」で基本的な操作を記録し、そのコードを編集・拡張していくアプローチが初心者には取り組みやすいでしょう。
VBAエディタの起動と標準モジュールの作成方法
VBAコードを書くには、まずVBAエディタ(Visual Basic Editor)を起動する必要があります。
「Alt + F11」キーを押すと、VBAエディタが起動します。
「開発」タブが表示されている場合は、「Visual Basic」ボタンをクリックしても起動できます。
VBAエディタが開いたら、「挿入」メニュー→「標準モジュール」を選択すると、コードを記述するためのモジュールが作成されます。
このモジュールにSubプロシージャ(処理の単位)を記述することで、転記を自動化するマクロが完成していきます。
転記自動化を始める前に整えておくべき環境設定
VBAを使った転記自動化を始める前に、エクセルのマクロ設定を確認しておきましょう。
デフォルトではマクロが無効になっている場合があるため、「ファイル」→「オプション」→「トラストセンター」→「トラストセンターの設定」→「マクロの設定」から「すべてのマクロを有効にする」に変更します。
また、VBAを含むファイルは「.xlsm(マクロ有効ブック)」形式で保存する必要があります。
通常の「.xlsx」形式ではマクロが保存されないため、ファイルを保存する際は必ず形式を確認しましょう。
VBAで別シートへデータを転記する基本コードと実装方法
続いては、VBAを使って実際に別シートへデータを転記する基本的なコードの書き方と、実装の手順を確認していきます。
転記自動化の基礎となるコードパターンを押さえておけば、さまざまな転記業務に応用が利くでしょう。
シートオブジェクトとセルの参照方法を理解する
VBAで転記処理を書くためには、まずシートとセルの参照方法を理解することが重要です。
VBAでシートとセルを参照する基本的な書き方
シートの参照方法
Sheets(“シート名”) または Worksheets(“シート名”)
例:Sheets(“入力フォーム”)
セルの参照方法
Cells(行番号, 列番号) または Range(“セルアドレス”)
例:Cells(2, 1) はA2セルを指す
例:Range(“B3”) はB3セルを指す
別シートのセルを参照する方法
Sheets(“入力フォーム”).Range(“B2”).Value
→「入力フォーム」シートのB2セルの値を取得
ValueプロパティはセルのでValueを取得・設定するために使います。
転記処理では「転記元セルの.Value」を「転記先セルの.Value」に代入するという操作が基本となります。
入力フォームのデータを一覧シートに転記する基本コード
以下は、「入力フォーム」シートに入力されたデータを「データ一覧」シートに追記していく基本的なVBAコードです。
入力フォームから一覧シートへ転記するVBAコード
Sub データ転記実行()
Dim ws入力 As Worksheet
Dim ws一覧 As Worksheet
Dim 次の行 As Long
Set ws入力 = ThisWorkbook.Sheets(“入力フォーム”)
Set ws一覧 = ThisWorkbook.Sheets(“データ一覧”)
次の行 = ws一覧.Cells(Rows.Count, 1).End(xlUp).Row + 1
ws一覧.Cells(次の行, 1).Value = ws入力.Range(“C2”).Value
ws一覧.Cells(次の行, 2).Value = ws入力.Range(“C3”).Value
ws一覧.Cells(次の行, 3).Value = ws入力.Range(“C4”).Value
ws一覧.Cells(次の行, 4).Value = ws入力.Range(“C5”).Value
ws一覧.Cells(次の行, 5).Value = Now()
ws入力.Range(“C2:C5”).ClearContents
MsgBox “転記が完了しました。”
End Sub
「Cells(Rows.Count, 1).End(xlUp).Row + 1」という記述は、A列の最終入力行の次の行番号を取得するためのコードです。
これにより、データが追記されるたびに自動的に次の空き行に転記されていきます。
転記前に入力チェックを行うエラーハンドリングの実装
転記処理を安全に動作させるために、転記前に必須項目が入力されているかをチェックするコードを追加するとよいでしょう。
転記前の入力チェックを追加したコード例
Sub データ転記実行()
Dim ws入力 As Worksheet
Set ws入力 = ThisWorkbook.Sheets(“入力フォーム”)
If ws入力.Range(“C2”).Value = “” Then
MsgBox “名前を入力してください。”
Exit Sub
End If
If ws入力.Range(“C3”).Value = “” Then
MsgBox “日付を入力してください。”
Exit Sub
End If
‘以降に転記処理を記述
End Sub
このようにIf文で入力チェックを行い、未入力の場合はメッセージを表示してExit Subで処理を中断することで、不完全なデータが転記されることを防げます。
繰り返し処理(ループ)を使って大量データを自動転記する方法
続いては、VBAのループ処理を活用して大量のデータを効率よく自動転記する方法を確認していきます。
繰り返し処理を使えば、数十行・数百行のデータでも人の手を借りずに一気に処理できます。
For Nextループを使った繰り返し転記の基本
VBAでループ処理を行う最もシンプルな方法がFor Next構文です。
指定した回数だけ処理を繰り返すことができ、行番号をカウントしながらデータを順番に処理していくのに最適です。
For Nextループで複数行のデータを転記するコード例
Sub 一括転記()
Dim ws元 As Worksheet
Dim ws先 As Worksheet
Dim i As Long
Dim 最終行 As Long
Set ws元 = ThisWorkbook.Sheets(“転記元”)
Set ws先 = ThisWorkbook.Sheets(“転記先”)
最終行 = ws元.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To 最終行
ws先.Cells(i, 1).Value = ws元.Cells(i, 1).Value
ws先.Cells(i, 2).Value = ws元.Cells(i, 2).Value
ws先.Cells(i, 3).Value = ws元.Cells(i, 3).Value
Next i
MsgBox “一括転記が完了しました。”
End Sub
「For i = 2 To 最終行」は2行目から最終行まで処理を繰り返すという意味で、1行目がヘッダーの場合に使うパターンです。
転記元のデータ行数が変わっても、「最終行」変数で自動的に対応できる汎用性の高いコードです。
Do Whileループで条件を満たす間だけ転記処理を続ける方法
データの末尾が不明な場合や、特定の条件が満たされるまで転記を続けたい場合はDo While構文が有効です。
Do Whileループで空白セルに当たるまで転記を続けるコード例
Sub Do転記()
Dim ws元 As Worksheet
Dim ws先 As Worksheet
Dim i As Long
Set ws元 = ThisWorkbook.Sheets(“転記元”)
Set ws先 = ThisWorkbook.Sheets(“転記先”)
i = 2
Do While ws元.Cells(i, 1).Value <> “”
ws先.Cells(i, 1).Value = ws元.Cells(i, 1).Value
ws先.Cells(i, 2).Value = ws元.Cells(i, 2).Value
i = i + 1
Loop
MsgBox “転記完了”
End Sub
「ws元.Cells(i, 1).Value <> “”」はA列のセルが空白でない間、という条件です。
A列が空白になったところでループが終了するため、データ量が変動するシートに対してフレキシブルに対応できます。
条件分岐(If文)を組み合わせた選択的転記の実装
すべての行を転記するのではなく、特定の条件を満たす行だけを転記先に転記したい場合は、ループ内にIf文を組み込みます。
条件に合う行だけを転記するコード例(ステータスが「完了」の行のみ転記)
Sub 条件付き転記()
Dim ws元 As Worksheet
Dim ws先 As Worksheet
Dim i As Long
Dim 転記行 As Long
Dim 最終行 As Long
Set ws元 = ThisWorkbook.Sheets(“全データ”)
Set ws先 = ThisWorkbook.Sheets(“完了データ”)
最終行 = ws元.Cells(Rows.Count, 1).End(xlUp).Row
転記行 = 2
For i = 2 To 最終行
If ws元.Cells(i, 4).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
転記先.Cells(転記行, 4).Value = ws元.Cells(i, 4).Value
転記行 = 転記行 + 1
End If
Next i
MsgBox “条件付き転記が完了しました。”
End Sub
D列(4列目)の値が「完了」の行だけを転記先シートに転記し、転記行カウンターを別に管理することで転記先が空白なく連続して並ぶようにしています。
転記自動化をさらに高度にする応用テクニック
続いては、転記自動化をより実務レベルで活用するための応用テクニックを確認していきます。
基本的な転記コードをマスターしたら、これらのテクニックを加えることで転記マクロの完成度が大幅に上がるでしょう。
複数シートのデータを1つのシートに集約する方法
複数のシートに分散しているデータを1つのマスターシートに集約する処理は、月次報告書の集計などでよく使われるパターンです。
全シートのデータを1シートに集約するVBAコード例
Sub 全シート集約()
Dim ws集約 As Worksheet
Dim ws As Worksheet
Dim 集約行 As Long
Dim 各シート最終行 As Long
Set ws集約 = ThisWorkbook.Sheets(“集約シート”)
ws集約.Cells.Clear
集約行 = 1
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> “集約シート” Then
各シート最終行 = ws.Cells(Rows.Count, 1).End(xlUp).Row
ws.Range(ws.Cells(1, 1), ws.Cells(各シート最終行, 5)).Copy _
ws集約.Cells(集約行, 1)
集約行 = 集約行 + 各シート最終行
End If
Next ws
MsgBox “全シートの集約が完了しました。”
End Sub
「For Each ws In ThisWorkbook.Worksheets」でブック内の全シートをループし、集約シート以外のすべてのシートのデータを集約シートにコピーする処理です。
転記処理の速度を上げるためのパフォーマンス最適化
大量のデータを転記する際、VBAの処理速度が遅くなることがあります。
以下のコードをマクロの先頭と末尾に追加することで、処理速度を大幅に改善できます。
VBAのパフォーマンスを最適化するコード
Sub 高速転記()
Application.ScreenUpdating = False ‘画面更新を停止
Application.Calculation = xlCalculationManual ‘自動計算を停止
Application.EnableEvents = False ‘イベント処理を停止
‘転記処理をここに記述
Application.ScreenUpdating = True ‘画面更新を再開
Application.Calculation = xlCalculationAutomatic ‘自動計算を再開
Application.EnableEvents = True ‘イベント処理を再開
End Sub
画面更新・自動計算・イベント処理を一時的に停止することで、セルへの書き込み処理が何倍もの速度で完了するようになります。
大量データの転記では体感できるほどの速度改善が得られるでしょう。
転記後に重複データを除外するユニークな方法
転記を繰り返すことで同じデータが重複して転記されてしまう問題には、転記前に既存データをチェックする処理を組み込むことで対応できます。
具体的には、転記元のキー値(IDや日付など)が転記先に既に存在するかどうかをMATCH関数的に検索し、重複していれば転記をスキップするロジックをIf文で実装します。
また、転記後にエクセルの「重複の削除」機能をVBAから実行する方法も有効です。
| 処理の種類 | VBAの構文 | 主な用途 |
|---|---|---|
| 固定回数の繰り返し | For i = 1 To N … Next i | 行数が決まっているデータの一括転記 |
| 条件が続く間の繰り返し | Do While 条件 … Loop | データ末尾が不定のシートへの転記 |
| オブジェクトの繰り返し | For Each obj In コレクション | 全シートを順番に処理する集約転記 |
| 条件による分岐 | If 条件 Then … End If | 特定条件を満たす行だけを転記 |
まとめ
本記事では、エクセルで転記作業を自動化する方法として、VBAマクロの基本から繰り返し処理・条件分岐・別シート連携・応用テクニックまでを詳しく解説してきました。
VBAを使った転記自動化は、初期の設定に少し時間がかかりますが、一度構築してしまえば毎日の転記作業が数秒で完了するようになり、投資対効果は非常に大きいです。
For Nextループ・Do Whileループ・If文による条件分岐といった基本的なコードパターンを組み合わせるだけで、ほとんどの転記業務は自動化できるでしょう。
まずは「マクロの記録」機能を使って操作を記録し、生成されたコードを少しずつ編集して改良していくアプローチが、初心者には最も取り組みやすい方法です。
転記自動化によって生まれた時間を、より創造的な業務に充てることで、エクセル業務全体の生産性向上につなげていきましょう。