【VBA】処理ごとの分割と役割の明確化|可読性・保守性を高める方法

VBAを使った開発では、処理を適切に分割して役割をはっきりさせることが、可読性と保守性を高めるうえで非常に重要です。

1つのプロシージャにすべてを詰め込むと、修正しづらく、バグが起きやすくなり、他の人が読んだときに理解しづらくなってしまいます。

この記事では、実務でもすぐ使える「処理の分割方法」と「役割の整理の考え方」をわかりやすく解説します。


1. 分割の目的は「何をしているか」を明確にすること

プロシージャ分割の目的はシンプルです。

  • どこで何をしているのかがわかる
  • 修正や追加がしやすい
  • 再利用できる
  • バグが局所化される

逆に、すべてを1つのSubに書くと…

Sub BadExample()
    'データ取得
    '加工処理
    'メッセージ表示
    'シート更新
    'ファイル保存
    'ログ出力
End Sub

処理が混在し、読み手が迷子になります。


2. 処理は「目的ごと」に分割する

基本は 「役割の単位」で分ける」 ことです。

例:レポート作成処理を考えると…

  • データ取得
  • 計算・加工
  • シートへの出力
  • ファイル保存
  • メッセージ表示

これらをすべて1つのSubに入れるのではなく、それぞれ独立したプロシージャに分けます。


3. 役割ごとにプロシージャを分けた例

▼ 改善した例

Sub MakeReport()
    Dim data As Variant

    data = GetSourceData()    '① データを取得
    data = FormatData(data)   '② 加工
    WriteToSheet data         '③ シートへ出力
    SaveReportFile            '④ ファイル保存
    ShowCompletedMessage      '⑤ 完了メッセージ
End Sub

上記のように、メイン処理は流れを示すだけにするのがベスト。

下記はそれぞれの処理のイメージです。

Function GetSourceData() As Variant
    'データ取得処理
End Function

Function FormatData(ByVal data As Variant) As Variant
    '加工処理
End Function

Sub WriteToSheet(ByVal data As Variant)
    'シートへ書き込み
End Sub

Sub SaveReportFile()
    'ファイル保存
End Sub

Sub ShowCompletedMessage()
    MsgBox "レポートの作成が完了しました。"
End Sub

● この構造のメリット

  • 役割が明確になる
  • 必要な処理だけ別の場面で流用できる
  • バグが起きても原因箇所を特定しやすい
  • 処理の順番が視覚的にわかりやすい

4. プロシージャは「粒度」が重要

粒度(分け方)が細かすぎると逆に読みにくいですが、
大きすぎると意味が分からなくなります。

● 推奨粒度の目安

  • 5〜30行程度
  • 1つの役割に集中した処理
  • 他の用途でも使えるなら分割する

● NG例

  • 1つのSub が200行
  • 1つのFunctionで取得・加工・出力を全部やる
  • データ取得+メッセージ表示が同じプロシージャ内

5. 実務的な役割分割のカテゴリ例

実務では次のような分類が効果的です。

役割内容例
I/O層(入力・出力)シート読込、ファイル読込、DBアクセス
ロジック層(計算・加工)集計、判定、文字列加工、整形
UI層(ユーザー操作)MsgBox、フォーム、画面更新
共通処理共通関数、定数、ログ処理

このように階層を意識すると、構造が整理されたコードになります。


6. 役割を明確化するまとめ

  • プロシージャは「目的」ごとに分割する
  • メインのSubは処理の「流れ」だけ書く
  • 各プロシージャは役割に集中させる
  • 粒度が大きすぎても小さすぎてもNG
  • 実務では I/O・ロジック・UI の3層で分けると整理しやすい

コードが読みやすく、修正しやすく、再利用しやすい形になります。

コメント

タイトルとURLをコピーしました