Excel VBA スタンダード・Subプロシージャ引数について

ExcelVBAのSubプロシージャの引数、参照渡しByRefや値渡しByValの使い方について解説します。

Excel VBA Subプロシージャ引数ByRefとByValの使い方

参照渡し(ByRef)
プロシージャ内で引数の変更が元の変数にも反映されるようにします。

値渡し(ByVal)
プロシージャ内で引数の変更が元の変数に影響を与えないようにします。

 

Excel VBA Subプロシージャ引数ByRefとByValの注意点

注意点

ByRef
呼び出されたプロシージャ内で引数の値を変更すると、元の変数の値も変更されます。つまり、元の変数が参照されるので、注意して使用する必要があります。

ByVal
引数の値をコピーしてプロシージャに渡すため、呼び出されたプロシージャ内で引数の値を変更しても、元の変数に影響を与えません。

 

Excel VBASubプロシージャ引数ByRefとByValの使い方

Sub MainProcedure()
    Dim num As Integer
    num = 10
    
    ' 参照渡し(ByRef)を使ってSubプロシージャを呼び出す
    Call ChangeNumberByRef(num)
    MsgBox "ByRefで変更された値は " & num & " です。"
    
    ' 値渡し(ByVal)を使ってSubプロシージャを呼び出す
    Call ChangeNumberByVal(num)
    MsgBox "ByValで変更された値は " & num & " です。"
End Sub

Sub ChangeNumberByRef(ByRef value As Integer)
    ' 参照渡し(ByRef)で値を変更する
    value = value + 5
End Sub

Sub ChangeNumberByVal(ByVal value As Integer)
    ' 値渡し(ByVal)で値を変更するが、元の変数には影響しない
    value = value + 10
End Sub

この例は、MainProcedureというSubプロシージャからChangeNumberByRefとChangeNumberByValという2つのSubプロシージャを呼び出しています。

 

ChangeNumberByRefでは引数をByRef(参照渡し)で受け取り、値を変更しています。

 

ChangeNumberByValでは引数をByVal(値渡し)で受け取り、値を変更していますが、元の変数には影響を与えません。それぞれのSubプロシージャの結果がメッセージボックスで15を表示します。

 

Public変数

モジュール変数やPublic変数は、Subプロシージャ内でなくても利用できる変数です。これらの変数は、プロシージャ内で引数として渡す必要なく、コードの異なる部分で共有できます。

 

モジュール変数
一つのモジュール内で使われる変数で、そのモジュール内のどこからでもアクセス可能です。

Public変数
どのモジュールからでもアクセス可能な変数で、プログラム全体で共有されます。

 

注意点

スコープ管理
モジュール変数はそのモジュール内でのみアクセス可能であり、Public変数はプログラム全体でアクセス可能です。適切なスコープを選択することが重要です。

値の保持
モジュール変数やPublic変数は、プログラムの実行中に保持され続けます。適切なタイミングで値をリセットするなど、適切に管理する必要があります。

 

' モジュール内のモジュール変数
Dim moduleVariable As Integer

Sub ProcedureWithModuleVariable()
    ' モジュール変数の使用
    moduleVariable = 5
    MsgBox "モジュール変数の値は " & moduleVariable & " です。"
End Sub

 

' Public変数(別のモジュールで宣言された場合)
Public publicVariable As Integer

Sub ProcedureWithPublicVariable()
    ' Public変数の使用
    publicVariable = 10
    MsgBox "Public変数の値は " & publicVariable & " です。"
End Sub

この例は、モジュール変数 moduleVariableとPublic変数 publicVariable を定義しています。

それぞれのSubプロシージャ内でこれらの変数が利用されており、値が設定された後、メッセージボックスでその値が表示されます。

Excel VBAのスキルを活かして、開発者としてのキャリアを築いてみませんか?

当サイトでは、Excel VBAエキスパート認定資格取得に向けた情報を提供しています。興味がある方は、ぜひ以下の問題集からチャレンジしてみてください。

 

ExcelVBAエキスパートベーシック
仕事の効率をあげるためにExcelVBAを利用する人が対象の問題集です。


ExcelVBAエキスパートスタンダード

ExcelVBAの開発を仕事にする人が対象の問題集です。