- VBA 高速化・最適化 練習問題(10問)+ 解答解説
- Q1. ScreenUpdating を False にして処理速度を改善せよ
- Q2. Calculation を手動にして大量計算を高速化せよ
- Q3. 配列に読み込んで一括処理し、セルに書き戻せ
- Q4. With 構文を使ってセル書式設定を効率化せよ
- Q5. Select/Activate を使わずに直接セルを操作せよ
- Q6. Application.EnableEvents を False にしてイベントを止めて高速化せよ
- Q7. StatusBar を使って進捗を表示しつつ高速処理せよ
- Q8. Dictionary を使って重複データを削除せよ
- Q9. Union を使って複数範囲をまとめて処理せよ
- Q10. Application.DisplayAlerts を False にして確認メッセージを抑制せよ
- ✅ 総まとめ
VBA 高速化・最適化 練習問題(10問)+ 解答解説
Excel VBA は「セルを1つずつ処理する」などの書き方だと遅くなりがちです。ここでは 高速化・最適化テクニックをテーマにした演習問題を 10 問用意し、模範コードと解説を添えました。
Q1. ScreenUpdating を False にして処理速度を改善せよ
解答例
Sub SpeedUpScreen()
Application.ScreenUpdating = False
Dim i As Long
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
Application.ScreenUpdating = True
End Sub
VB解説:
画面更新を止めることで高速化。最後に True に戻すのを忘れない。
Q2. Calculation を手動にして大量計算を高速化せよ
解答例
Sub ManualCalc()
Application.Calculation = xlCalculationManual
Range("B2:B10000").Value = 1
Application.Calculation = xlCalculationAutomatic
End Sub
VB解説:
計算を止めてから大量処理 → 最後に自動計算へ戻す。
Q3. 配列に読み込んで一括処理し、セルに書き戻せ
解答例
Sub ArrayProcess()
Dim arr As Variant, i As Long
arr = Range("C2:C10000").Value
For i = 1 To UBound(arr, 1)
If IsNumeric(arr(i, 1)) Then arr(i, 1) = arr(i, 1) * 1.1
Next i
Range("C2:C10000").Value = arr
End Sub
VB解説:
セルアクセスを最小化することで爆速化。
Q4. With 構文を使ってセル書式設定を効率化せよ
解答例
Sub WithExample()
With Range("A1")
.Font.Bold = True
.Font.Color = vbBlue
.Interior.Color = vbYellow
End With
End Sub
VB解説:
同じオブジェクトを繰り返し参照する場合は With が効率的。
Q5. Select/Activate を使わずに直接セルを操作せよ
解答例
Sub NoSelect()
Range("B2").Value = "OK"
Range("B2").Font.Bold = True
End Sub
VB解説:Select や Activate は遅くなる原因。直接参照するのがベスト。
Q6. Application.EnableEvents を False にしてイベントを止めて高速化せよ
解答例
Sub DisableEvents()
Application.EnableEvents = False
Range("D2:D10000").Value = 1
Application.EnableEvents = True
End Sub
VB解説:
イベントが発火すると遅くなる。大量処理前に止める。
Q7. StatusBar を使って進捗を表示しつつ高速処理せよ
解答例
Sub ProgressBar()
Dim i As Long
For i = 1 To 10000
Cells(i, 1).Value = i
If i Mod 1000 = 0 Then Application.StatusBar = "進捗: " & i
Next i
Application.StatusBar = False
End Sub
VB解説:
進捗を表示することでユーザーに安心感を与えつつ処理。
Q8. Dictionary を使って重複データを削除せよ
解答例
Sub RemoveDuplicatesFast()
Dim arr As Variant, dict As Object, i As Long
arr = Range("A2:A1000").Value
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr, 1)
dict(arr(i, 1)) = 1
Next i
Range("C2").Resize(dict.Count, 1).Value = Application.Transpose(dict.Keys)
End Sub
VB解説:
Dictionary はキーが一意なので重複排除が高速。
Q9. Union を使って複数範囲をまとめて処理せよ
解答例
Sub UnionExample()
Dim rng As Range
Set rng = Union(Range("A1:A10"), Range("C1:C10"))
rng.Interior.Color = vbGreen
End Sub
VB解説:
複数範囲をまとめて一度に処理できる。
Q10. Application.DisplayAlerts を False にして確認メッセージを抑制せよ
解答例
Sub FastDeleteSheet()
Application.DisplayAlerts = False
Sheets("Temp").Delete
Application.DisplayAlerts = True
End Sub
VB解説:
不要な確認ダイアログを抑制して処理をスムーズに。
✅ 総まとめ
- 画面更新・計算・イベントを止める → 大量処理を高速化
- 配列処理・Dictionary → データ処理を爆速化
- With / NoSelect → コード効率化
- StatusBar / DisplayAlerts → ユーザー体験を改善しつつ最適化


