Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Excelマクロ入門】For Eachでセルを巡回する鉄板テクニック完全ガイド

 

Excelマクロを書き始めたばかりの多くの方が、

一度はぶつかる壁があります。

それが――
「セルを1つずつ処理したいけど、どう回せばいいの?」 問題。

For i = 1 To 100 でも書けそうだけど、
もっとスマートで、ミスが少なく、読みやすい方法があります。

それが今回の主役、

For Each ループ です。


🔍 For Each とは何か?

For Each は、
「指定した範囲の要素を、先頭から順番に1つずつ処理する」
ための構文です。

基本形

For Each 変数 In 対象
    処理
Next

 

Excelマクロでは特に

  • セル

  • シート

  • ブック

を回すのに圧倒的によく使われます。


🌱 最初の一歩:セルを順番に処理する

 
Sub ForEachBasic()

    Dim c As Range
    For Each c In Range("A1:A5")
        Debug.Print c.Value
    Next c

End Sub

 

A1〜A5のセルを、
上から順に自動で回してくれます。

ポイントはここ👇

  • インデックス(i)を自分で管理しなくていい

  • セルが増減してもコードを直さなくていい

初心者ほど、For Eachを使う価値があります。


🧠 なぜ For Each が「鉄板」なのか?

Forループとの比較

 
' Forループ

Dim i As Long
For i = 1 To 5
    Cells(i, 1).Value = i
Next i
 
' For Each

Dim c As Range
For Each c In Range("A1:A5")
    c.Value = "OK"
Next c

 

比較項目 For For Each
インデックス管理 必要 不要
可読性 やや低い 高い
セル増減への強さ 弱い 強い
初心者の事故率 高め 低い

👉 セル処理は For Each が基本 と覚えてOKです。


🎯 実務でよくある使い方①:空白セルをチェック

 
Sub CheckBlankCells()

    Dim c As Range

    For Each c In Range("A1:A20")
        If c.Value = "" Then
            c.Interior.Color = vbYellow
        End If
    Next c

End Sub

 

空白セルだけ色を付ける、
超・実務向けの定番処理です。


🎯 実務でよくある使い方②:条件に合うセルだけ処理

 
Sub ProcessNumericCells()

    Dim c As Range

    For Each c In Range("B1:B10")
        If IsNumeric(c.Value) Then
            c.Value = c.Value * 2
        End If
    Next c

End Sub

 

前回紹介した IsNumeric() と組み合わせることで、
安全で壊れにくいマクロになります。


🧩 行・列を For Each で回す

行を回す

Dim r As Range
For Each r In Rows("2:10")
    r.Hidden = False
Next r

 

列を回す

Dim col As Range
For Each col In Columns("A:D")
    col.AutoFit
Next col

 

👉 行番号・列番号を意識しなくていいのが最大のメリット。


⚠ よくある初心者のつまずきポイント

❌ 値の配列と勘違いする

 
For Each c In Range("A1:A5").Value   ' ← これはNG

 

✅ 正しくは

 
For Each c In Range("A1:A5")

 

For Each は オブジェクト(Rangeなど)を回すものです。


❌ 変数の型が違う

Dim c As String   ' ← NG
 
Dim c As Range    ' ← OK

 

セルを回すなら必ず As Range


🪄 応用:UsedRange を For Each で回す

Sub LoopUsedRange()

    Dim c As Range

    For Each c In ActiveSheet.UsedRange
        If c.Value <> "" Then
            Debug.Print c.Address & " : " & c.Value
        End If
    Next c

End Sub

 

シート内の「使われているセルだけ」を対象にできるため、
処理速度・安全性ともに優秀です。


✨ まとめ:For Each は「Excelマクロの基本動作」

処理したいもの おすすめ
セル For Each
行・列 For Each
シート For Each
ブック For Each

「セルを順に処理したい」= For Each
この感覚が身につくと、マクロが一気に書きやすくなります。