Excel VBAで「複数の引数」を渡すことを、初心者向けにやさしく解説
はじめてのVBAって、用語も書き方も固くてとっつきにくいですよね。ここでは「プロシージャ(Sub)に複数の引数を渡す」ことを、手を動かしながら理解できるように、例題でかみ砕いて説明します。
基本の考え方
- プロシージャ(Sub)とは:
何かの処理をまとめた“命令のかたまり”です。呼び出すと、その中身が実行されます。 - 引数(ひきすう)とは:
処理に必要な“材料”です。文字、数、セル範囲などを、カンマで区切って複数渡せます。 - 呼び出し方(複数引数):
Call プロシージャ名(値1, 値2)でも、プロシージャ名 値1, 値2でもOK(Callは省略可)。 - 受け取る側の書き方:
Sub 名前(ByVal x As String, ByVal y As Integer)のように、何を受け取るか(型)を宣言します。 - ByVal と ByRef の違い:
ByVal: 値のコピーを渡す(中で変更しても元は変わらない)。
ByRef: そのものを渡す(中で変更すると元の変数が変わる)。
例題1:文字列を指定回数くっつけてセルに書く
Sub RunExample1()
Dim msg As String
msg = "こんにちは"
'「文字列」と「回数」を渡す
SetCellRepeat msg, 3
End Sub
Sub SetCellRepeat(ByVal text As String, ByVal times As Integer)
Dim result As String
Dim i As Integer
For i = 1 To times
result = result & text
Next i
Range("A1").Value = result
End Sub
VB- ポイント:
text(文字列)とtimes(回数)という2つの引数を受け取っています。RunExample1から呼び出すと、A1に「こんにちはこんにちはこんにちは」と表示されます。 - 練習アイデア:
Label:Range("B2").Valueに書くように変更
Label:timesを 5 にしてみる
Label:textを「★」にして、見た目の変化を確認
例題2:セル範囲とルールを渡して合計する(Optionalで柔軟に)
Sub RunExample2()
'範囲とルール("Even" or "Odd")を渡す。ルール省略可。
Dim totalEven As Double
totalEven = SumRangeWithRule(Range("A1:A10"), "Even")
Range("C1").Value = totalEven
Dim totalAll As Double
totalAll = SumRangeWithRule(Range("A1:A10")) 'ルール省略 → 全部合計
Range("C2").Value = totalAll
End Sub
Function SumRangeWithRule(ByVal rng As Range, Optional ByVal rule As String = "")
Dim cell As Range
Dim sum As Double
For Each cell In rng
If IsNumeric(cell.Value) Then
If rule = "Even" And cell.Value Mod 2 = 0 Then
sum = sum + cell.Value
ElseIf rule = "Odd" And cell.Value Mod 2 <> 0 Then
sum = sum + cell.Value
ElseIf rule = "" Then
sum = sum + cell.Value
End If
End If
Next cell
SumRangeWithRule = sum
End Function
VB- ポイント:
Optional(省略可能)引数を使うと、呼び出し側の負担が減ります。渡さなければ既定値(ここでは空文字)で動きます。 - 練習アイデア:
Label: ルールに"Odd"を渡して奇数合計にする
Label: 範囲をB1:B20に変えてみる
Label: 文字列が混ざるときはIsNumericが守ってくれることを確認
例題3:ByRefで“渡した変数が変わる”ことを体感
Sub RunExample3()
Dim title As String
title = "レポート"
'ByRefで渡すと中で変更された内容が戻ってくる
AddDateSuffix title
Range("A3").Value = title '例: 「レポート_2025-11-19」のように変化
End Sub
Sub AddDateSuffix(ByRef name As String)
name = name & "_" & Format(Date, "yyyy-mm-dd")
End Sub
VB- ポイント:
ByRefで渡すと、プロシージャ内の変更が呼び出し元の変数に反映されます。
「中で編集して“返す”」イメージが掴めます。 - 練習アイデア:
Label: ByVal に変えて、元のtitleが変わらないことを確認
Label: 日付フォーマットを"yyyymmdd"に変更
例題4:名前付き引数で“順番のミス”を避ける
Sub RunExample4()
'順番を気にせず安全に渡す(:= で「名前」を指定)
DrawLabel text:="完了", column:=2, row:=5
DrawLabel row:=6, column:=1, text:="未完了" '並びを変えてもOK
End Sub
Sub DrawLabel(ByVal text As String, ByVal column As Integer, ByVal row As Integer)
Cells(row, column).Value = text
End Sub
VB- ポイント:
名前付き引数(:=)を使うと、渡す値の意味が明確になり、順番違いによるバグを防げます。
つまずきやすいポイントと対処
- 型が合わない:
例:Integerに文字列を渡すとエラー。合う型にするか、渡す前に変換(CInt,CDbl,CStrなど)を検討。 - 引数の数が合わない:
受け取る側の定義に合わせる。省略可能にしたいならOptionalと既定値を付ける。 - 順番間違い:
名前付き引数を使うか、引数の宣言順と呼び出しの順をそろえる。 - 範囲型(Range)を渡す時:
シートが意図通りか注意。Worksheets("Sheet1").Range("A1:A10")のように明示すると安全。
手を動かすためのミニ練習
- 練習1:文字+記号+回数
「文字列」「区切り記号(例:-)」「回数」を引数で渡して、A1に「A-A-A-A」のように出力するSubを作る。 - 練習2:メッセージと色
「メッセージ」と「色番号(例:3=赤)」を渡して、指定セルに書いて色を変えるSubを作る。
ヒント:Range("A1").Interior.ColorIndex = 3 - 練習3:開始セル・行数・列数
開始セル(Range)、行数、列数を渡して、指定の範囲をクリアするSubを作る。
ヒント:Range(startCell, startCell.Offset(rows-1, cols-1)).ClearContents
まとめ(スッと腹落ちするポイント)
- 複数の材料(引数)を渡して、1つの処理(Sub)にまとめると、コードが“使い回し”できる。
- ByVal/ByRef、Optional、名前付き引数を覚えると、ミスが減って“思い通りに動く”。
- 迷ったら小さく作って、A1に出力して確認—失敗は全部学びになる。
