【VBA】繰り返し処理で100個以上のデータを一瞬で編集する方法

 

毎日エクセルで同じ処理を何度も繰り返していませんか?

 

「一覧表の100行分を1行ずつ確認して、条件によって色を変える」「特定の列に入力されたデータを別のシートにコピペする」といった作業を、1行ずつ手作業でこなしているなら、あなたの時間は大きなロスをしているかもしれません。

 

VBAには「繰り返し処理」という仕組みがあります。

この繰り返し処理を使えば、100行分の作業でも1000行分の作業でも、ボタン1クリックで一瞬に終わらせることが可能です。

 

私はこれまで年間50件以上のマクロ開発を受注してきましたが、繰り返し処理はほぼすべてのマクロに組み込んでいます。

「色を変える」「計算する」「テキストをコピペする」といったあらゆる処理に、必要不可欠なコードです。

 

この記事では、VBAの繰り返し処理の基本から実務で使える応用コードまで、プログラミング初心者の方にもわかりやすく解説します。

読み終えたころには「これ、明日から自分の仕事に使える!」と感じてもらえるはずです。

 

目次

広告

手作業の繰り返し処理が引き起こす3つの問題

エクセルで同じ作業を何度も繰り返している方は、知らず知らずのうちに大きな問題を抱えてしまっています。

VBAで解決できることを理解するために、まずは手作業の繰り返しが生む問題を整理しておきましょう。

 

問題①:処理件数が増えるにつれて作業時間が跳ね上がる

1件あたり1分の作業でも、100件になれば100分です。200件になれば200分、つまり3時間以上かかる計算になってしまいます。

 

私がマクロ開発を受注した案件の中に、「一覧表の2行目から100行目まで、各行のデータを確認しながら処理する」という依頼がありました。

お客様は毎日この処理を手作業でこなしていたため、1日のうちの大半をエクセル作業に費やしていたのです。

 

VBAの繰り返し処理を設定することで、この作業をボタン1クリック・数秒で完了させることができます。

 

問題②:単純作業の繰り返しはヒューマンエラーが起きやすい

何百行ものデータを1行ずつ確認していると、集中力が途切れてくるのは当然のことです。

 

「あれ、この行の処理、さっきもやったっけ?」「見落としてた行があった……」というミスは、手作業の繰り返しにはつきものです。

特に「日付が○日以内かどうか」「数値が基準値を超えているかどうか」といった条件判定を伴う繰り返し処理では、判断ミスが取り返しのつかないトラブルに発展することもあります。

 

問題③:データが増えるたびに対応範囲を修正する手間が発生する

手作業やマクロが不完全な場合、「先月は50行だったのに今月は80行になった」というたびに処理の範囲を変更しなければなりません。

 

VBAの繰り返し処理は、最終行を自動で取得して処理範囲を動的に変更する仕組みが組み込めます。

データ件数が変動しても、コードを書き換えることなく正確に処理を実行することが可能です。

 

VBAの繰り返し処理の基本|まずはFor Next文から理解する

繰り返し処理に関連するVBAのコードには、大きく分けて「For Next文」と「For Each文」の2種類があります。

まずは最もよく使われる「For Next文」の基本的な書き方と動作を理解していきましょう。

 

For Next文は「〇回繰り返す」「〇行目から△行目まで処理する」といった場面に最適な繰り返し処理の構文です。

 

For Next文の基本構文と動作の仕組み

For Next文の基本的な書き方は次のとおりです。

Sub 繰り返し処理の基本()

Dim i As Long

For i = 1 To 10
'繰り返したい処理をここに書く
Debug.Print i 'イミディエイトウィンドウに i の値を表示
Next i

End Sub

このコードを実行すると、i の値が1から始まり、10になるまで1ずつ増えながら処理が繰り返されます。

For i = 1 To 10 の「1」がスタートの番号、「10」が終わりの番号です。

 

Next i に到達するたびに i の値が1増えて、再び For の行に戻って処理が繰り返されます。

i が10になって Next i を通過すると、繰り返しが終了して End Sub に進む、という流れです。

 

この i はループカウンター(繰り返し回数を数える変数)と呼ばれ、処理対象の行番号を指定するためにも使われます。

 

エクセルの一覧表を2行目から最終行まで処理するVBA

実務で最もよく使う「一覧表を上から順番に1行ずつ処理する」パターンを見ていきましょう。

 

私が受注したマクロ開発でも、「一覧表の2行目から100行目までの処理を繰り返す」という依頼を受けたことがありました。

下記のサンプルコードは、A列に入力された氏名に対して「B列に処理済みという文字を自動入力する」という処理を2行目から最終行まで繰り返す例です。

 

Sub 一覧表を繰り返し処理()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")

'最終行を自動取得(A列の一番下のデータがある行を取得)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

