VBAで自動化 VBAテクニック集 VBA一覧 呼び出し処理 文法・構文

【VBA】「プロシージャが大きすぎます」エラーの原因と解決方法

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

各処理を独立したサブに保守することで、コードの可読性・保守性が向上!
変更やデバッグがしやすくなり、エラー回避にもつながる!

【VBA】プロシージャのサイズを適切に管理する方法

・大きなループを関数に選択

大量のデータを処理するループを関数として行うことで、プロシージャのサイズを重視できます

【修正前:ループが長すぎる】

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

各処理を独立したサブに決めることで、コードがシンプルに!
新しい処理を追加する際も、影響範囲が最小限に!

【VBA】Select Case文での複数処理の方法

まとめ

回避策方法メリット
処理ごとに分割Sub ProcessData → Sub InputData, Sub FormatCellsコードが整理され、可読性が向上
ループを関数に選択Sub FillData(ws, startRow, endRow)ループ処理を再利用可能
長い条件分岐を整理Select Caseを使い、処理を独立したサブに選択メンテナンスしやすくなる

💡 VBA の「プロシージャが大きすぎます」エラーを回避するためには、
1つのプロシージャに1つの役割を持たせる
ループや分割を分割し、シンプルにする
汎用的な処理は関数にする

-VBAで自動化, VBAテクニック集, VBA一覧, 呼び出し処理, 文法・構文