Access 2013 で VBA を使用しています。
通常のモジュールには 2 つの手順がRunProc()あり、PopulateCollection()
RunProcが実行されるとPopulateCollection、渡された引数が という名前の Collection インスタンスである場合に呼び出されますMyCol。
PopulateCollection3 つのアイテムを追加しRunProcてから、コレクションを反復して続行します。
私の質問/問題はこれです:
MyColの引数にRunProcが入力されないようにしたいPopulateCollection。これを達成する適切な方法は何ですか?
PopulateCollectionが引数とパラメータの両方を入力するのはなぜですか?
' --------Module1------------------
Option Compare Database
Option Explicit
Dim i As Integer
Dim MyCol As VBA.Collection
Sub RunProc()
Set MyCol = New VBA.Collection
PopulateCollection MyCol
For i = 1 To MyCol.Count
Debug.Print MyCol.Item(i)
Next i
End Sub
Function PopulateCollection(ByRef pMyCol As VBA.Collection)
For i = 1 To 3
pMyCol.Add "Item" & i
Next i
End Function
ここに私の質問をする別の方法があります:
Option Compare Database
Option Explicit
Sub Proc1()
Dim myInt As Integer
myInt = 1
Proc2 myInt
Debug.Print myInt
myInt = 1
Proc3 myInt
Debug.Print myInt
End Sub
Sub Proc2(ByVal pmyInt)
pmyInt = pmyInt + 1
Debug.Print pmyInt
End Sub
Sub Proc3(ByRef pmyInt)
pmyInt = pmyInt + 1
Debug.Print pmyInt
End Sub
'Consider the 3 procedures: Proc1, Proc2, Proc3
'Proc1 calls Proc2 and Proc3
'The only difference between Proc2 and Proc3 is that
'the parameter pmyInt is called differently: ByVal vs ByRef
'Proc2 does not change the argument myInt
'Proc3 does change the argument myInt
'The root of my question is why the same behavior is
'not exhibited with an Object (VBA.Collection)
'Assuming I wanted to not have the original Collection altered
'how would I proceed?