Excel VBAでコードを書く際、1つのプロシージャが長くなりすぎると、可読性や保守性が低下します。
正しくプロシージャを分割することで、コードの整理ができ、修正やデバッグが容易になるという特長があります。
この記事では、プロシージャを分割する具体的なメリットと、その実践方法について解説します。
プロシージャとは?
プロシージャとは、VBAで実行する一連の処理をまとめたコードブロックです。
VBA ではSub(サブプロシージャ)とFunction(関数)を使って処理を定義できます。【VBA】同じ処理を効率的に呼び出す方法(関数・Sub の活用)
【基本的な手順】
Sub ShowMessage()
MsgBox "こんにちは、VBA!"
End Sub
✔Sub ShowMessage()
はサブプロシージャ(手続き)で、実行するとメッセージボックスを表示します。
プロシージャを分割するメリット
・コードの可読性が向上する
長いコードは何をしているのか把握するのが大変で、処理ごとに分割すると可読性が向上します。
【分割が必要な場合】
Sub ProcessData()
Dim ws As Worksheet
Dim i As Integer
' シート設定
Set ws = ThisWorkbook.Sheets("Sheet1")
' データ入力
For i = 1 To 10
ws.Cells(i, 1).Value = "データ " & i
Next i
' 合計計算
ws.Cells(11, 1).Formula = "=SUM(A1:A10)"
' メッセージ表示
MsgBox "処理完了!"
End Sub
📌問題点
- 1つのプロシージャに複数の処理(データ入力、計算、表示)が完了
- コードが長くなると、どこを修正すればいいのかわかりにくい
【適切に分割する】
Sub ProcessData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
InputData ws
CalculateTotal ws
ShowCompletionMessage
End Sub
' データ入力
Sub InputData(ws As Worksheet)
Dim i As Integer
For i = 1 To 10
ws.Cells(i, 1).Value = "データ " & i
Next i
End Sub
' 合計計算
Sub CalculateTotal(ws As Worksheet)
ws.Cells(11, 1).Formula = "=SUM(A1:A10)"
End Sub
' メッセージ表示
Sub ShowCompletionMessage()
MsgBox "処理完了!"
End Sub
✅処理ごとに分割すると、「何をしているのか」が一目でわかる
✅ProcessData
は処理の流れだけを管理し、詳細な処理は他のSubに任せる
・ メンテナンス性が向上する
修正や機能追加が簡単になり、バグの影響範囲を抑えられるというメリットがあります。
【分割する場合】
Sub ProcessData()
Dim ws As Worksheet
Dim i As Integer
Set ws = ThisWorkbook.Sheets("Sheet1")
' データ入力
For i = 1 To 10
ws.Cells(i, 1).Value = "データ " & i
Next i
' 合計計算(ここを変更したい)
ws.Cells(11, 1).Formula = "=SUM(A1:A10)"
' メッセージ表示
MsgBox "処理完了!"
End Sub
📌問題点
- 合計計算の処理を変更する場合、プロシージャ全体を見直す必要があります。
- 修正箇所が他の処理と混ざっているため、ミスを招きやすい。
【適切に分割する】
Sub ProcessData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
InputData ws
CalculateTotal ws ' ← ここだけ修正すればOK!
ShowCompletionMessage
End Sub
Sub CalculateTotal(ws As Worksheet)
' 計算方法を変更(変更が容易)
ws.Cells(11, 1).Formula = "=AVERAGE(A1:A10)"
End Sub
✅合計計算のロジックを変更するだけCalculateTotal
なら修正すればOK
・ コードの再利用性が向上する
分割したプロシージャは、他の場所でも使い捨てることが可能になります。
【共通処理をサブにする】
' セルに値をセットする汎用Sub
Sub SetCellValue(ws As Worksheet, cellAddress As String, value As Variant)
ws.Range(cellAddress).Value = value
End Sub
Sub ProcessReport()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Report")
' 共通の処理を再利用
SetCellValue ws, "A1", "レポート日付"
SetCellValue ws, "A2", Date
SetCellValue ws, "A3", "売上合計"
End Sub
Sub ProcessSummary()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Summary")
' 同じ処理を使い回し
SetCellValue ws, "B1", "サマリー作成日"
SetCellValue ws, "B2", Date
End Sub
✅同じ処理をSetCellValue
定義し、複数のプロシージャで再利用可能!
✅コードの重複を削減し、保守が楽になる。
・デバッグが簡単になる
長いコードでは、エラーが発生した際に原因を特定するのは難しいですが、プロシージャを分割するとエラー箇所を特定しやすくなります。
Sub DebugExample()
' ステップ実行しやすい
Step1
Step2
Step3
End Sub
Sub Step1()
' エラーの可能性がある処理
MsgBox 1 / 0 ' ゼロ除算エラー
End Sub
Sub Step2()
MsgBox "ステップ2"
End Sub
Sub Step3()
MsgBox "ステップ3"
End Sub
📌問題発生時、どのステップでエラーが起きたのかすぐに特定できる!
まとめ
メリット | 説明 |
---|---|
可読性の向上 | コードが整理され、処理の流れがわかりやすくなる |
メンテナンス性の向上 | 修正時の影響範囲を極力抑えられる |
再利用 | 汎用的なプロシージャを作成し、使い回せる |
デバック | エラーが発生したときの原因を特定しやすい |
プロシージャを正しく分割することで、VBAコードの品質が向上し、より保守性の高いプログラムが作成できます!