Vb: passer un tableau en paramètre [Résolu/Fermé]

Signaler
-
 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


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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
464
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
21 février 2018
40
bonjour, peux-tu envoyé un fichier d'exemple pour mieux comprendre.

upload : http://dl.free.fr

cordialement.

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
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?
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 146
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+
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
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 146
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+
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 146
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+
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
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 ^^
regarde par ici ;)
http://www.youtube.com/my_videos_upload