type of "System.Collections.ArrayList" ??

ortollj

XLDnaute Nouveau
Bonjour
je n'arrive pas a passer l'objet myAL a la fonction PrintValues .
ca commence a salement m'enerver ! :mad:
j'ai besoin d'aide SVP.
Code:
     Sub Main1()
     ' Creates and initializes a new ArrayList.
     'Dim myAL As New ArrayList()
    Dim myAL As Object
    Set myAL = CreateObject("System.Collections.ArrayList")
    
Dim index As Integer

        
        myAL.Add ("01001000")
        myAL.Add ("10000111")
        myAL.Add ("00000101")
        myAL.Add ("00010100")
        myAL.Add ("00111001")
        myAL.Add ("00101111")
        myAL.Add ("00000011")
        myAL.Add ("00000001")
        myAL.Add ("11111111")

        ' Displays the values of the ArrayList.
        Debug.Print "The ArrayList initially contains the following values:"
        Debug.Print myAL.Item(0)
        For index = 0 To myAL.Count - 1
            Debug.Print "myAL:"; myAL.Item(index) & " num: " & index
        Next

        ' Sorts the values of the ArrayList.
        myAL.Sort
        Debug.Print "myAL Sorted:"
        ' Displays the values of the ArrayList.
        For index = 0 To myAL.Count - 1
            Debug.Print "myAL:"; myAL.Item(index) & " num: " & index
        Next
        PrintValues (myAL)
    End Sub 'Main

      Function PrintValues(myALx As Object)
     'Function PrintValues(ByRef myALx As Object)
     'Function PrintValues( myALx As ArrayList)
     'Function PrintValues( myALx As "System.Collections.ArrayList")
     'Function PrintValues(myALx As System.Collections.ArrayList)
     Dim i As Integer
     For index = 0 To myALx.Count - 1
            Debug.Print "myAL:" & myALx.Item(i) & " num: " & i
     Next
     End Function 'PrintValues
 

ortollj

XLDnaute Nouveau
Re : type of "System.Collections.ArrayList" ??

Remplace :
VB:
PrintValues (myAL)
par
VB:
Call PrintValues(myAL)
klin89

merci klin89

effectivement ca marche comme ca ! :cool:voir code ci dessous
mais alors pourquoi ca ne marche pas par une fonction ?:confused:



Code:
     Sub Main1()
     ' Creates and initializes a new ArrayList.
     'Dim myAL As New ArrayList()
     Dim myAL As Object
     Dim index As Integer
    

     
    Set myAL = CreateObject("System.Collections.ArrayList")
 
        myAL.Add ("01001000")
        myAL.Add ("10000111")
        myAL.Add ("00000101")
        myAL.Add ("00010100")
        myAL.Add ("00111001")
        myAL.Add ("00101111")
        myAL.Add ("00000011")
        myAL.Add ("00000001")
        myAL.Add ("11111111")

        ' Displays the values of the ArrayList.
        Debug.Print "The ArrayList initially contains the following values:"
        Debug.Print myAL.Item(0)
        For index = 0 To myAL.Count - 1
            Debug.Print "myAL:"; myAL.Item(index) & " num: " & index
        Next

        ' Sorts the values of the ArrayList.
        myAL.Sort
        Debug.Print "myAL Sorted:"
        ' Displays the values of the ArrayList.
        For index = 0 To myAL.Count - 1
            Debug.Print "myAL:" & myAL.Item(index) & " num: " & index
        Next
        Debug.Print Join(myAL.toarray(), Chr(10))

        Call PrintValues(myAL)
        
    End Sub 'Main

   Sub PrintValues(myALx As Object)
     Dim index As Integer
     For index = 0 To myALx.Count - 1
            Debug.Print "myAL:" & myALx.Item(index) & " num: " & index
     Next
     End Sub      'PrintValues
 
Dernière édition:

Docmarti

XLDnaute Occasionnel
Re : type of "System.Collections.ArrayList" ??

Bonjour.

