Vb: passer un tableau en paramètre

Résolu
Melycea -  
 zakaria -
Bonjour,

J'ai trouvé quelques problèmes se rapprochant du mien sur les forums mais aucun me donnant une solution qui me débloque...

Comme dit dans le titre, je voudrais passer un tableau en paramètre dans une fonction. Le problème vient lorsque j'appelle cette fonction, j'ai l'erreur "ce tableau est fixe ou temporairement vérouillé".
Effectivement, si j'ai bien compris, dans ma fonction je redimensionne le tableau est donc c'est à ce moment là que ça bloque.

J'ai donc enlever cette ligne, mais ensuite, quand (toujours dans cette fonction) je veux boucler sur les éléments du tableau, le programme considère le tableau comme une variable, enfin je pense.

Mon projet en bref:

function split(variant,string,tableau)     ' fonction appelée
do while tableau(i)<>""
  sol=sol & ";" & tableau(i)
loop
end function

sub traitement()                        ' procédure principale
montableau=creation(string)
call split(variant,string,montableau)
end sub

8 réponses

  1. Utilisateur anonyme
     
    re:

    1.) dans la signature que tu as proposé :

    function split(variant,string,tableau)

    les mots [ variant ] et [ string ] sont des mots réservés que tu ne peux utiliser
    comme nom de variable.

    la signature devrait ressembler à :

    function split(var1 As Variant, var2 As String, var3 As Array)

    2.) n.b. Lorsque ByVal ou ByRef sont non spécifié, c'est la valeur [ ByVal ]
    qui est considéré par défaut, donc :

    function split(chaine as variant, caract as string) as variant

    est équivalent à :

    function split(ByVal chaine As Variant, ByVal caract As String) As Variant

    Petit exemple d'utilisation ByVal et ByRef

    Option Explicit
    
    Sub Essai()
    
        Dim V1 As Long, V2 As Long, Res As Long
        Dim Reponse As Long, Texte As String
        
        V1 = 5: V2 = 6: Res = 0: Texte = ""
        
        Reponse = Additionne1(Res, V1, V2)
        
        Texte = Texte & "Reponse : " & Reponse & vbCrLf
        Texte = Texte & "Res     : " & Res & vbCrLf
        Texte = Texte & "V1      : " & V1 & vbCrLf
        Texte = Texte & "V2      : " & V2 & vbCrLf
        
        MsgBox Texte
        
        Reponse = Additionne2(Res, V1, V2)
        
        ' Ici, tu verras que le paramètre [ Res ] à été passé à la fonction
        ' par référence, donc le contenu de la variable est modifié par
        ' la fonction. (Ce serait pareille pour un paramètre de Sub).   
        Texte = Texte & "Reponse : " & Reponse & vbCrLf
        Texte = Texte & "Res     : " & Res & vbCrLf
        Texte = Texte & "V1      : " & V1 & vbCrLf
        Texte = Texte & "V2      : " & V2 & vbCrLf
        
        MsgBox Texte
    
    End Sub
    '
    
    Function Additionne1(ByVal Resultat As Long, _
                         ByVal Var1 As Long, _
                         ByVal Var2 As Long) As Long
    
        Resultat = Var1 + Var2
        
        Additionne1 = Resultat
    
    End Function
    '
    
    Function Additionne2(ByRef Resultat As Long, _
                         ByVal Var1 As Long, _
                         ByVal Var2 As Long) As Long
    
        Resultat = Var1 + Var2
        
        Additionne2 = Resultat
    
    End Function
    '
    


    Cdt

    Lupin
    2
  2. ViriisXP Messages postés 535 Statut Membre 41
     
    bonjour, peux-tu envoyé un fichier d'exemple pour mieux comprendre.

    upload : http://dl.free.fr

    cordialement.
    0
  3. Utilisateur anonyme
     
    Bonjour,

    Tu utilise des mots réservés pour le nom de tes variables...

    À mon humble avis, c'est une bien mauvaise pratique :

    Option Explicit
    
    Function split(ByVal pVariable As String, ByVal pChaine As String, ByVal pTableau() As String) As String
    
        Dim sol As String
        Do While pTableau(i) <> ""
            sol = sol & ";" & pTableau(i)
        Loop
        split = sol
    
    End Function
    '
    
    Sub traitement()                        ' procédure principale
    
        Dim montableau() As String
        Dim Chaine As String
        Dim Resultat As String
        montableau = creation(Chaine)
        Resultat = split(variable, Chaine, montableau())
    
    End Sub
    '
    


    Néanmoins, il y a confusion dans ton code ???

    La fonction split crée une chaine de caractères, est-ce cette chaine
    dont tu as besoin ?

    quand la loop est finit, tu peut récupérer le résultat ainsi
    split = sol

    et dans l'appel :

    Resultat = split(variable, Chaine, montableau())

    Cdt

    Lupin
    0
  4. Melycea
     
    Merci pour ta réponse. J'ai finalement réussi à résoudre mon problème (que j'avais par ailleurs plutôt mal expliqué) en mettant le tableau en paramètre de sortie de la fonction split:
    function split(chaine as variant, caract as string) as variant

    Puis dans la procédure on retrouve :
    sub traitement() 
    dim MonTab as variant, phrase as variant, separateur as string 
    MonTab=split(phrase,separateur) 
    end sub


    Qu'est ce que tu as voulu dire par : "Tu utilise des mots réservés pour le nom de tes variables"?

    Et j'en profites, puisque tu as l'air de t'y connaître pas mal, ça sert à quoi le "ByVal" devant les paramètres?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour tous,
    Excusez l'incruste, petite explication complémentaire

    Voir l'aide,
    spécifier si chaque argument doit être appelé par valeur (ByVal) ou implicitement par référence (ByRef)

    Quand un argument est passé par valeur, seule une copie de la variable est passée à la procédure. Si celle-ci modifie la valeur, le changement affecte uniquement la copie et non la variable proprement dite. Utilisez le mot clé ByVal pour indiquer qu'un argument est passé par valeur.

    Quand vous passez des arguments par référence, la procédure peut accéder à la variable proprement dite au niveau de l'emplacement de son adresse mémoire. La valeur de la variable peut ainsi être modifiée de manière permanente par la procédure à laquelle elle est passée. Le passage par référence est utilisé par défaut dans Visual Basic.

    A+
    0
    1. Utilisateur anonyme
       
      re:

      J'ai toujours pensée que ByVal était la valeur par défaut,
      j'étais dans l'erreur (du moins sous VBA), on ne sait jamais tout !

      Je vais tester sous .Net :-)

      Cdt

      Lupin
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Bonjour Lupin,
      Ce devrait être la même chose, j'ai consulté l'aide de VB6.
      Moi aussi je pensais que c'était par Byval, je me suis peut-être trompé de rubrique.
      A+
      0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    En .Net

    Le comportement par défaut en Visual Basic consiste à passer les arguments par valeur. Vous pouvez faciliter la lecture de votre code en utilisant le mot clé ByVal. En programmation, il est conseillé d'ajouter le mot clé ByVal ou ByRef à chaque paramètre déclaré.

    Mais le comportement est différent

    L'exemple suivant montre l'utilisation du paramètre ByVal qui passe le mécanisme avec un argument de type référence. Dans cet exemple, l'argument est c1, une instance de la classe Class1. ByVal empêche le code dans les procédures de modifier la valeur sous-jacente de l'argument de référence, c1, mais ne protège pas les champs et les propriétés accessibles de c1.

    Comme quoi.. ont apprend tout les jours.
    A+
    0
    1. Utilisateur anonyme
       
      re:

      En effet sous .NET, lorsque je ne déclare pas spécifiquement le ByVal ou le ByRef,
      l'éditeur place le terme ByVal de façon automatique et même si je l'efface, il le remet.

      Faut croire qu'a force de développer en .NET j'en perds mon VBA, j'ai même essayé
      sous VB6 et il réagit comme sous VBA, ByRef étant implicite si non exprimé.

      Toutefois, j'avais pris connaissance des sous-objets modifiables même si l'objet
      racine est passé par ByVal.

      @+

      Lupin
      0
  8. Melycea
     
    Merci beaucoup pour toutes vos réponses. ça m'a vraiment éclairée sur pas mal de trucs que j'ignorais complètement!

    Problème résolu ^^
    0
  9. zakaria
     
    regarde par ici ;)
    http://www.youtube.com/my_videos_upload
    0