Я использую VBA в Access 2013.
В обычном модуле есть 2 процедуры, RunProc()
и PopulateCollection()
Когда выполняется RunProc
, он вызывает PopulateCollection
, где переданным аргументом является экземпляр Collection с именем MyCol
.
PopulateCollection
добавляет 3 элемента, а затем 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?
PopulateCollection()
изменять свою коллекцию, зачем вообще вызывать эту функцию?) - person Tomalak   schedule 17.02.2014myCol
заполнялось, не передавайте его функции. - person   schedule 17.02.2014PopulateCollection
, не стоит удивляться, когда она делает то, что написано на коробке.pMyCol
иMyCol
одно и то же, они не разделены. Возникает вопрос: если вы не хотите заполнять коллекцию, почему вы вызываете функциюPopulateCollection
? - person Tomalak   schedule 17.02.2014MyCol
в функцию? Почему бы вам просто не преобразовать вашу функцию в процедуруSub
и не создать новую коллекцию внутри ее тела? Опять же, какая связь междуMyCol
иpMyCol
? - person   schedule 17.02.2014