I am using VBA in Access 2013.
In a regular module there are 2 procedures, RunProc()
and PopulateCollection()
When RunProc
is executed it calls PopulateCollection
where the
argument passed is an Collection instace named MyCol
.
PopulateCollection
adds 3 items and then RunProc
continues by iterating the Collection.
My question / problem is this:
I want the argument MyCol
in RunProc
to NOT be populated by PopulateCollection
. What is the proper way to accomplish this?
Why does PopulateCollection
populate both the argument and parameter?
' --------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
Here is another way of asking my question:
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 procede?
In VBA, objects (such as Collections) are always passed by reference. When you pass an object ByRef, the address of the object is passed and PopulateCollection can change the reference.
When you pass it ByVal, a copy of the reference is passed. The copy of the reference still points to the original Collection, but if you change the copy, you don't change the reference in RunProc.