【VBA】Subで引数を使うやり方【参照渡しと値渡しがあります】

Excel VBAの「Sub」で「引数」を使うには、「()」に変数を入力することでできます。変数の渡し方には「参照渡し」と「値渡し」があります。渡した変数を引き継ぎたい場合には「参照渡し」で、変数を渡しっぱなしにしたい場合は「値渡し」を使いましょう。
はじめに
この記事では、Subで引数を使う方法について、ご紹介します。
引数を使うには「()」の中に変数を入力することでできます。
変数を渡す方法には、「参照渡し」と「値渡し」があります。
- 「参照渡し」:渡した変数を引き継げる
- 「値渡し」:変数は渡しっぱなし
という違いがあります。
基本的に「値渡し」を使って、変数を引き継ぎたい場合だけ「参照渡し」を使うと予期せぬ事態が起こりづらいです。
では、Subで引数を使う方法について、解説していきます。
この記事で紹介すること
- Subで「引数」を使う方法
目次
Subで引数を使う
Subで引数を使うには、「()」に変数を入力して使います。
「()」に変数を入力して使う
「()」に変数を入力して使うってみます。
VBAコードは、こんな感じです。
Sub TEST1() Call TEST2(1) End Sub Sub TEST2(a) MsgBox a + 1 End Sub
「()」の中に変数を入力して渡します。
「()」の中に変数を入力する

「1」を渡して、参照先で1を足すので結果は「2」となります。
Subで引数を使えた

こんな感じで引数を使うことができます。
参照渡しと値渡しがある
変数の渡し方には、「参照渡し」と「値渡し」があります
イメージ
違いとしては、
- 「参照渡し」:渡した変数を引き継げる
- 「値渡し」:変数は渡しっぱなし
という感じです。
参照渡しは、渡した変数を引き継ぐことができます。
「参照渡し」のイメージ

値渡しは、変数を渡しっぱなしにします。
「値渡し」のイメージ

という感じです。
それぞれの方法で実行してみましょう。
参照渡しを使う(ByRefもしくは省略)
「ByRef」をつけて渡すと、「参照渡し」になります。
「ByRef」をつけると「参照渡し」
「ByRef」をつけて変数を渡してみます。
Sub TEST1() a = 1 Call TEST2(a) MsgBox a End Sub Sub TEST2(ByRef b) b = b + 1 End Sub
「ByRef」をつけているので「参照渡し」となります。

参照渡しなので、渡した変数を引き継ぐことができます。

「1」を渡して「1」を足した変数が引き継がれて、結果は「2」となります。

結果は、「2」となりました。
渡した変数が引き継がれています。
「ByRef」は省略できる
「ByRef」を省略することができます。
Sub TEST1() a = 1 Call TEST2(a) MsgBox a End Sub Sub TEST2(b) b = b + 1 End Sub
なにも記述しない場合は「ByRef」となるので、「ByRef」は省略することもできます。

結果は先ほどと同じで変数が引き継がれて、「2」となります。

「2」となりました。
変数が引き継がれていますね。
値渡しを使う(ByVal)
「ByVal」を使うと、「値渡し」になります。
「ByVal」をつけると「値渡し」
「ByVal」をつけてみます。
Sub TEST1() a = 1 Call TEST2(a) MsgBox a End Sub Sub TEST2(ByVal b) b = b + 1 End Sub
「ByVal」をつけて渡すと「値渡し」です。

実行してみます。
渡した変数は引き継がれない
「値渡し」なので、渡した変数は引き継がれないです。

結果は、元の変数のままで「1」となります。

結果は、「1」のままです。
「値渡し」は変数を渡しっぱなしにします。
どちらを使うか
基本的には値渡し「ByVal」を使った方が、間違いが起こりにくいです。
基本的には値渡し「ByVal」を使う
とりあえず参照渡しを使って、間違って変数に値を入力しちゃった場合で、考えてみます。
間違って変数を入力しちゃった
Sub TEST1() a = 1 Call TEST2(a) End Sub Sub TEST2(b) b = b + 1 MsgBox b b = 9999 End Sub
一番下にうっかり入力という感じです。

結果は想定していた「2」となります。
出力した値は問題なし

ただ、引き継がれた変数は「9999」となるので、予期しない事態になってしまう可能性があります。
引き継がれた値が「9999」となって思わぬ事態に

引き継がれた値は「9999」となっています。
これに気づかないままだと、予期せぬ事態になりかねません。
変数を「引き継ぎたい」場合だけ「参照渡し」
変数を意図的に「引き継ぎたい」場合だけ「参照渡し」とするといいです。
仮に間違って入力しても参照元の変数に影響がないので、予期せぬ事態が発生する可能性が減ります。
おわりに
この記事では、Subで引数を使う方法について、ご紹介しました。
引数を使うには「()」の中に変数を入力することでできます。
変数を渡す方法には、「参照渡し」と「値渡し」があります。
- 「参照渡し」:渡した変数を引き継げる
- 「値渡し」:変数は渡しっぱなし
という違いがあります。
基本的に「値渡し」を使って、変数を引き継ぎたい場合だけ「参照渡し」を使うと予期せぬ事態が起こりづらいです。
参考になればと思います。最後までご覧くださいまして、ありがとうございました。
関連する記事から探す