とことこプーレ

【第4回Excelマクロ】for文について【ほぼfor/if文】

今度は、果物の合計金額(価格×個数)をそれぞれ出してみましょう。

ちなみに今回は掛け算を使いますが、四則演算に使う記号は

となります。

例えば、以下のコードでそれぞれの合計金額を出すことは可能です。

Dim ws As Worksheet 'ワークシートのオブジェクト変数を宣言
Set ws = ThisWorkbook.Sheets("Sheet1")

ws.Cells(2, 4).Value = ws.Cells(2, 2).Value * ws.Cells(2, 3).Value 'りんごの合計価格
ws.Cells(3, 4).Value = ws.Cells(3, 2).Value * ws.Cells(3, 3).Value 'なしの合計価格
ws.Cells(4, 4).Value = ws.Cells(4, 2).Value * ws.Cells(4, 3).Value 'ぶどうの合計価格
ws.Cells(5, 4).Value = ws.Cells(5, 2).Value * ws.Cells(5, 3).Value 'すいかの合計価格

ただ、果物がもし100項目あったら100も同じようなコードを書くことになるので大変ですよね。そんな時、処理を繰り返す「for文」が非常に便利です。

それと、Excelの行がアルファベットで表示されている場合、使いたいのセルの行数がいくつなのか計算するのって大変ですよね。

【Excelのオプション】の【数式】にある【R1C1参照形式を使用する】にチェックを入れてOKをクリックしましょう。行が数字に変わります。

for文の使い方

繰り返し処理ができるfor文ですが、使い方は以下になります。

Dim i As Integer    'for文のカウンタ変数

For i = 初期値 To 終了値  '2行目から5行目までループ
    処理
Next i

初期値と終了値を決め、その範囲内で変数をカウントアップさせていきながら、繰り返し処理を実行します。カウンタに使う変数は「i」でなくても大丈夫です。

例えば、冒頭の合計金額を算出するコードは以下のように書き換えできます。

Dim ws As Worksheet 'ワークシートのオブジェクト変数を宣言
Set ws = ThisWorkbook.Sheets("Sheet1")

Dim i As Integer    'for文のカウンタ

For i = 2 To 5  '2行目から5行目までループ
    ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value  '各果物の合計価格
Next i

コードを書く量も減って、すっきりして見やすいですよね。

また、以下のように「Step 〇」とつけることで、任意のカウントができます。もし、「-1」ずつカウントしたい場合は、以下のようになります。

For i = 5 To 2 Step -1  '5行目から2行目までループ
    ws.Cells(i, 4).Value = ws.Cells(i, 2).Value * ws.Cells(i, 3).Value  '各果物の合計価格
Next i

ちなみに、1つ飛ばしで繰り返し処理したい場合は「Step 2」とすればよいのでご参考までに。

for文のネスト

今度は、Sheet2に同じ表をコピーしてみましょう。コピーの方法はいくつかありますが、今回はfor文を2重で使ってコピーしてみます。

Dim ws1 As Worksheet    'Sheet1のオブジェクト変数
Set ws1 = ThisWorkbook.Sheets("Sheet1")

Dim ws2 As Worksheet    'Sheet2のオブジェクト変数
Set ws2 = ThisWorkbook.Sheets("Sheet2")

Dim i As Integer    'for文の外側のカウンタ
Dim j As Integer    'for文の内側のカウンタ

For i = 1 To 5  '1行目から4行目までループ
    For j = 1 To 4  '1列目から4列目までループ
    
        ws2.Cells(i, j).Value = ws1.Cells(i, j).Value  'ws1のデータをws2に出力
    
    Next j
Next i

for文の中にfor文を書くことをネスト(入れ子)といったり、2つのfor文を使っているので2重ループといったりします。

まず、処理の流れですが

  1. 外側のfor文(For i = 1 To 5)では行方向にループしていて、1行目を指定している
  2. 内側のfor文(For j = 1 To 4)の処理に入り、1列目から4列目までループします。
  3. 4列目の処理が終わったら、外側のfor文がカウントアップされて2行目を指定する
  4. 1~3をカウントアップしながら5行目まで繰り返す

文章だと難しいので、以下のように「stop」というコードを入れてみましょう。データが出力した後にコードが止まってくれます。そして、▶ボタンかF5キーを押すとまたコードが実行されます。

Sheet2を見ながらstopと実行を繰り返すと、どのように2重ループが実行されているかわかりやすいと思います。

For i = 1 To 5  '1行目から4行目までループ
    For j = 1 To 4  '1列目から4列目までループ
    
        ws2.Cells(i, j).Value = ws1.Cells(i, j).Value  'ws1のデータをws2に出力
    stop
    Next j
Next i

最後に

2重ループがちょっと難しいと思いますが、for文はこの先何度も登場する上、2重ループも多用していくのでなんとなく慣れてくると思います。特にExcelに関しては表を扱うので、この先出てくる配列と組み合わせると非常に便利な構文になります。

モバイルバージョンを終了