- VBA 制御構文・ロジック 練習問題(10問)+ 解答解説
- Q1. 偶数行だけ処理するコードを書け
- Q2. For Each と For i の違いを説明し、配列の偶数番目だけ処理せよ
- Q3. Do While ループで空白セルが続く間処理を繰り返せ
- Q4. Do Until ループで「値が100以上になるまで」繰り返せ
- Q5. Select Case を使って売上金額をランク分けせよ
- Q6. If 文で「セルが空白なら ‘未入力’ と表示」せよ
- Q7. For ループで逆順処理(100行目から1行目へ)せよ
- Q8. ネストした If 文で「数量が10以上かつ単価が100以上なら ‘特売’」と表示せよ
- Q9. For Each でセル範囲を処理し、10000以上なら太字にせよ
- Q10. Exit For を使って「最初に空白セルを見つけたら処理を終了」せよ
- 総まとめ
VBA 制御構文・ロジック 練習問題(10問)+ 解答解説
ここでは 中級~上級者向けの制御構文・ロジック演習を 10 問用意し、模範コードと解説を添えています。
「For」「For Each」「Do」「Select Case」「If」などを自在に使いこなす練習です。
Q1. 偶数行だけ処理するコードを書け
解答例
Sub EvenRows()
Dim i As Long
For i = 2 To 100 Step 2
Cells(i, 1).Value = "偶数行"
Next i
End Sub
VB解説:Step 2 を使うと偶数行だけをループできる。For Each では「偶数だけ」などの制御が難しいため For i が有効。
Q2. For Each と For i の違いを説明し、配列の偶数番目だけ処理せよ
解答例
Sub EvenArrayItems()
Dim arr As Variant
Dim i As Long
arr = Array("A", "B", "C", "D", "E")
For i = LBound(arr) To UBound(arr)
If i Mod 2 = 0 Then Debug.Print arr(i)
Next i
End Sub
VB解説:
For Each は「全部処理」に便利だが、インデックスを使った条件分岐は For i が必要。
Q3. Do While ループで空白セルが続く間処理を繰り返せ
解答例
Sub DoWhileBlank()
Dim r As Range
Set r = Range("A1")
Do While r.Value = ""
r.Value = "空白を埋めました"
Set r = r.Offset(1, 0)
Loop
End Sub
VB解説:
Do While は「条件が満たされている間」繰り返す。空白セルが続く限り処理する。
Q4. Do Until ループで「値が100以上になるまで」繰り返せ
解答例
Sub DoUntilExample()
Dim x As Long
x = 1
Do Until x >= 100
x = x * 2
Loop
Debug.Print "結果: " & x
End Sub
VB解説:
Do Until は「条件が成立するまで」繰り返す。ここでは 100 以上になるまで倍々にする。
Q5. Select Case を使って売上金額をランク分けせよ
解答例
Sub SalesRank()
Dim sales As Double
sales = 12000
Select Case sales
Case Is >= 10000: Debug.Print "Aランク"
Case Is >= 5000: Debug.Print "Bランク"
Case Else: Debug.Print "Cランク"
End Select
End Sub
VB解説:
Select Case は複数条件を整理して書ける。If…ElseIf より読みやすい。
Q6. If 文で「セルが空白なら ‘未入力’ と表示」せよ
解答例
Sub IfBlank()
If Range("B2").Value = "" Then
Range("B2").Value = "未入力"
End If
End Sub
VB解説:
シンプルな条件分岐。空白チェックは実務で頻出。
Q7. For ループで逆順処理(100行目から1行目へ)せよ
解答例
Sub ReverseLoop()
Dim i As Long
For i = 100 To 1 Step -1
Debug.Print Cells(i, 1).Value
Next i
End Sub
VB解説:Step -1 を使うと逆順処理が可能。For Each では逆順ができない。
Q8. ネストした If 文で「数量が10以上かつ単価が100以上なら ‘特売’」と表示せよ
解答例
Sub NestedIf()
Dim qty As Long, price As Double
qty = 12: price = 120
If qty >= 10 Then
If price >= 100 Then
Debug.Print "特売"
End If
End If
End Sub
VB解説:
複数条件を組み合わせる場合、ネストした If が有効。
Q9. For Each でセル範囲を処理し、10000以上なら太字にせよ
解答例
Sub BoldHighValues()
Dim r As Range
For Each r In Range("C2:C20")
If IsNumeric(r.Value) And r.Value >= 10000 Then
r.Font.Bold = True
End If
Next r
End Sub
VB解説:
For Each は「範囲内のすべてのセルを処理」に最適。
Q10. Exit For を使って「最初に空白セルを見つけたら処理を終了」せよ
解答例
Sub ExitForExample()
Dim i As Long
For i = 1 To 100
If Cells(i, 1).Value = "" Then
Debug.Print "最初の空白は " & i & " 行目"
Exit For
End If
Next i
End Sub
VB解説:Exit For は「条件成立時にループを抜ける」ための制御。効率的に処理を止められる。
総まとめ
- For Each → 全要素処理に便利
- For i → インデックス制御(偶数・逆順・範囲指定)が可能
- Do While / Do Until → 条件成立まで繰り返す
- Select Case → 複数条件を整理
- Exit For → 途中でループを抜ける


