たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_引数の値渡し・参照渡し・Optional

引数の値渡しと参照渡しとはそれぞれどのようなことか、プロシージャの呼び出しの続きで学習

引数の値渡し

複製されたものを渡すイメージ、渡した先で値が変更されても元の値は変更されない

▼構文▼
引数を受け取る側のプロシージャに記述
Sub プロシージャ名 (ByVal 引数 As データ型)
Function プロシージャ名 (ByVal 引数 As データ型) As データ型

引数の参照渡し

そのままを渡すイメージ、渡した先で値が変更されると元の値も変更される

▼構文▼
引数を受け取る側のプロシージャに記述
Sub プロシージャ名 (ByRef 引数 As データ型)
Function プロシージャ名 (ByRef 引数 As データ型) As データ型

値渡しと参照渡しの記述例

▼サブルーチンの引数名を親プロシージャの変数名と揃えた記述例▼

Sub callsSub1()
 Dim callStr1 As String
 Dim callStr2 As String
 callStr1 = "たま氏は..."
 callStr2 = "たま氏は"
 call  callSub2(callStr1,callStr2)
 debug.Print callStr1
 debug.Print callStr2
End Sub

Sub callSub2(ByVal callStr1 As String,ByRef callStr2 As String) 'callStr1は値渡し、callStr2は参照渡し
 callStr1 = callStr1 & "変わっていない"
 callStr2 = callStr2 & "変わってしまった"
End Sub

▼処理結果▼

初学者ゆえに混乱しがちだが、これはあくまで変数callStr2の中身がスコープ内で更新されたということであって
サブルーチンから親プロシージャに値が戻されたわけではないことに留意

▼サブルーチンの引数名と親プロシージャの変数名を変えた記述例▼

Sub callsSub1()
  Dim callStr1 As String
  Dim callStr2 As String
  callStr1 = "たま氏は..."
  callStr2 = "たま氏は"
  Call callSub2(callStr1, callStr2)
  Debug.Print callStr1
  Debug.Print callStr2
End Sub

Sub callSub2(ByVal callStr111 As String, ByRef callStr222 As String)
  callStr111 = callStr111 & "変わらずにいた"
  callStr222 = callStr222 & "変わってしまった"
End Sub

▼処理結果▼

結果は前と変わらない、つまり、サブルーチン側の引数名を親プロシージャの変数名と揃える必要はない

Optionalキーワードで引数の記述を省略

サブルーチン側でOptionalキーワードを使用して初期値を設定することにより、
親プロシージャ側での引数の記述を省略できる
親プロシージャ側で引数が省略された場合に、設定した初期値が採用される

▼構文▼
引数を受け取る側のプロシージャに記述
Sub プロシージャ名 (Optional ByRefまたはByRef 引数 As データ型 = 初期値)
Function プロシージャ名 (Optional ByRefまたはByRef 引数 As データ型 = 初期値) As データ型

▼記述例▼

Sub callsSub1()
  Debug.Print callSub2("tama-shiの") '指定した引数がそのまま反映される
  Debug.Print callSub2() '引数の記述を省略したのでOptionalで設定した初期値が採用され戻り値として返される
End Sub

Function callSub2(Optional ByVal callStr As String = "たま氏の")
  callSub2 = callStr & "あほ"
End Function

▼処理結果▼