Excel VBA | 「複数の引数」を渡す

VBA
スポンサーリンク

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に出力して確認—失敗は全部学びになる。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました