目次
はじめに
VBAの処理をサブルーチン(部品化されたマクロ)に分割するとコードが整理されますが、そのままだと「特定のセル範囲」や「固定の文字列」に対してしか処理を実行できません。
サブルーチンをよりパワフルで再利用可能な「万能な部品」にするために不可欠なのが、「引数(ひきすう)」です。引数を使うと、サブルーチンを呼び出す側(親マクロ)から、処理に必要な具体的なデータ(どのセル範囲を対象にするか、など)を、サブルーチン(子マクロ)に渡すことができます。
この記事では、サブルーチンに引数を渡すための基本的な構文と、そのメリットを分かりやすく解説します。
引数を持つサブルーチンへの値の渡し方
この例では、指定されたセル範囲に、指定されたテキストを書き込み、書式を設定する、再利用可能なサブルーチン FormatCell
を作成します。
完成コード
' === メインの実行マクロ ===
Sub CreateFormattedHeader()
' --- 引数を順番通りに渡す(位置引数) ---
' 第1引数にRangeオブジェクト, 第2引数に文字列を渡す
Call FormatCell(Worksheets("Sheet1").Range("B2"), "売上")
' --- 引数名を指定して渡す(キーワード引数) ---
' 順序を問わず、どの引数にどの値を渡すかを明記できる
Call FormatCell(targetText:="利益", targetRange:=Worksheets("Sheet1").Range("D2"))
End Sub
' --- 引数を受け取るサブルーチン ---
' (targetRange As Range, targetText As String) の部分で引数を定義
Private Sub FormatCell(targetRange As Range, targetText As String)
' 渡された引数を使って処理を実行
With targetRange
.Value = targetText
.Font.Bold = True
.Interior.Color = RGB(220, 230, 241) '薄い青色
End With
End Sub
コードの解説
Private Sub FormatCell(targetRange As Range, targetText As String)
これが、引数を受け取るサブルーチンの定義です。
Sub
の後の()
の中に、変数名 As データ型
の形式で、受け取りたい引数をカンマ区切りで定義します。- ここで定義された
targetRange
やtargetText
は、このFormatCell
サブルーチン内でのみ使える特別な変数(仮引数)として機能します。
Call FormatCell(Worksheets("Sheet1").Range("B2"), "売上")
これは「位置引数」を使った、最も一般的な呼び出し方です。
FormatCell
を呼び出す際に、()
の中に渡したい値を、サブルーチンの定義と同じ順番で記述します。- 1番目の
Range("B2")
がtargetRange
に、2番目の"売上"
がtargetText
に渡されます。
Call FormatCell(targetText:="利益", targetRange:=...
これは「キーワード引数」を使った呼び出し方です。
引数名:=値
の形式で、どの引数にどの値を渡すかを明示的に指定します。- キーワード引数を使うと、サブルーチンで定義された引数の順番を気にする必要がなく、コードがより読みやすくなるというメリットがあります。
引数を使うメリット
- 再利用性の劇的な向上:
FormatCell
サブルーチンは、どんなセル範囲にも、どんなテキストにも対応できる、汎用的な「書式設定ツール」になりました。 - コードの簡潔化: もし引数を使わなければ、”売上”用の書式設定マクロと”利益”用の書-式設定マクロを、別々に作る必要があったかもしれません。
- 保守性の向上: 書式設定のロジック(例えば、背景色)を変更したい場合、
FormatCell
の中だけを修正すれば、このサブルーチンを呼び出している全ての箇所に修正が反映されます。
まとめ
今回は、サブルーチンに引数を渡すことで、コードをより柔軟で再利用しやすくする方法を解説しました。
- サブルーチンを定義する際に、
Sub マクロ名(引数1 As 型, 引数2 As 型)
のように受け皿を用意する。 - 呼び出す側から、
Call マクロ名(値1, 値2)
のように具体的な値を渡す。 - キーワード引数 (
引数名:=値
) を使うと、順番を気にせず渡せてコードが読みやすくなる。
引数は、VBAプログラミングにおける最も基本的かつ重要な概念の一つです。効果的に活用することで、コードの品質を大きく向上させることができます。