Vb: passer un tableau en paramètre

Résolu/Fermé
Melycea - 21 mai 2012 à 11:14
 zakaria - 8 juil. 2012 à 04:44
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 cable - Télécharger - Audio & Musique
  • Vb - Télécharger - Langages
  • Vb editor - Télécharger - Langages
  • Vb runtime - Télécharger - Divers Utilitaires
  • Vb 2008 - Télécharger - Langages

8 réponses

Utilisateur anonyme
22 mai 2012 à 20:56
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 482 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 11 janvier 2023 40
22 mai 2012 à 09:56
bonjour, peux-tu envoyé un fichier d'exemple pour mieux comprendre.

upload : http://dl.free.fr

cordialement.
0
Utilisateur anonyme
22 mai 2012 à 13:21
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
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 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
22 mai 2012 à 21:52
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
22 mai 2012 à 21:57
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 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
22 mai 2012 à 22:09
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 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
22 mai 2012 à 22:19
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
23 mai 2012 à 13:16
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
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
regarde par ici ;)
http://www.youtube.com/my_videos_upload
0