'for next文で2行目から最終行まで繰り返す
For i = 2 To lastRow
ws.Cells(i, 2).Value = "処理済み"
Next i

MsgBox "処理が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

まず Set ws = ThisWorkbook.Worksheets(“Sheet1") で処理対象のシートを指定しています。

シート名は実際のファイルに合わせて変更してください。

 

lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row でA列の最終行番号を自動取得しています。

データが50行でも100行でも、この1行を書いておくだけで処理の範囲が自動的に決まるため、コードを書き直す必要がありません。

 

For i = 2 To lastRow で2行目から最終行まで繰り返します。

1行目はヘッダー(見出し)であることが多いため、2行目からスタートするのが基本的な書き方です。

ws.Cells(i, 2).Value = “処理済み" の i がループのたびに2、3、4……と増えていくため、2行目→3行目→4行目という順番でB列のセルに「処理済み」という文字が入力されていきます。

 

実務で使える繰り返し処理①|条件分岐と組み合わせて色を自動で変える

繰り返し処理は単体で使うだけでなく、条件分岐(If文)と組み合わせることで「条件によって処理を変える」という実務に直結するマクロが作れます。

繰り返し処理と条件分岐を組み合わせることで、「色を変える」「文字を変える」「値を計算する」といった様々な自動化が実現可能です。

 

日付が3日以内なら赤色、7日以内なら緑色に自動変更するVBA

私が実際に受注した依頼の中に、「セルに入力された日付が7日以内の場合は文字色を緑色に、3日以内の場合は赤色にする」というマクロの開発依頼がありました。

 

そのとき開発したコードのサンプルがこちら

Sub 日付によって文字色を変える()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim targetDate As Date
Dim diffDays As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

'いったん文字色を黒にリセット
ws.Range("B2:B" & lastRow).Font.Color = RGB(0, 0, 0)

For i = 2 To lastRow

'B列の日付を取得(空白の場合はスキップ)
If ws.Cells(i, 2).Value = "" Then GoTo Continue

targetDate = ws.Cells(i, 2).Value

'今日との日数差を計算
diffDays = targetDate - Date

If diffDays <= 3 Then
'3日以内は赤色
ws.Cells(i, 2).Font.Color = RGB(255, 0, 0)
ElseIf diffDays <= 7 Then
'7日以内は緑色
ws.Cells(i, 2).Font.Color = RGB(0, 180, 0)
End If

Continue:
Next i

MsgBox "文字色の設定が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

処理の最初に ws.Range(“B2:B" & lastRow).Font.Color = RGB(0, 0, 0) で文字色を黒にリセットしています。

リセットを入れておかないと、前回実行時に付いた色が残り続けてしまうため、必ず処理の先頭でリセットするのが鉄則です。

 

targetDate = ws.Cells(i, 2).Value でB列の日付を取得し、diffDays = targetDate – Date で今日との日数差を計算しています。

Date は「今日の日付」を取得する関数です。

 

diffDays が3以下なら赤(RGB(255, 0, 0))、7以下なら緑(RGB(0, 180, 0))というように、If文で条件を分岐させて文字色を設定しています。

B列が空白の行は GoTo Continue でスキップするようにしているため、データが途中で飛んでいても正しく動作します。

 

数値の大きさによって複数の処理を切り替えるVBA

「売上目標の達成率によって背景色を3段階で変える」といった処理も、繰り返し処理と条件分岐を組み合わせれば簡単に実装できます。

Sub 達成率によって背景色を変える()

Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim rate As Double

Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

'いったん背景色をリセット
ws.Range("C2:C" & lastRow).Interior.ColorIndex = xlNone

For i = 2 To lastRow

If ws.Cells(i, 3).Value = "" Then GoTo NextRow

rate = ws.Cells(i, 3).Value 'C列の達成率(%)

If rate >= 100 Then
'100%以上は青
ws.Cells(i, 3).Interior.Color = RGB(173, 216, 230)
ElseIf rate >= 80 Then
'80%以上は黄色
ws.Cells(i, 3).Interior.Color = RGB(255, 255, 0)
Else
'80%未満はピンク
ws.Cells(i, 3).Interior.Color = RGB(255, 182, 193)
End If

NextRow:
Next i

MsgBox "背景色の設定が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

rate = ws.Cells(i, 3).Value でC列の数値(達成率)を取得し、その値によって If ~ ElseIf ~ Else の分岐で3段階の背景色を設定しています。

達成率100%以上は青、80%以上は黄色、80%未満はピンクというパターンです。

 

Interior.Color = RGB(…) の数値を変えるだけで、好みの色に変更することができます。

繰り返し処理と条件分岐を組み合わせることで、こういった「件数が多くても一瞬で色分けできる」マクロが完成します。

 

実務で使える繰り返し処理②|For Each文で全シートや全セルを処理する

For Next文に加えて、「For Each文」という繰り返し処理の書き方も覚えておくと、応用の幅が一気に広がります。

For Each文は「コレクションに含まれるすべての要素を処理する」という場面に特化した繰り返し処理です。

 

「ブック内のすべてのシートを処理する」「指定した範囲のすべてのセルを処理する」といった場面でよく使われます。

 

For Each文の基本構文

Sub ForEach基本構文()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
MsgBox ws.Name '各シートの名前を表示
Next ws

End Sub

For Each ws In ThisWorkbook.Worksheets で、ブック内にあるすべてのシートを ws という変数に1枚ずつ取り出しながら処理を繰り返しています。

シートが何枚あっても、この書き方であれば自動的に全シートを処理してくれます。

 

全シートの同じセルに処理を実行するVBA

複数のシートがあって、それぞれのシートに「今日の日付をA1セルに入力する」という処理をしたい場合、For Each文を使うと非常にシンプルに書けます。

Sub 全シートに日付を入力()

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
ws.Range("A1").Value = Date '全シートのA1セルに今日の日付を入力
Next ws

MsgBox "全シートの処理が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

For Each ws In ThisWorkbook.Worksheets でブック内の全シートを順番に処理対象にしています。

ws.Range(“A1").Value = Date で、処理対象のシートのA1セルに今日の日付を入力しています。

 

これをFor Next文で書こうとすると、シートのインデックス番号を管理する変数が別途必要になって複雑になってしまいます。

「ブック内の全シートをまとめて処理したい」という場面では、For Each文を選ぶのがおすすめです。

 

実務で使える繰り返し処理③|Do While文で条件が続く限り繰り返す

For Next文やFor Each文に加えて、「Do While文」という繰り返し処理も覚えておくと便利です。

 

Do While文は「条件が満たされている間だけ繰り返す」という処理で、「データがなくなるまで処理を続ける」「特定の値が現れるまでループする」という場面に最適です。

 

Do While文の基本構文と動作

Sub DoWhile基本構文()

Dim i As Long
i = 1

Do While i <= 10
Debug.Print i
i = i + 1
Loop

End Sub

Do While i <= 10 という条件が「真(True)」である間、Loop までの処理が繰り返されます。

i = i + 1 でループのたびに i を1増やしているため、i が11になった瞬間に条件が「偽(False)」になって繰り返しが終了する、という流れです。

 

空白セルが現れるまで処理を繰り返すVBA

「データが入力されているセルだけを処理して、空白セルが出てきたら終了する」という処理はDo While文が最も適しています。

Sub 空白まで繰り返す()

Dim ws As Worksheet
Dim i As Long

Set ws = ThisWorkbook.Worksheets("Sheet1")
i = 2 '2行目からスタート

Do While ws.Cells(i, 1).Value <> ""

'処理内容:A列の値をB列にそのまま転記
ws.Cells(i, 2).Value = ws.Cells(i, 1).Value & "(確認済み)"

i = i + 1 '次の行へ

Loop

MsgBox "処理が完了しました。", vbInformation

End Sub

コードの流れを解説します。

 

Do While ws.Cells(i, 1).Value <> “" の条件は「A列の i 行目のセルが空白でない間」という意味です。

<> は「等しくない」を表す記号で、"" は空白文字を意味しています。

つまり「A列のセルに何か入力されている間は繰り返す」という条件です。

 

ループの中で i = i + 1 を忘れずに書いておかないと、永遠に同じ行を処理し続けるという無限ループが発生するので注意してください。

 

繰り返し処理VBAを使う際の注意点

繰り返し処理を実装するときは、いくつかの落とし穴を知っておくことが重要です。

私がマクロ開発で実際に遭遇した注意点を3つ紹介します。

 

注意点①:無限ループに注意する

Do While文を使うときに最も注意が必要なのが「無限ループ」です。

条件が常に「真」のままループし続けてしまうと、エクセルが応答なしになって強制終了せざるを得ない状況になります。

 

Do While文を使うときは、ループの中に必ず i = i + 1 のようなカウンター変数を進める処理を入れましょう。

また、万が一無限ループになってしまった場合は、Escape キーまたは Ctrl + Break キーでVBAの実行を強制的に停止させることができます。

 

注意点②:最終行の取得方法を正しく使い分ける

lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row はA列を基準に最終行を取得するコードです。

ただし、A列にデータが入っていない行がある場合は、正確な最終行が取れないことがあります。

 

データが確実に入力されている列(主キーとなる列)を基準にして最終行を取得するようにしましょう。

「データが入っている列が複数ある」という場合は、最もデータが多く、空白になりにくい列を指定するのが基本です。

 

注意点③:繰り返し処理の前にリセット処理を入れる

「繰り返し処理でセルの色を変える」「繰り返し処理でテキストを入力する」といった場合、実行前にリセット処理を入れておくのが鉄則です。

前回の実行結果が残っていると、「今回は条件に当てはまらないはずなのに、前回の色がそのまま残っている」という問題が発生します。

 

ws.Range(“B2:B" & lastRow).Interior.ColorIndex = xlNone のような一括リセットを処理の先頭に書く習慣をつけておきましょう。

 

繰り返し処理を活用した実務サンプル|一覧表から条件に合うデータを別シートに転記するVBA

ここまで学んだ「繰り返し処理+条件分岐」を組み合わせた、実務でそのまま使えるサンプルコードを紹介します。

「一覧表のデータを1行ずつ確認して、条件に合う行だけを別シートに転記する」という処理は、現場からの依頼で最も多いパターンのひとつです。

Sub 条件に合うデータを別シートに転記()

Dim wsData As Worksheet '元データのシート
Dim wsResult As Worksheet '転記先のシート
Dim lastRow As Long
Dim resultRow As Long
Dim i As Long

Set wsData = ThisWorkbook.Worksheets("データ")
Set wsResult = ThisWorkbook.Worksheets("結果")

'転記先シートをリセット(2行目以降を削除)
wsResult.Range("A2:Z1000").ClearContents

lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row

resultRow = 2 '転記先の開始行

For i = 2 To lastRow

'条件:C列のステータスが「未処理」の行だけを転記
If wsData.Cells(i, 3).Value = "未処理" Then

'A~E列のデータを転記先シートにコピー
wsResult.Cells(resultRow, 1).Value = wsData.Cells(i, 1).Value 'A列
wsResult.Cells(resultRow, 2).Value = wsData.Cells(i, 2).Value 'B列
wsResult.Cells(resultRow, 3).Value = wsData.Cells(i, 3).Value 'C列
wsResult.Cells(resultRow, 4).Value = wsData.Cells(i, 4).Value 'D列
wsResult.Cells(resultRow, 5).Value = wsData.Cells(i, 5).Value 'E列

resultRow = resultRow + 1 '転記先の行を1つ進める

End If

Next i

MsgBox "転記が完了しました。" & (resultRow - 2) & "件のデータを転記しました。", vbInformation

End Sub

コードの流れを解説します。

 

まず Set wsData と Set wsResult でそれぞれのシートを変数に格納しています。

シート名「データ」と「結果」は実際のシート名に合わせて変更してください。

 

wsResult.Range(“A2:Z1000").ClearContents で転記先シートの2行目以降をリセットしています。

ヘッダー行(1行目)はそのまま残し、データ部分だけをリセットする書き方です。

 

For i = 2 To lastRow で元データの2行目から最終行まで繰り返しながら、C列の値が「未処理」かどうかを判定しています。

条件に合った行だけを wsResult.Cells(resultRow, …).Value = wsData.Cells(i, …).Value で転記しています。

 

resultRow = resultRow + 1 で転記先の行番号を1つずつ進めているため、転記されたデータが連続して並ぶようになっています。

最後の MsgBox に (resultRow – 2) を入れることで、何件のデータが転記されたかも表示されます。

 

関連記事「別シートにテキストを自動転記」では、シートを指定するVBA、転記VBAが設定されたエクセルファイルをダウンロードすることができます。

 

実際にマクロを動かして便利さを体感してみてください。

 

まとめ ~ 繰り返し処理はVBA自動化の土台になる技術 ~

エクセルで同じ作業を何百回も繰り返している方にとって、VBAの繰り返し処理は業務を劇的に変える技術です。

For Next文は「○行目から△行目まで処理する」という一覧表の処理に、For Each文は「全シートをまとめて処理する」という場面に、Do While文は「条件が続く限り処理する」という柔軟な繰り返しに向いています。

 

この3つの繰り返し処理を使い分けるだけで、「色を変える」「データを転記する」「条件によって処理を切り替える」というあらゆる自動化が実現できます。

 

私が年間50件以上のマクロ開発を受注してきた中で、繰り返し処理が使われていないマクロはほぼ存在しないと言えます。

それだけ繰り返し処理はVBA自動化の土台となる、絶対に押さえておくべき技術なのです。

まずは今回紹介したコードをそのままコピペして動かしてみるところから始めてみましょう。

 

「自分の仕事に合わせてカスタマイズしたい」「もっと複雑な条件処理を組み込みたい」という場合も、土台となる繰り返し処理の書き方さえ理解していれば、応用の幅は無限に広がっていきます。

もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。

 

 

業務内容に合わせたオーダーメイドマクロを設定させていただきます。

 

最後まで読んでいただきありがとうございました。

エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。