Collection Object - ByRef - ByVal

前端 未结 1 1429
北海茫月
北海茫月 2021-02-11 01:27

I am using VBA in Access 2013.

In a regular module there are 2 procedures, RunProc() and PopulateCollection()

When RunProc

1条回答
  •  深忆病人
    2021-02-11 01:41

    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.

    Sub RunProc()
    
        Dim MyCol As Collection
        Dim i As Long
    
        Set MyCol = New Collection
    
        PopCollByVal MyCol
    
        'I changed what pMyCol points to but *after*
        'I populated it when it still pointed to MyCol
        'so this returns 3
        Debug.Print "ByVal: " & MyCol.Count
    
        PopCollByRef MyCol
    
        'When I changed the reference pMyCol it changed
        'MyCol so both became a new Collection. This
        'return 0
        Debug.Print "ByRef: " & MyCol.Count
    
    End Sub
    
    Function PopCollByVal(ByVal pMyCol As Collection)
    
        Dim i As Long
    
        'The pointer pMyCol is a copy of the reference
        'to MyCol, but that copy still points to MyCol
        For i = 1 To 3
            'I'm changing the object that is pointed to
            'by both MyCol and pMyCol
            pMyCol.Add "Item" & i
        Next i
    
        'I can change what pMyCol points to, but I've
        'already populated MyCol because that's what
        'pMyCol pointed to when I populated it.
        Set pMyCol = New Collection
    
    End Function
    Function PopCollByRef(ByRef pMyCol As Collection)
    
        Dim i As Long
    
        'The pointer pMyCol is the actual reference
        'to MyCol
        For i = 1 To 3
            pMyCol.Add "Item" & i
        Next i
    
        'When I change what pMyCol points to, I also
        'change what MyCol points to because I passed
        'the pointer ByRef. Now MyCol is a new collection
        Set pMyCol = New Collection
    
    End Function
    

    0 讨论(0)
提交回复
热议问题