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 und MyCol 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 Funktion PopulateCollection?
  • Also, Was ist der Punkt der Weitergabe des original - MyCol an die Funktion? Warum gehst du nicht einfach konvertieren Sie Ihre Funktion um ein Sub Prozedur, und erstellen Sie eine neue Sammlung innerhalb seines Körpers? Wieder, was ist die Beziehung zwischen MyCol und pMyCol?
  • Vielen Dank für die Hilfe. Hier ist ein anderer Weg gefragt, meine Frage:

InformationsquelleAutor Michael | 2014-02-17
Schreibe einen Kommentar