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

A voir également:
  • Vba passer un tableau en paramètre
  • Vb - Télécharger - Langages
  • Vb cable - Télécharger - Audio & Musique
  • Vb editor - Télécharger - Langages
  • Vb runtime - Télécharger - Divers Utilitaires
  • Vb express - Télécharger - Langages

8 réponses

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
ViriisXP Messages postés 487 Date d'inscription   Statut Membre Dernière intervention   40
 
bonjour, peux-tu envoyé un fichier d'exemple pour mieux comprendre.

upload : http://dl.free.fr

cordialement.
0
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
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
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
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
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
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
zakaria
 
regarde par ici ;)
http://www.youtube.com/my_videos_upload
0