Excel VBAエキスパート資格・スタンダード解説|Subプロシージャ引数

 

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変数

モジュール変数や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を利用する人が対象の問題集です。