Sammlung-Objekt - ByRef - ByVal
Ich bin mit VBA in Access 2013.
In einem normalen Modul es gibt 2 Verfahren, die RunProc()
und PopulateCollection()
Wenn RunProc
ausgeführt wird, ruft es PopulateCollection
wo die
übergebene argument ist eine Sammlung named instace MyCol
.
PopulateCollection
enthält 3 Elemente und dann RunProc
weiterhin durch Durchlaufen der Sammlung.
Meine Frage /problem ist Folgendes:
Möchte ich das argument MyCol
im RunProc
NICHT aufgefüllt werden, indem PopulateCollection
. Was ist der richtige Weg, um dies zu erreichen?
Warum PopulateCollection
füllen Sie die argument und 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
Hier ist ein anderer Weg gefragt, meine Frage:
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
'Betrachten Sie die 3 Verfahren: Proc1, Proc2, Proc3
'Proc1 Anrufe und Proc2 Proc3
'Der einzige Unterschied zwischen und Proc2 Proc3 ist, dass
'die parameter pmyInt unterschiedlich genannt: ByVal vs. ByRef
'Proc2 ändert nicht das argument myInt
'Proc3, ändert das argument myInt
'Der Grund für meine Frage ist, warum ist das gleiche Verhalten
"nicht ausgestellt, mit ein Objekt (VBA.Sammlung)
'Vorausgesetzt, ich wollte nicht die original-Sammlung verändert
"wie würde ich procede?
- Was meinst du mit "sowohl das argument und der parameter"? Ihre Frage ist etwas unklar ist, können Sie auszudrücken versuchen, mehr klar, was Sie erwarten, zu geschehen? (Auch, wenn Sie nicht wollen, um
PopulateCollection()
ändern Ihre Sammlung, warum nennen Sie diese Funktion in Erster Linie?) - Deine Frage macht einfach keinen Sinn... wenn Sie nicht wollen
myCol
zu bekommen, aufgefüllt, dann nicht-pass - es um die Funktion. - Wenn RunProc ausgeführt wird und am Ende des Verfahrens wird es Schleifen MyCol sollte es wieder nichts, weil MyCol(das argument) sollte nicht bestückt werden. Nur pMyCol sollten aufgefüllt werden, in PopulateCollection nicht MyCol
- In anderen Worten, instanziieren Sie ein Sammlung dann pass es zu einem Verfahren. Diese Prozedur übernimmt die Sammlung und macht etwas mit ihm. Aber ich will nicht der ursprünglichen Sammlung: MyCol verändert werden nur die übergebenen collection: pMyCol
- Aber die Funktion wird aufgerufen
PopulateCollection
sollten Sie nicht überrascht sein, wenn es tut, was es sagt, auf der box.pMyCol
undMyCol
sind die gleiche Sache, Sie sind nicht getrennt. Die Frage steht: Wenn Sie nicht möchten, zum Auffüllen der Sammlung, warum nennst du die FunktionPopulateCollection
? - Also, Was ist der Punkt der Weitergabe des original -
MyCol
an die Funktion? Warum gehst du nicht einfach konvertieren Sie Ihre Funktion um einSub
Prozedur, und erstellen Sie eine neue Sammlung innerhalb seines Körpers? Wieder, was ist die Beziehung zwischenMyCol
undpMyCol
? - Vielen Dank für die Hilfe. Hier ist ein anderer Weg gefragt, meine Frage:
Du musst angemeldet sein, um einen Kommentar abzugeben.
In VBA, Objekte (z.B. Sammlungen) werden immer per Referenz übergeben. Wenn Sie ein Objekt übergeben ByRef die Adresse des Objekts übergeben wird und PopulateCollection können, ändern Sie den Verweis.
Wenn Sie es passieren ByVal wird eine Kopie der Referenz wird übergeben. Die Kopie der Verweis weiterhin auf das ursprüngliche Sammlung, aber wenn Sie ändern Sie die Kopie, die Sie nicht ändern Sie den Verweis in RunProc.