Excel VBAエキスパート資格・スタンダード試験対策の問題集に出題している「Subプロシージャ引数」の解説ページです。
目次
Excel VBA Subプロシージャ引数ByRefとByValの使い方
ExcelVBAのSubプロシージャの引数、参照渡しByRefや値渡しByValの使い方について解説します。
参照渡し(ByRef)
プロシージャ内で引数の変更が元の変数にも反映されるようにします。
値渡し(ByVal)
プロシージャ内で引数の変更が元の変数に影響を与えないようにします。
Excel VBA Subプロシージャ引数ByRefとByValの注意点
ByRef
呼び出されたプロシージャ内で引数の値を変更すると、元の変数の値も変更されます。つまり、元の変数が参照されるので、注意して使用する必要があります。
ByVal
引数の値をコピーしてプロシージャに渡すため、呼び出されたプロシージャ内で引数の値を変更しても、元の変数に影響を与えません。
Excel VBA Subプロシージャ引数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変数は、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プロシージャ内でこれらの変数が利用されており、値が設定された後、メッセージボックスでその値が表示されます。
Subプロシージャ引数|記憶定着問題集
操作方法:1.●●●をクリック(スマホはタップ)で答え表示。2.答えをクリック(スマホはタップ)で●●●表示。1⇔2を繰り返すことで、記憶を定着できます。
ExcelVBAのSubプロシージャの引数
参照渡し(●●●)
プロシージャ内で引数の変更が元の変数にも●●●。
値渡し(●●●)
プロシージャ内で引数の変更が元の変数に●●●。
注意点
●●●
呼び出されたプロシージャ内で引数の値を変更すると、元の変数の値も変更されます。つまり、元の変数が参照されるので、注意して使用する必要があります。
引数の値をコピーしてプロシージャに渡すため、呼び出されたプロシージャ内で引数の値を変更しても、元の変数に影響を与えません。
使い方
Sub MainProcedure()
Dim num As Integer
num = 10
' 参照渡し(●●●)を使ってSubプロシージャを呼び出す
Call ChangeNumberByRef(num)
MsgBox "●●●で変更された値は " & num & " です。"
' 値渡し(●●●)を使ってSubプロシージャを呼び出す
Call ChangeNumberByVal(num)
MsgBox "●●●で変更された値は " & num & " です。"
End Sub
Sub ChangeNumberByRef(●●●f value As Integer)
' 参照渡し(●●●)で値を変更する
value = value + 5
End Sub
Sub ChangeNumberByVal(●●● value As Integer)
' 値渡し(●●●)で値を変更するが、元の変数には影響しない
value = value + 10
End Sub
一つのモジュール内で使われる変数で、そのモジュール内のどこからでもアクセス可能です。 ●●●変数
どのモジュールからでもアクセス可能な変数で、プログラム全体で共有されます。
注意点
スコープ管理
モジュール変数はその●●●でのみアクセス可能であり、Public変数は●●●でアクセス可能です。適切なスコープを選択することが重要です。
値の保持
モジュール変数やPublic変数は、●●●に保持され続けます。適切なタイミングで値をリセットするなど、適切に管理する必要があります。
' モジュール内のモジュール変数
●●● moduleVariable As Integer
Sub ProcedureWithModuleVariable()
' モジュール変数の使用
moduleVariable = 5
MsgBox "モジュール変数の値は " & moduleVariable & " です。"
End Sub
' Public変数(別のモジュールで宣言された場合)
●●● publicVariable As Integer
Sub ProcedureWithPublicVariable()
' Public変数の使用
publicVariable = 10
MsgBox "Public変数の値は " & publicVariable & " です。"
End Sub
Excel VBAのスキルを活かして、仕事の効率化に貢献しませんか? 当サイトでは、Excel VBAエキスパート認定資格取得に向けた情報を提供しています。興味がある方は、ぜひ以下の問題集からチャレンジしてみてください。 ExcelVBAエキスパートスタンダードは、業務効率をあげるためにExcelVBAを利用する人が対象の問題集です。