En VBA, les objets (tels que les Collections) sont toujours passés Par Référence ( c-a-d non pas une copie de l'objet, mais l'adresse de l'objet qui pourra donc être modifié)

PrintValues (myAL) ' ByVal Donc illégal si myAL est un objet

PrintValues myAL ' ByRef Donc ca va.

Cordialement

Docmarti
 

Dranreb

XLDnaute Barbatruc
Re : type of "System.Collections.ArrayList" ??

Bonsoir.
Non, un objet peut être déclaré ByVal dans une liste de paramètres d'une instruction Sub.
Un tableau, non.
Mais ça ne veut pas dire qu'une copie de l'objet est alors mise dans la pile: ça veut juste dire qu'un Set effectué dessus dans la Sub ne pourra pas avoir de répercussion sur la variable objet passée en argument dans le programme appelant.
Ça n'a rien à voir avec le fait que les parenthèses sont illégales dans l'appel de la Sub, sauf si elle est invoquée avec Call devant, auquel cas elles sont obligatoires.
 
Dernière édition:

Docmarti

XLDnaute Occasionnel
Re : type of "System.Collections.ArrayList" ??

Bonsoir Dranreb

Tout ce que tu dis est exact concernant la procédure appelée.

Mais cela ne répond pas à la question concernant PrintValues (myAL) dans la procédure appelante qui ne fonctionne pas si myAL est un objet.

Par contre, la syntaxe PrintValues (myAL) fonctionne si myAl est une variable : dixit Chip Pearson

Code:
Sub ProcedureAppelante()
        Dim A As Long
    
        A = 123
        
        'Les 3 syntaxes d'appel courantes et équivalentes
        result = ProcedureAppelee(A) 'A = 321 - A est modifié si ByRef dans Procedure appelée
        
        Call ProcedureAppelee(A) 'A = 321 - A est modifié si ByRef dans Procedure appelée
        
        ProcedureAppelee A 'A = 321 - A est modifié si ByRef dans Procedure appelée
        
        'Quatrième syntaxe possible si A est une variable
        ProcedureAppelee (A) 'A = 123 - A ne sera pas modifié même si ByRef dans Procedure appelée
        'Cette syntaxe ne fonctionne pas si A est un objet
        'Syntaxe particulière pour empêcher la modification de la variable A
          

    End Sub
    
    Function ProcedureAppelee(ByRef X As Long)
        X = 321
    End Function

Très cordialement

Docmarti
 

Dranreb

XLDnaute Barbatruc
Re : type of "System.Collections.ArrayList" ??

Bonjour
Enlevez ce que vous appelez la Quatrième syntaxe possible si A est une variable ou alors prévoyez aussi la 5ième tout à fait équivalente :
Call ProcedureAppelee((A)) qui est tout aussi fausse. Les parenthèses en trop dans les deux cas le forcerait peut être à ne transmettre que la propriété par défaut de l'objet, je ne sais oas, en tout cas c'est fondamentalement incorrect en VBA.
D'ailleurs celui ci ajoute un espace devant la "(" pour montrer qu'il n'a pas besoin de celle ci comme délimiteur de liste de paramètres et qu'il la considère donc comme faisant partie, au début, de l'expression qui représente le 1èr paramètre.
 
Dernière édition:

Docmarti

XLDnaute Occasionnel
Re : type of "System.Collections.ArrayList" ??

Merci de tes précisions.

En fait, l'ajout de parenthèses à une variable ou à un objet, en force l'évaluation.
' A est un objet
' (A) est le résultat de l'évaluation de A

Démo:

Code:
Sub ProcedureAppelante()
        Dim A As Range
        Cells(1, 1) = 123
   
        Set A = Cells(1, 1)
        
         ' A est un objet
        Debug.Print TypeName(A)
        
        ' (A) est le résultat de l'évaluation de A
        Debug.Print TypeName((A))
             
        ProcedureAppelee (A) 'Ce n'est pas A qui est transmis mais l'évaluation de A
        Debug.Print A
        
        ProcedureAppelee A ' A est transmis et revient modifié
        Debug.Print A
          
         
    End Sub
   
   Function ProcedureAppelee(ByRef x)
        x = 321
    End Function

Cordialement

Docmarti