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

【VBA】プロシージャを分割するメリットと実践方法

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に任せる

【VBA】プロシージャの分ける基準

・ メンテナンス性が向上する

修正や機能追加が簡単になり、バグの影響範囲を抑えられるというメリットがあります。

【分割する場合】

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コードの品質が向上し、より保守性の高いプログラムが作成できます!

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