Excel VBA | 「Subプロシージャ」と「Functionプロシージャ」の違い

VBA
スポンサーリンク

ここからは少しステップアップして、「引数を省略した場合」「複数の戻り値を返す方法」について、初心者向けにかみ砕いて説明します。


引数を省略した場合

1. 引数に「Optional」を付ける

  • VBAでは、引数を省略可能にできます。
  • 書き方:Optional 引数名 As 型 = 既定値
  • 省略された場合は「既定値」が使われます。

例:

Sub Greet(Optional name As String = "ゲスト")
    MsgBox "こんにちは、" & name & "さん!"
End Sub

Sub Test()
    Greet "太郎"   ' → 「こんにちは、太郎さん!」
    Greet         ' → 「こんにちは、ゲストさん!」
End Sub
VB

👉 「Optional」を使うと、呼び出すときに引数を渡さなくても動きます。


2. IsMissing関数(Variant型専用)

  • OptionalVariant型を使うと、IsMissingで「渡されたかどうか」を判定できます。

例:

Sub ShowMessage(Optional msg As Variant)
    If IsMissing(msg) Then
        MsgBox "メッセージがありません"
    Else
        MsgBox msg
    End If
End Sub
VB

複数の戻り値を返す方法

VBAのFunctionは基本的に「1つの値」しか返せません。
でも工夫すれば複数の結果を返せます。


1. 配列を戻り値にする

  • Functionの戻り値を「配列」にすれば、複数の値をまとめて返せます。

例:

Function GetScores() As Variant
    Dim scores(1 To 3) As Integer
    scores(1) = 80
    scores(2) = 90
    scores(3) = 75
    GetScores = scores
End Function

Sub Test()
    Dim result As Variant
    result = GetScores()
    MsgBox "1人目の点数は " & result(1)
End Sub
VB

👉 配列を返すことで「まとめて複数の値」を扱えます。


2. ByRefで値を返す

  • 引数をByRef(参照渡し)にすると、呼び出し元の変数に結果を書き込めます。
  • これで「戻り値以外にも複数の値」を返せます。

例:

Sub Calc(ByVal a As Integer, ByVal b As Integer, ByRef sum As Integer, ByRef diff As Integer)
    sum = a + b
    diff = a - b
End Sub

Sub Test()
    Dim s As Integer, d As Integer
    Calc 10, 3, s, d
    MsgBox "合計: " & s & " 差: " & d
End Sub
VB

👉 Calcは戻り値を返していませんが、sumdiffに結果を書き込んでいます。
つまり「複数の戻り値」を返せたことになります。


まとめ

  • 引数を省略したいときOptionalを使う(既定値やIsMissingで判定)
  • 複数の戻り値を返したいとき
    • 配列を戻り値にする
    • ByRefで複数の変数に結果を書き込む

💡 初心者へのおすすめ練習は「同じ処理を配列版とByRef版で書いてみる」ことです。違いを体感すると理解が深まります。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました