アクセス上位ページ
 
最近の更新内容
(1)-i.プロシージャの引数 ⇐ [PREV]
[NEXT] ⇒ (1)-k.プロシージャの呼び出し

Excel VBA ≫ 1.基礎編 - はじめに(1)-j.引数の参照渡し・値渡し

引数の参照渡し・値渡し

前のページでプロシージャには引数を設定することが可能であることを説明しました。 このページではその引数として変数を渡す場合の参照渡し・値渡しについて説明します。

  • 参照渡し
  • プロシージャに引数として変数を渡すときに、その参照(アドレス)を渡す方法。 値をコピーする必要がないため、無駄にメモリを消費することがありません。 しかし、呼び出し先プロシージャ内で引数の値を変更してしまうと、 呼び出し元の変数の値も変わってしまうことに注意が必要です。 この特性を意図的に利用してプロシージャを作成することもあります。



  • 値照渡し
  • プロシージャに引数として変数を渡すときに、その値をコピーして渡す方法。 値をコピーするため、その分メモリを消費します。 呼び出し先プロシージャ内で引数の値を変更しても呼び出し元へ影響がでません。
管理人から一言・・・ 参照渡しか? 値渡しか?
処理パフォーマンスの観点から言うと、可能な限り引数は参照渡しにするべきです。ただ、先に述べたとおり、参照渡しにすると呼び出し先プロシージャ内で引数を変更すると呼び出し元へ影響がでてしまいます。したがって、呼び出し先プロシージャ内で引数を変更したいが、呼び出し先へ影響はだしたくない場合にだけ値渡しを使うとよいでしょう。


参照渡しにしたい場合は引数名の前に"ByRef"をつけます。このキーワードを省略した場合は"ByRef"とみなされます。

【構文】
Sub [プロシージャ名](ByRef [引数名] as [データ型])
   :
(処理を記述)
   :
End Sub

値渡しにしたい場合は引数名の前に"ByVal"を付けます。

【構文】
Sub [プロシージャ名](ByVal [引数名] as [データ型])
   :
(処理を記述)
   :
End Sub


<サンプルマクロ>
Sub sample_eb017_02()
    Dim a   As Integer
    a = 1

    MsgBox "参照渡しプロシージャ呼び出し前:a = " & a
    Call 参照渡しプロシージャ(a)
    MsgBox "参照渡しプロシージャ呼び出し後:a = " & a

    MsgBox "値渡しプロシージャ呼び出し前:a = " & a
    Call 値渡しプロシージャ(a)
    MsgBox "値渡しプロシージャ呼び出し後:a = " & a

End Sub

Private Sub 参照渡しプロシージャ(ByRef x As Integer)
    MsgBox "参照渡しプロシージャ内1:x = " & x
    x = 123
    MsgBox "参照渡しプロシージャ内2:x = " & x
End Sub

Private Sub 値渡しプロシージャ(ByVal x As Integer)
    MsgBox "値渡しプロシージャ内1:x = " & x
    x = 321
    MsgBox "値渡しプロシージャ内2:x = " & x
End Sub
⇒ サンプルマクロ集 へ
⇒ MsgBox関数

<サンプルマクロ実行結果>
  • 参照渡しプロシージャ呼び出し前
  • 参照渡しプロシージャ呼び出し前
  • 参照渡しプロシージャ内1
  • 参照渡しプロシージャ内1
  • 参照渡しプロシージャ内2
  • 呼び出し先プロシージャ内で引数の値を変更します。 参照渡しプロシージャ内2
  • 参照渡しプロシージャ呼び出し後
  • 参照渡しのため、呼び出し元の変数の値が変わってしまいます。 参照渡しプロシージャ呼び出し前
  • 値渡しプロシージャ呼び出し前
  • 値渡しプロシージャ呼び出し前
  • 値渡しプロシージャ内1
  • 値渡しプロシージャ内1
  • 値渡しプロシージャ内2
  • 呼び出し先プロシージャ内で引数の値を変更します。 値渡しプロシージャ内2
  • 値渡しプロシージャ呼び出し後
  • 値渡しのため、呼び出し元の変数の値は変わりません。 値渡しプロシージャ呼び出し前
カテゴリ内ページ



Page
Top