Excel VBA | 中級・上級 VBA 総合セット(100問)

VBA
スポンサーリンク

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

解説:
SelectActivate は遅くなる原因。直接参照するのがベスト。


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 → ユーザー体験を改善しつつ最適化
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました