- 1. 基本の考え方(イメージ)
- 2. 例題 1:1〜10 の合計(基本)
- 3. Step を使う例:奇数だけ(1,3,5…)
- 4. 逆向きループ(10→1)/負の Step
- 5. 実践例:シートの1行目〜10行目の A列値を足す
- 6. ネストした For(多次元的に繰り返す) — 乗算表を作る
- 7. Exit For の使い方(途中終了)
- 8. 注意点・よくあるミス
- 9. For Each と For i = ... の違い(簡単)
- 10. 練習問題(初心者向け 8問)+模範解答
- 問1:1〜20 の奇数だけを Debug.Print するマクロを書きなさい。
- 問2:1〜50 の偶数の合計を求めて MsgBox で表示しなさい。
- 問3:A1〜A10 のセルに入っている数値の平均を計算してセル B1 に書き出しなさい(空白は無視)。
- 問4:Sheet の 1行目に「1〜12」の月名を横に並べる(1行目の1列目から)。
- 問5:2重ループで 1〜5 の掛け算表(5×5)をセル A1:E5 に作成しなさい。
- 問6:1〜100 の中で最初に 37 が見つかったらループを抜けるデモ(Exit For を使う)。
- 問7:A列に文字列が入っている最初の空白行のインデックスを取得して MsgBox で表示しなさい。
- 問8:For Each を使って選択範囲内のセルの文字列を左トリム(前後の空白を削る)して戻しなさい。
- 11. 追加のコツ(上達を早める小ワザ)
1. 基本の考え方(イメージ)
For…Next は「カウンタ変数」が初期値から最終値まで一定の増分(=Step)で変わるたびに、ブロック内の処理を繰り返す構文です。
For カウンタ = 初期値 To 最終値 [Step 増分]
繰り返したい処理
Next [カウンタ]
VB- カウンタ:繰り返しの回数を数える変数(例:
i) - 初期値 → 最終値:カウンタがこの範囲を移動
- Step:省略すると
1。負の値も可(逆向きループ)
2. 例題 1:1〜10 の合計(基本)
Sub Example1_Sum1to10()
Dim i As Long
Dim total As Long
total = 0
For i = 1 To 10
total = total + i
Debug.Print "i=" & i & " total=" & total
Next i
MsgBox "合計は " & total
End Sub
VB出力(イメージ — Immediate ウィンドウの Debug.Print):
i=1 total=1
i=2 total=3
...
i=10 total=55
解説:i が 1→10 まで増え、total に順に加算される。最後に合計 55 を表示。
3. Step を使う例:奇数だけ(1,3,5…)
Sub Example2_Step()
Dim i As Long
For i = 1 To 9 Step 2
Debug.Print i
Next i
End Sub
VB出力:
1
3
5
7
9
解説:Step 2 によって i が 2ずつ増える。
4. 逆向きループ(10→1)/負の Step
Sub Example3_Reverse()
Dim i As Long
For i = 10 To 1 Step -1
Debug.Print i
Next i
End Sub
VB出力: 10 9 8 ... 1
ポイント:初期値 が 最終値 より大きいときは Step を負にする(逆に、負の Step で初期値 < 最終値だとループは1回も回らない)。
5. 実践例:シートの1行目〜10行目の A列値を足す
Sub Example4_SumColumnA()
Dim i As Long
Dim total As Double
total = 0
For i = 1 To 10
total = total + NzToZero(Cells(i, "A").Value)
Next i
MsgBox "A1〜A10 の合計 = " & total
End Sub
' セルが空白だったら 0 を返す簡易関数
Function NzToZero(val As Variant) As Double
If IsNumeric(val) Then
NzToZero = val
Else
NzToZero = 0
End If
End Function
VB解説:実際のシートの値を処理する典型的な使い方。セル参照は Cells(行, 列) で行う。
6. ネストした For(多次元的に繰り返す) — 乗算表を作る
Sub Example5_MultiplicationTable()
Dim r As Long, c As Long
For r = 1 To 9
For c = 1 To 9
Cells(r, c).Value = r * c
Next c
Next r
MsgBox "1〜9 の乗算表をシートに作成しました。"
End Sub
VBイメージ(シート):
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
...
9 18 ... 81
解説:外側の For r が行、内側の For c が列を処理する。ネスト回数は必要に応じて増やせるが、深すぎると複雑になる。
7. Exit For の使い方(途中終了)
Sub Example6_ExitFor()
Dim i As Long
For i = 1 To 100
If i = 7 Then
MsgBox "7 を見つけたのでループを抜けます。"
Exit For
End If
Next i
End Sub
VB解説:条件が満たされたら早めにループを抜ける。パフォーマンスの面や条件発見時に有効。
8. 注意点・よくあるミス
- 初期化忘れ:合計用変数を
0に初期化しないと前の値が残る。Option Explicitを使って宣言漏れを防ぐ。 - Step の符号:逆順にするなら
Step -1のように負にする。正の Step で初期値 > 最終値だと一度も実行されない。 - カウンタの型:ループ回数が大きいと
Integerは溢れる(上限 32767)。Longを推奨。 - 重い処理は注意:セルを毎回読む/書く重い処理は
Application.ScreenUpdating = False等で高速化を検討。 - For Each と混同しない:配列やコレクションを順に巡るときは
For Eachが便利(後述)。
9. For Each と For i = ... の違い(簡単)
For i = 1 To n:カウンタで「何回」繰り返すかを指定。インデックスで参照する処理向き。For Each item In Collection:配列やRange内の各要素に対して使う(要素自体が欲しいときに便利)。
例:選択範囲のセルを順に処理
Sub Example7_ForEachRange()
Dim cell As Range
For Each cell In Selection
If IsNumeric(cell.Value) Then
cell.Value = cell.Value * 2
End If
Next cell
End Sub
VB10. 練習問題(初心者向け 8問)+模範解答
必要ならさらに問題を増やします。まず 8問で練習してみましょう。
問1:1〜20 の奇数だけを Debug.Print するマクロを書きなさい。
解答(コード):
Sub Q1()
Dim i As Long
For i = 1 To 20 Step 2
Debug.Print i
Next i
End Sub
VB問2:1〜50 の偶数の合計を求めて MsgBox で表示しなさい。
解答:
Sub Q2()
Dim i As Long, s As Long
s = 0
For i = 2 To 50 Step 2
s = s + i
Next i
MsgBox "合計 = " & s
End Sub
VB問3:A1〜A10 のセルに入っている数値の平均を計算してセル B1 に書き出しなさい(空白は無視)。
解答:
Sub Q3()
Dim i As Long, cnt As Long
Dim sum As Double
sum = 0: cnt = 0
For i = 1 To 10
If IsNumeric(Cells(i, "A").Value) Then
sum = sum + Cells(i, "A").Value
cnt = cnt + 1
End If
Next i
If cnt > 0 Then
Cells(1, "B").Value = sum / cnt
Else
Cells(1, "B").Value = "データなし"
End If
End Sub
VB問4:Sheet の 1行目に「1〜12」の月名を横に並べる(1行目の1列目から)。
解答:
Sub Q4()
Dim i As Long
For i = 1 To 12
Cells(1, i).Value = i & "月"
Next i
End Sub
VB問5:2重ループで 1〜5 の掛け算表(5×5)をセル A1:E5 に作成しなさい。
解答(上で示した乗算表の縮小版):
Sub Q5()
Dim r As Long, c As Long
For r = 1 To 5
For c = 1 To 5
Cells(r, c).Value = r * c
Next c
Next r
End Sub
VB問6:1〜100 の中で最初に 37 が見つかったらループを抜けるデモ(Exit For を使う)。
解答:
Sub Q6()
Dim i As Long
For i = 1 To 100
If i = 37 Then
Debug.Print "見つかった: " & i
Exit For
End If
Next i
End Sub
VB問7:A列に文字列が入っている最初の空白行のインデックスを取得して MsgBox で表示しなさい。
解答:
Sub Q7()
Dim i As Long
For i = 1 To 1000
If Trim(Cells(i, "A").Value) = "" Then
MsgBox "最初の空白行は " & i
Exit For
End If
Next i
End Sub
VB問8:For Each を使って選択範囲内のセルの文字列を左トリム(前後の空白を削る)して戻しなさい。
解答:
Sub Q8()
Dim c As Range
For Each c In Selection
If Not IsEmpty(c) Then c.Value = Trim(c.Value)
Next c
End Sub
VB11. 追加のコツ(上達を早める小ワザ)
Option Explicitをモジュールの先頭に書いて変数宣言を必須にする。スペルミスのバグを激減。- 長いループでは
Application.ScreenUpdating = False、処理完了後にTrueに戻すと速くなる。 - 配列処理や
Findを併用すればセルのアクセス回数を減らして高速化できる。 - デバッグは
Debug.Printを多用して、ループ中の変数の変化を確認する。
