Excel VBAでプログラムを実行しようとした際に、以下のような「プロシージャが大きすぎます」というコンパイルエラーが発生することがあります。
1つのプロシージャ(Sub や Function)が 64 KB を超えた場合に発生します。
長すぎるプロシージャは、コードの可読性や保守性が低下する原因となるため、正しく分割することが重要です。
この記事では、このエラーの原因と回避するための具体的な方法を解説します。
目次
「プロシージャが大きすぎます」エラーの原因
VBAでは、1つのプロシージャのコードサイズが64 KBを超えるとコンパイルエラーが発生します。
主な原因
✅ 1つのプロシージャに大量の処理を詰め込んでいる
✅ループや条件分岐(If / Select Case)が過剰に多い
✅大量の定数データを1つのプロシージャ内に記述している
✅無駄なコードや不要な変数が多い
📌方針:「プロシージャを適切に解決する」「無駄なコードを削減する」
エラーの回避方法(プロシージャの分割)
・ 1つのプロシージャを正しく分割する
1つのプロシージャが長すぎる場合、処理ごとにSubやFunctionに分割しましょう。
【修正前:長すぎるプロシージャ】
Sub ProcessData()
Dim ws As Worksheet
Dim i As Integer
Set ws = ThisWorkbook.Sheets("Sheet1")
' データ入力
For i = 1 To 10000
ws.Cells(i, 1).Value = "データ " & i
Next i
' 書式設定
ws.Range("A1:A10000").Font.Bold = True
' 合計計算
ws.Cells(10001, 1).Formula = "=SUM(A1:A10000)"
' メッセージ表示
MsgBox "処理完了!"
End Sub
📌問題点
- 1つのプロシージャ内でデータ入力・書式設定・計算・メッセージ表示を処理している
- プロシージャが長くなりすぎ、修正やデバッグが難しい
【修正後:プロシージャを分割】
Sub ProcessData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
InputData ws
FormatCells ws
CalculateTotal ws
ShowCompletionMessage
End Sub
' データ入力処理
Sub InputData(ws As Worksheet)
Dim i As Integer
For i = 1 To 10000
ws.Cells(i, 1).Value = "データ " & i
Next i
End Sub
' 書式設定処理
Sub FormatCells(ws As Worksheet)
ws.Range("A1:A10000").Font.Bold = True
End Sub
' 合計計算処理
Sub CalculateTotal(ws As Worksheet)
ws.Cells(10001, 1).Formula = "=SUM(A1:A10000)"
End Sub
' メッセージ表示処理
Sub ShowCompletionMessage()
MsgBox "処理完了!"
End Sub
✅各処理を独立したサブに保守することで、コードの可読性・保守性が向上!
✅変更やデバッグがしやすくなり、エラー回避にもつながる!
・大きなループを関数に選択
大量のデータを処理するループを関数として行うことで、プロシージャのサイズを重視できます。
【修正前:ループが長すぎる】
Sub ProcessData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim i As Integer
For i = 1 To 10000
ws.Cells(i, 1).Value = "データ " & i
Next i
End Sub
【修正後:ループを関数に選択】
Sub ProcessData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
FillData ws, 1, 10000
End Sub
Sub FillData(ws As Worksheet, startRow As Integer, endRow As Integer)
Dim i As Integer
For i = startRow To endRow
ws.Cells(i, 1).Value = "データ " & i
Next i
End Sub
✅データの範囲を指定して処理できるため、汎用性が向上!
✅他のプロシージャでもFillData
を再利用可能!
【VBA】「プロシージャが大きすぎます」エラーの回避方法(プロシージャの分割)
・長い条件分岐(If や Select Case)を整理
条件分岐が多すぎると、コードが肥大化します。
複雑な条件分岐は、個別のサブに別途切り捨てることで、コードを整理できます。
【修正前:長いの文場合】
Sub ProcessData(value As Integer)
If value = 1 Then
MsgBox "処理Aを実行"
ElseIf value = 2 Then
MsgBox "処理Bを実行"
ElseIf value = 3 Then
MsgBox "処理Cを実行"
Else
MsgBox "無効な値です"
End If
End Sub
【修正後:Select Caseに整理】
Sub ProcessData(value As Integer)
Select Case value
Case 1: ExecuteA
Case 2: ExecuteB
Case 3: ExecuteC
Case Else: MsgBox "無効な値です"
End Select
End Sub
Sub ExecuteA()
MsgBox "処理Aを実行"
End Sub
Sub ExecuteB()
MsgBox "処理Bを実行"
End Sub
Sub ExecuteC()
MsgBox "処理Cを実行"
End Sub
✅各処理を独立したサブに決めることで、コードがシンプルに!
✅新しい処理を追加する際も、影響範囲が最小限に!
まとめ
回避策 | 方法 | メリット |
---|---|---|
処理ごとに分割 | Sub ProcessData → Sub InputData, Sub FormatCells | コードが整理され、可読性が向上 |
ループを関数に選択 | Sub FillData(ws, startRow, endRow) | ループ処理を再利用可能 |
長い条件分岐を整理 | Select Case を使い、処理を独立したサブに選択 | メンテナンスしやすくなる |
💡 VBA の「プロシージャが大きすぎます」エラーを回避するためには、
✅ 1つのプロシージャに1つの役割を持たせる
✅ループや分割を分割し、シンプルにする
✅汎用的な処理は関数にする