Excelで業務をしていると、「特定の値と一致したデータだけを別シートに転記したい」という場面は非常に多くあります。
例えば、顧客コードが一致するデータだけ抽出する、ステータスが「完了」の行だけ別シートにまとめるなど、日常業務で頻出する処理です。
しかしVBAで実装しようとすると、
- 条件の書き方が分からない
- データ量が増えると遅くなる
- 後から条件を変えたくなったときに修正しづらい
といった問題に直面することも少なくありません。
本記事では、「値が一致したら転記する」処理を、実務で使える形で安定して実装する方法を解説します。
単なるコード紹介ではなく、「なぜこの設計にするのか」「どうすれば壊れないのか」まで踏み込んで解説していきます。
目次
✅ VBAで「一致したら転記」の基本の考え方
この処理はシンプルに見えますが、実務では「完全一致か部分一致か」「空白の扱い」「データ型の違い」など、細かいポイントで結果が変わります。ここを曖昧にしたまま実装すると、「なぜか転記されない」「意図しないデータが混ざる」といったトラブルに繋がります。この章では、まず処理の全体像を整理します。
・基本の流れ
- データ範囲を取得
- 1行ずつループ
- 条件一致を判定
- 一致したデータを転記
👉 ポイントは
「一致条件を明確にすること」です。
✅ 最も基本となる転記処理の実装方法
まずは、最もシンプルで分かりやすい方法から理解することが重要です。ここをしっかり押さえておけば、後から応用や高速化にも対応できます。
・例:特定の値と一致したら別シートへ転記
Sub CopyIfMatch()
Dim lastRow As Long
Dim rowIndex As Long
Dim outputRow As Long
Dim targetValue As String
Dim cellValue As String
Dim wsSource As Worksheet
Dim wsOutput As Worksheet
Set wsSource = ThisWorkbook.Sheets("元データ")
Set wsOutput = ThisWorkbook.Sheets("転記先")
targetValue = "営業部"
lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
outputRow = 2
For rowIndex = 2 To lastRow
cellValue = wsSource.Cells(rowIndex, 2).Value
If cellValue = targetValue Then
wsSource.Rows(rowIndex).Copy Destination:=wsOutput.Rows(outputRow)
outputRow = outputRow + 1
End If
Next rowIndex
End Sub
・なぜこの書き方にしているのか
このコードは、処理の流れが直感的に分かる構造にしています。
実務では「誰が見ても理解できること」が最も重要であり、トラブル時の修正もしやすくなります。
👉 特に
- シートを明示的に指定
- 変数名を意味のある名前にする
ことで、誤動作を防いでいます。
・別の書き方との違い
AutoFilterやAdvancedFilterを使う方法もありますが、
- 柔軟な条件設定がしづらい
- 処理の流れが見えにくい
というデメリットがあります。
👉 一方、この方法は
条件を自由に制御できるのが強みです。
・実務での注意点
- 空白や型の違いで一致判定が失敗する
- コピー処理は重い(大量データで遅くなる)
- シート未指定はバグの原因
👉 「一致しているはずなのに転記されない」といったトラブルは、比較演算子の使い方に原因があるケースが多いです。
正しい条件判定の考え方は
「【VBA】比較演算子を用いた複数条件の使用方法|実務で迷わない条件分岐の設計」で確認しておきましょう。
✅ 条件が増えても壊れない設計にする方法
実務では「一致条件が増える」ことがほとんどです。ここを考慮せずにコードを書くと、後からの修正が非常に難しくなります。この章では、拡張性を意識した設計方法を解説します。
・条件を変数化する
Dim isTargetDept As Boolean
Dim isHighSales As Boolean
isTargetDept = (cellValue = "営業部")
isHighSales = (wsSource.Cells(rowIndex, 3).Value >= 1000000)
If isTargetDept And isHighSales Then
・なぜこの設計が重要なのか
👉 条件が増えても読みやすさが維持できる
→ なぜなら、条件ごとに意味を持った変数として分離しているためです。
例えば、
If department = "営業部" And sales >= 1000000 Then
のように直接書いてしまうと、条件が増えるほど式が長くなり、
「何を判定しているのか」が一目で分かりにくくなります。
一方で、
isSalesDept = (department = "営業部")
isHighSales = (sales >= 1000000)
If isSalesDept And isHighSales Then
のように分けることで、
- それぞれの条件の意味が明確になる
- 条件ごとに個別に確認・修正できる
- バグが発生したときに原因を切り分けやすい
といったメリットがあります。
特に実務では、「条件を1つずつテストできる状態」にしておくことが重要であり、
この書き方はそのまま保守性とデバッグ性の向上につながります。
・実務でのメリット
- 修正が簡単
- 条件の追加がしやすい
- バグが減る
👉 条件を追加するたびにIF文をネストしていくと、後からの修正が難しくなり、コードが壊れる原因になります。
実務で安定して使える条件分岐の設計は
「【VBA】IF文のElseIfを用いた複数条件|ネストを防ぎ実務で壊れない条件分岐を書く方法」で確認しておきましょう。
✅ 高速化するための実務テクニック(配列処理)
データ件数が増えると、セルを1つずつ処理する方法では限界があります。この章では、処理速度を改善するための方法を解説します。
・配列を使った高速転記
Sub CopyIfMatchWithArray()
Dim dataArray As Variant
Dim resultArray() As Variant
Dim i As Long, j As Long
Dim resultIndex As Long
dataArray = Range("A2:C1000").Value
ReDim resultArray(1 To UBound(dataArray), 1 To 3)
resultIndex = 1
For i = 1 To UBound(dataArray)
If dataArray(i, 2) = "営業部" Then
For j = 1 To 3
resultArray(resultIndex, j) = dataArray(i, j)
Next j
resultIndex = resultIndex + 1
End If
Next i
Range("E2").Resize(resultIndex - 1, 3).Value = resultArray
End Sub
・なぜこの書き方なのか
👉 セルアクセスを減らして高速化するため
→ なぜなら、Excelはセルを1つずつ読み書きする処理が非常に遅い構造になっているためです。
例えば、通常のループ処理では
Cells(rowIndex, 2).Value
のように、1回のループごとにExcelシートへアクセスしています。
この「セルへのアクセス」は、VBA(メモリ上の処理)とExcel(シート上の処理)を行き来するため、
内部的に大きなオーバーヘッドが発生します。
データ件数が増えると、この処理が何千回・何万回と繰り返されるため、
👉 処理時間のほとんどが「セルアクセス」に費やされる状態になります。
一方で配列を使う場合は、
dataArray = Range("A2:C1000").Value
のように、一度だけまとめてデータを取得し、
その後の処理はすべてメモリ上(VBA内)で完結します。
これにより、
- Excelとの通信回数が大幅に減る
- ループ処理が軽くなる
- 全体の処理速度が劇的に改善される
というメリットがあります。
👉 つまり、配列処理は
「遅いセル操作を減らし、速いメモリ処理に置き換える」ための設計です。
・実務での判断基準
- 小規模 → 通常ループ
- 大規模 → 配列
👉 VBAの処理速度は「セルをどれだけ直接操作するか」で大きく変わります。
そのボトルネックを解消するための配列取得の基本は
「【VBA】範囲指定のセルの値を配列に格納する方法|処理速度と保守性を両立する実務設計」で確認しておきましょう。
✅ よくある失敗とその対処法
「一致したら転記」はシンプルな処理ですが、細かいミスで結果が変わります。ここでは実務でよくあるトラブルを整理します。
・よくあるミス
- 文字列と数値の比較ミス
- 空白セルの扱い
- 全角・半角の違い
- 不要なスペース
・対処法
👉 比較前にデータを整える
✅ 実務でさらに使える応用パターン
単純な一致だけでなく、実務では応用が必要になるケースが多くあります。この章ではよくある応用例を紹介します。
・部分一致で転記
If InStr(cellValue, "営業") > 0 Then
・複数条件で転記
If department = "営業部" And sales >= 1000000 Then
👉 実務では単一条件だけでなく、複数条件を組み合わせた抽出が前提になります。
実際に使えるデータ抽出の設計は
「【VBA】複数条件でデータ抽出する方法|実務で使える安定設計と高速化テクニック」で確認しておきましょう。
✅ まとめ:一致条件の設計が転記処理の品質を決める
- 一致条件を明確にすることが最重要
- まずはシンプルな構造で実装する
- 条件は変数化して保守性を上げる
- データ量に応じて配列処理を使う
VBAでの転記処理は、単なるコピーではなく
👉 「条件設計」と「処理設計」の組み合わせです。
この考え方を押さえておけば、
実務で使える安定したコードを作れるようになります。
ぜひ、自分の業務に合わせて応用してみてください 👍