VBA入門
プロシージャーの引数

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-11-16

第107回.プロシージャーの引数


Subプロシージャー、Functionプロシージャーにおける、引数リストの指定について説明します。
引数は、呼び出し先のプロシージャーに渡すデータを指定するものです。


Callステートメントでプロシージャーを呼び出すときに指定する引数を、
呼び出される側のプロシージャーで受け取る記述についてのマクロVBA記述の説明になります。


引数の構文

Sub name [(arglist)]
Function name [(arglist)] [As type]

このarglistの指定についての解説になります。
arglistは次の形式で指定します。

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

Optional

省略可能です。
指定した引数が省略可能であることを示します。
このキーワードを指定した場合、引数 arglist のそれ以降の引数も省略可能でなければならず、すべてキーワード Optional を付けて宣言する必要があります。
キーワード ParamArray を使った場合は、どの引数に対してもキーワード Optional は指定できません。

ByVal

省略可能です。
その引数が、値渡しで渡されることを示します。

ByRef

省略可能です。
その引数が、参照渡しで渡されることを示します。
既定値は ByRef です。

ParamArray

省略可能です。
引数 arglist の最後の引数でのみ使用できます。
その引数がバリアント型 (Variant) の要素を持つ省略可能 (Optional) な 配列であることを示します。
キーワード ParamArray を使うと、任意の数の引数を渡すことができます。
ByVal、ByRef、Optional の各キーワードと共に使うことはできません。

varname

必ず指定します。
引数を表す変数名を指定します。
変数の標準的な名前付け規則に従って指定します。

type

省略可能です。
プロシージャに渡す引数のデータ型を指定します。
バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長のみ)、オブジェクト型 (Object)、バリアント型 (Variant) のいずれかを指定できます。
パラメータにキーワード Optional が指定されていない場合は、ユーザー定義型またはオブジェクトの種類を指定することもできます。

defaultvalue

省略可能です。
任意の定数または定数式を指定します。
キーワード Optional を指定したパラメータに対してのみ有効です。
データ型がオブジェクト型 (Object) の場合、明示的な既定値は Nothing だけです。


ParamArrayについてはここでは解説を省略します。
配列になりますので、その前に配列を覚える必要があります。
第133回.引数を不定数にするParamArray
・引数の構文 ・名前付き引数について ・ParamArrayキーワード(パラメーター配列)とは ・ParamArrayキーワード(パラメーター配列)の使用例 ・サイト内の関連ページ
以下で使用していますが、VBAクラスなので少々難解なVBAとなっています。
VBAクラスの作り方:独自Rangeっぽいものを作ってみた
・クラスの全VBAコード ・サンプルとして使うブックの構成 ・標準モジュールでの使い方 ・最後に

ByValの値渡しとは

変数の中のデータを渡すもので、呼出側の変数は影響を受けません。
つまり、値渡しでは呼び出し先で引数の値を変更しても、呼び出し元の引数は変更されません。

ByRefの参照渡しとは

変数そのものを渡すもので、呼出側の変数が影響を受けます。
つまり、参照渡しでは呼び出し先で引数の値を変更すると、呼び出し元の引数も変更されます。

Optionalについて

指定した引数が省略可能であることを示します。
Optional指定された引数のあるプロシージャーを呼び出すときは、Optionalの引数を指定するかしないかを選択できます。

Optionalの引数を指定しないと、既定値がある場合はそれが使用されます。
既定値が指定されていない場合は、引数は指定された型の初期値が使用されます。
ただし、Variantの場合はMissingになります。

省略可能なバリアント型 (Variant) の引数がプロシージャーに渡されたかどうかを調べるには、
IsMissing関数を使用します。
・IsMissing関数 ・IsMissing関数の使用例 ・Is○○関数一覧

以下の使用例で、理解を深めて下さい。
特に、ByVal、ByRefについては、しっかり理解して下さい。
詳細は、ByVal、ByRefについて
・ByVal(値渡し)とByRef(参照渡し) ・普通の変数(プリミティブ型)の場合 ・オブジェクト変数の場合 ・サイト内のByVal,ByRefの記事



引数の使用例

Sub sample1()
  Dim i, j
  i = 1
  j = 1
  Call sub1(i, j)
  MsgBox i
  MsgBox j
End Sub
Sub sub1(arg1, arg2)
  arg1 = arg1 + 1
  arg2 = arg2 + 2
End Sub

上記のsample1を実行すると、2,3の順にメッセージ表示されます。
ByValもByRef指定していないので、ByRefとなっています。
参照渡し(ByRef)ですので、Call元のプロシージャーの引数も変更されます。


Sub sample2()
  Dim i, j
  i = 1
  j = 1
  Call sub2(i, j)
  MsgBox i
  MsgBox j
End Sub
Sub sub2(ByVal arg1, ByVal arg2)
  arg1 = arg1 + 1
  arg2 = arg2 + 2
End Sub

上記のsample2を実行すると、1,1の順にメッセージ表示されます。
ByValを指定しているので、値渡しとなっています。
この場合、Call元のプロシージャーの引数は変更されません。


Sub sample3()
  MsgBox func3("引数", "テスト")
  MsgBox func3("引数")
End Sub
Function func3(ByVal arg1 As String, Optional ByVal arg2 As String = "省略値") As String
  func3 = arg1 & arg2
End Function

上記sample3を実行すると、"引数テスト"、"引数省略値"の順にメッセージ表示されます。
Optionalは、引数を省略可能であり、省略した場合の規定値を指定できます、上では"省略値"になります。


引数について

引数の使い方は、とても奥深いものです。
この引数の使い方を見れば、その人のプログラミングスキルが分かるといっても過言ではないでしょう。

奥深いがゆえに、使い方にこれが正解と言うものはありません。
プログラミングにおいては、引数の使い方を常に工夫していくものです。
プログラムを書くときは、常にもっと良い指定方法がないかといったことを考えます。
引数の使い方を考えることは、プログラミングスキルを確実に向上させます。




同じテーマ「マクロVBA入門」の記事

第141回.行・列の表示・非表示・列幅・行高
第105回.Callステートメント
第106回.Functionプロシージャー
第107回.プロシージャーの引数
第108回.変数の適用範囲(スコープ,Private,Public)
第100回.InputBoxメソッド(インプットボックス)
第101回.Midステートメント
第102回.Intersectメソッド
第103回.UnionメソッドとAreasプロパティ
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
第109回.列挙型(列挙体)Enum


新着記事NEW ・・・新着記事一覧を見る

TOROW関数(配列を横1行の配列にして返す)|エクセル入門(2022-10-31)
TOCOL関数(配列を縦1列の配列にして返す)|エクセル入門(2022-10-31)
CHOOSECOLS関数(配列から複数の指定された列を返す)|エクセル入門(2022-10-29)
CHOOSEROWS関数(配列から複数の指定された行を返す)|エクセル入門(2022-10-29)
WorksheetFunctionの効率的な使い方とスピル新関数の利用|VBA入門(2022-10-27)
VSTACK関数(配列を縦方向に順に追加・結合)|エクセル入門(2022-10-25)
HSTACK関数(配列を横方向に順に追加・結合)|エクセル入門(2022-10-25)
LAMBDA以降の新関数の問題と解説(配列操作関数編)|エクセル入門(2022-10-24)
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)|エクセル入門(2022-10-24)
LAMBDA以降の新関数の問題集|エクセル入門(2022-10-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.マクロって何?VBAって何?|VBA入門
9.エクセルVBAでのシート指定方法|VBA技術解説
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