【VBA】処理をサブルーチン化(部品化)してコードを整理する方法

目次

はじめに

VBAでマクロを作成していると、一つのプロシージャの中に何十行、何百行とコードが連なり、「どこで何をやっているのか分からない…」と、巨大な「スパゲッティコード」になってしまうことがあります。このようなコードは、後から修正したり、他の人が読んだりするのが非常に困難です。

この問題を解決する最も効果的な方法が、「サブルーチン化」です。一連の処理を、意味のあるかたまりごとに小さな独立したマクロ(サブルーチン)に分割し、メインのマクロからそれらを順番に呼び出すことで、コード全体の見通しを劇的に改善できます。

この記事では、VBAの処理をサブルーチンに分割し、Call ステートメントで呼び出す、プログラム構造化の基本的なテクニックを解説します。


処理をサブルーチン化するVBAサンプルコード

この例では、「レポートを作成する」という一連の処理を、以下の3つのサブルーチンに分割します。

  1. FormatReportHeader: ヘッダー(見出し)の書式を設定する。
  2. PopulateReportData: レポートのデータを書き込む。
  3. ApplyFinalTouches: 最終的な仕上げ(罫線など)を適用する。

そして、これらのサブルーチンを順番に呼び出す、メインの実行マクロ CreateReport を作成します。

完成コード

' === メインの実行マクロ ===
Sub CreateReport()
    ' 各サブルーチンを順番に呼び出す
    Call FormatReportHeader
    Call PopulateReportData
    Call ApplyFinalTouches
    
    MsgBox "レポートの作成が完了しました。", vbInformation
End Sub


' --- 以下、サブルーチン(部品化されたマクロ) ---

' Privateキーワードで、このモジュール内からのみ呼び出せるようにする
Private Sub FormatReportHeader()
    ' ヘッダーの書式設定
    With Worksheets("Sheet1").Range("B2")
        .Value = "月次売上レポート"
        .Font.Bold = True
        .Font.Size = 16
    End With
End Sub

Private Sub PopulateReportData()
    ' データの書き込み
    Worksheets("Sheet1").Range("B4").Value = "売上"
    Worksheets("Sheet1").Range("C4").Value = 150000
End Sub

Private Sub ApplyFinalTouches()
    ' 最終的な書式設定(罫線)
    Worksheets("Sheet1").Range("B2:C4").Borders.LineStyle = xlContinuous
End Sub

コードの解説

Sub CreateReport()

これが、ユーザーが最初に実行するメインの処理(親マクロ)です。このマクロの役割は、具体的な処理を行うことではなく、どのサブルーチンを、どの順番で実行するかを管理・制御することにあります。コードが処理の「目次」のようになり、全体の流れが非常に分かりやすくなります。

Call FormatReportHeader

Call は、他のプロシージャ(この場合は FormatReportHeader というサブルーチン)を呼び出すためのステートメントです(Call は省略可能ですが、呼び出しであることが明確になるため、記述することが推奨されます)。

Private Sub ...

サブルーチンの宣言に Private キーワードを付けているのがポイントです。

  • Public Sub (または単に Sub): ブック内のどのモジュールからでも呼び出せる、公開されたマクロ。
  • Private Sub: そのコードが書かれているモジュール内からのみ呼び出せる、非公開のマクロ。

サブルーチンは、あくまでメインマクロの「部品」であり、ユーザーが直接実行するものではないため、Private に設定しておくことで、Excelの「マクロ」ダイアログの一覧に表示されなくなり、誤操作を防ぐことができます。


サブルーチン化のメリット

  • 可読性の向上: コードが「見出し作成」「データ入力」といった意味のある単位で分割されるため、目的の処理がどこに書かれているかを見つけやすくなります。
  • 保守性の向上: 例えば、ヘッダーの書式だけを変更したい場合、FormatReportHeader の中だけを修正すればよく、他の部分への影響を心配する必要がありません。
  • 再利用性の向上: FormatReportHeader のような部品は、他のレポート作成マクロからも再利用できる可能性があります。

まとめ

今回は、VBAの処理をサブルーチンに分割して、コードの構造を整理する方法を解説しました。

  • 一連の処理を、意味のある単位で小さな Private Sub に分割する。
  • メインとなる Public Sub から、Call ステートメントでそれらを順番に呼び出す。

最初は少し面倒に感じるかもしれませんが、この「部品化」の考え方を身につけることは、複雑な処理を扱う、より高度なマクロ開発への第一歩となります。ぜひ、ご自身のコードのリファクタリング(改善)に役立ててみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次