引数とは

SubプロシージャやFunctionプロシージャはパラメタータを渡すことができ、このパラメータのことを引数と呼びます。

引数を使うことで、呼び出し元から値を受け取ることができるようになりますので、場面に応じた動作をするプロシージャを作成することができます。

引数を受け取る Subプロシージャの書式を以下に示します。

カンマで区切ることで複数の引数を取ることができます。

Sub プロシージャ名(変数名 As データ型 [, 変数名 As データ型 ])
  '処理
End Sub

以下は、showSquareというSubプロシージャの作成例です。

showSquareは、縦と横の2つ引数を受け取って四角形の面積を計算して表示します。

    Option Explicit

Sub showSquare(tate As Integer, yoko As Integer)
  Dim area As Integer

  '四角形の面積を計算
  area = tate * yoko

  '面積を表示
  MsgBox area
End Sub


Subプロシージャの呼び出し

引数のあるプロシージャは以下の書式で呼び出します。

Subプロシージャ名 値1 [,値2, ... ,値n]

例えば、CallSubというプロシージャから、先ほど作成したshowSquare呼び出すには以下のようにします。

    Option Explicit
Sub CallSub()

    '3×4を計算して表示する
    showSquare 3, 4
    
End Sub


値渡しと参照渡し

引数に値を渡す方法は、値渡し参照渡しの2種類があります。

値渡しは、呼び出し元で渡した値をプロシージャ内で変更しても、呼び出し元の値は変更されないというものです。

値渡しにしたい場合は、プロシージャの引数にByValキーワードを付けます。

以下に書式を示します。

Sub プロシージャ名(ByVal 変数名 As データ型 [, ByVal 変数名 As データ型 ])
  '処理
End Sub

以下に値渡しの例を示します。

Subプロシージャ sample1 は 引数xを値渡しで受け取ることができます。

sample1 の引数xは、どんな値を受け取ったとしても5で上書きをします。

しかし、このsample1 に値を渡して書き換えられたとしても、呼び出し元の値は変わることはありません。

Option Explicit

Sub sample1(ByVal x As Integer)

    '引数でどんな値を受け取っても5で上書きする
    x = 5

End Sub

Sub callProc()
    Dim x As Integer
    
    x = 3
    
    'sample1 に 3という値が入ったxを渡す
    sample1 x
    
    '3が表示される
    MsgBox x
    
End Sub


続いて参照渡しですが、呼び出し元で渡した値をプロシージャ内で変更すると、呼び出し元の値も変更されるというものです。

参照渡しにしたい場合は、プロシージャの引数にByRefキーワードを付けます。

以下に書式を示します。ちなみにByBalもByRefも付けない場合はByRef(参照渡し)として扱われます。

Sub プロシージャ名(ByRef 変数名 As データ型 [, ByRef 変数名 As データ型 ])
  '処理
End Sub

以下に参照私の例を示します。

Subプロシージャ sample2 は 引数xを参照渡しで受け取ることができます。

sample2 の引数xは、どんな値を受け取ったとしても5で上書きをします。

このsample2 に値を渡して書き換えると、呼び出し元の値も5に書き換えられます。

Option Explicit

Sub sample2(ByRef x As Integer)

  '引数でどんな値を受け取っても5で上書きする
  x = 5

End Sub

Sub callProc()
  Dim x As Integer
  
  x = 3
  
  'sample2 に 3という値が入った値を渡す
  sample2 x
  
  '5が表示される
  MsgBox x
    
End Sub