[VBA] Bien comprendre ByVal / ByRef

F22Raptor

XLDnaute Impliqué
Hello,
J'ai une macro qui fait appel à une fonction, à laquelle j'envoie des arguments pour effectuer une action.
Ca marchait bien jusqu'à il y a quelques jours, et puis j'ai eu ce msg "Type d'Argument ByRef incompatible".

En effet je déclarais les arguments de la fonction sans préciser ByVal/ByRef, donc c'est ByRef qui était pris par défaut.
J'ai précisé ByVal, et ça marche.

Mais j'aimerais comprendre un peu mieux.
J'ai lu Les options ByRef et ByVal et je comprends le truc, mais je ne comprends pas pourquoi ça ne fonctionnait pas.
Tel que je le comprends, "qui peut le plus peut le moins", et donc, ByRef permet de modifier ou pas l'argument envoyé.
Pourquoi cela ne passait il pas ?


PS : ma macro de base déclare des variables du genre
VB:
Dim Toto As String
et ensuite appelle la fonction :
VB:
MaFonction (Toto)

VB:
Function MaFonction (MonArg As String)
(qui envoyait le msg d'erreur)
est devenu pour que ça marche :
VB:
Function MaFonction (ByVal MonArg As String)
 
Dernière édition:

Docmarti

XLDnaute Occasionnel
Re : [VBA] Bien comprendre ByVal / ByRef

Bonjour.

Erreur de syntaxe:
On ne doit pas mettre les arguments entre parenthèses si l'appel n'est pas précédé du mot CALL ou du signe =

Code:
1 MaFonction Toto  ' Correct

2 Call MaFonction(Toto)   'Correct

3 a = MaFonction(Toto)  ' Correct

4 MaFonction (Toto) ' Pas correct. L'argument ici n'est pas Toto mais (Toto)

Code:
Dim Toto As String

Sub main()

  Toto = "test"
  MaFonction (Toto)
  toto1 = Toto
  
  Toto = "test"
  Call MaFonction(Toto)
  toto2 = Toto
 
  Debug.Print toto1, toto2
 
End Sub

Function MaFonction(ByRef MonArg As String)
 MonArg = "567"
End Function

Cordialement

Docmarti
 

F22Raptor

XLDnaute Impliqué
Re : [VBA] Bien comprendre ByVal / ByRef

Merci Doc !
En fait j'utilisais Call mais j'ai oublié de le noter dans le msg

Sur le souci byval/byref, il se produit tjs indépendemment de la méthode d'appel à la fonction.
Ce qui me surprend, c'est que je n'ai rien changé et que la semaine dernière c'était OK !
 

F22Raptor

XLDnaute Impliqué
Re : [VBA] Bien comprendre ByVal / ByRef

Je regarderai si je peux faire un fichier test avec le même souci, mais moins lourd/complexe (la fonction va récupérer des fichiers sur notre réseau, les traiter, etc ...)

Mais pas de stress, ça marche comme ça. C'était surtout pour mieux comprendre l'utilisation des ByRef/ByVal, et notamment pourquoi ByRef ne fonctionne pas alors que ByVal fonctionne, alors que je vois plutôt ByVal comme une restriction de ByRef qui est censé tout accepter (modif ou pas).

Dans mon esprit, ByRef serait un peu comme le type Variant, et ByVal comme un type Double.
Si je mets ByRef, je ne peux pas me planter, comme avec Variant (même si c'est êut être moins rapide/efficace).
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 677
Messages
2 090 825
Membres
104 677
dernier inscrit
soufiane12