🙄

【VBA】公務員業務で使いがちなFor Each文(すべてのシートを走査、特定の列を走査、すべてのセルを走査)

2023/07/06に公開

なんかよくわかりませんがよく使うので覚えましょう。
For Each ws In Sheetsの場合はwsがカウント変数として使うシートオブジェクト、Sheetsはコレクションオブジェクトです。
オブジェクトってなんやねんと思う人も使えばわかるのでとりあえずコピペして使ってみてください。

ブック内のすべてのシートを走査、取得する

Sub LoopThroughSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        Debug.Print ws.Name
    Next ws
End Sub

Debug.Print ws.Nameのところをやりたい処理に書き換えてください。
実際のところはws.Name = "シート名"として一致したときに何かすることが多いです。

シートの特定の列を走査、取得する

Sub LoopThroughUsedColumn(columnNumber As Long)
    Dim rng As Range
    Dim col As Range
    Set col = Intersect(ThisWorkbook.Sheets("Sheet1").Columns(columnNumber), ThisWorkbook.Sheets("Sheet1").UsedRange)
    For Each rng In col
        Debug.Print rng.Value
    Next rng
End Sub

Intersect(range1, range2)は、指定した2つの範囲の交差部分、つまり重なる範囲を取得します。
Debug.Print rng.Valueのところをやりたい処理に書き換えてください。
実際のところは rng.Vlaue = "合計値"などとしてその隣にある値を取得して他のシートに転記したりします。
何列目に探したいキーワードがあるかわかる場合はこれで行くのがシンプルでいいかと思います。

シート内のすべての使用領域セルを走査、取得する

Sub LoopThroughUsedRange()
    Dim rng As Range
    For Each rng In ThisWorkbook.Sheets("Sheet1").UsedRange
        Debug.Print rng.Value
    Next rng
End Sub

様式にセルを挿入したり結合したりするなと言っても無視して提出してくるならず者の自治体はいるものです。
探したいキーワードは大体39列目だけどそうじゃない可能性もあるというときはしょうがないので使用領域のセルを走査します。
Debug.Print rng.Valueのところをやりたい処理に書き換えてください。
実際のところは rng.Vlaue = "合計値"などとしてその隣にある値を取得して他のシートに転記したりします。
走査は1行目を横にガーっと行って2行目…という動きをします。

For Each文をとりあえず感覚で覚える

For Each ws In Sheets

wsはForループ内で毎回変わる変数、入れ物です。
1回目のループ ws = A1セルの内容
2回目のループ ws = B1セルの内容
3回目のループ ws = C1セルの内容
と移り変わります。

Sheetsはなんか色々集まっているオブジェクトです。配列でもOKです。
ThisWorkbook.Sheets("Sheet1").UsedRangeはSheet1の有効範囲のセルすべてで、これもたくさん集まったオブジェクトなのでOKです。
あとはFor文と同じです。
必ず使えるようになりましょう。

Discussion