Byval ou byref ? (les bases pour newbies)

Description

Je vois souvent cette question sur le forum. Voici une réponse que j'espère claire.
Y-a même un Zip avec ces lignes de code !
Vous ètes pas chouchoutés sur vbFrance ??

Conclusion :


Question :
comment faire sortir 2 fichier à une fonction où l'on ne rentre qu'un fichier ? public function(fichier1 As string,...???) de zapping
-----------------------------------------------------------
Ah, voilà un sujet intéressant :
Rassure toi, c'est possible !

Quand tu crées une Sub ou une Function, tu défines des paramètres que tu passes à cette Sub :
Private Function MaSub(ByVal Fichier1 as String, ByVal Fichier2 as String, ...)

Tu auras remarqué le ByVal devant le paramètre : Il dit simplement que tu vas passer la VALEUR de la variable. Avec ByVal, cet échange ne fonctionne que dans un sens : Entrant.
De plus, si ta variable Fichier1 est modifiée dans ta Sub, cette modif sera perdue quand tu en sortiras.

Pour avoir un sens Sortant (pour que ta Sub te renvoie un ou plusieurs paramètres), il suffit :
-- D'utiliser ByRef au lieu de ByVal
Dans ce cas, VB va chercher l'adresse mémoire de la variable et pas seulement son contenu. Maintenant que VB connait l'adresse, quand il va modifier son contenu, il le modifiera pour tout le projet.
-- Par contre, il y a une contrainte : Il faut absolument que la variable que tu passes en Fichier2 (avec ByRef Fichier2 as String) soit dimensionnée dans le code qui appelle la fonction, puisque dans la Sub, VB va rechercher son adresse mémoire. Exemple :
Dans la Sub que tu crées :
Private Function MaSub(ByVal Fichier1 as String, ByRef Fichier2 as String)
Fichier2 = Fichier1
Fichier1 = ""
End Sub

tu vas l'appeler dans ton code, dans Form_Load par exemple :
Private Sub Form_Load ()
Dim MonFichier as String
Dim Destination as String
MonFichier = "Coucou.txt"
Destination = "Je sais pô.txt"
' Affiche le contenu des 2 variables dans le Log (Ctrl-G)
Debug.Print "Avant :"
Debug.Print "Mon fichier : "; MonFichier
Debug.Print "Destination : "; Destination
Call MaSub(MonFichier, Destination)
' Reaffiche le contenu des 2 variables dans le Log
Debug.Print "Après :"
Debug.Print "Mon fichier : "; MonFichier
Debug.Print "Destination : "; Destination
End Sub

Conclusions :
Tu remarqueras
-- que MonFichier n'a pas été vidé et que Destination a bien pris la valeur de MonFichier.

-- aussi que, bien qu'on ait utilisé ByRef pour le deuxième paramètre, on n'es pas obligé de l'appeler pareil dedans et dehors de la Sub : Liberté totale.

-- de l'importance du dimensionnement des variables dans un projet. Je ne saurais que te conseiller de mettre systématiquement un Option Explicit en haut de chaque page de code : Ceci t'impose à dimensionner toutes tes variables. C'est peut-être chiant, mais ça permet de n'en mettre que quand c'est nécessaire (sinon, on se perd vite), et en plus de s'apercevoir de l'importance d'utiliser :
-- des simples "Dim" dans les Sub/Function pour que la variable n'existe que dans cette Sub/Fonction
-- des "Private" dans la partie déclaration de tes formes : Ta variable ne sera visible que dans code de cette forme.
-- des "Public" dans un module (fichier .BAS) lorsque tu veux que cette variable soit visible depuis n'importe quel endroit dans ton projet.
-- des "Static" dans une Sub/Function quand tu veux que la valeur de la variable ne soit pas perdue à la fin, mais qu'elle soit mémorisée entre deux passages dans cette Sub/Function. <-- Très pratique

C'est beau, non ?
Vala

Si vous avez besoin d'éclaircissement, laissez vos questions en dessous, là VVV et j'y répondrais là aussi pour que tout le monde en profite.

Jack

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.