Easy-Micro

ESPACEMEMBRE Variables VBA
ByVal ou ByRef

Méthode ByVal ou ByRef

Méthode de passage de paramètres aux fonctions lorsque des fonctions sont utilisées pour intéragir avec le système d'exploitation.

ByVal
Cela signifie que l'on passe notre argument par 'valeur', c'est à dire que la fonction appelée ne travaillera pas directement sur la variable qui est passées en paramètre mais sur un clone de celle-ci. Cela signifie que si le cas écheant la variable est modifiée par la fonction de la DLL, cela n'aura pas de repercussion sur la variable originale de votre programme.

ByRef (par defaut si omis)
Ce coup-ci la variable est passée par Référence. La fonction appelée par l'api reçoit l'adresse de la variable utilisée dans le programme (un genre de pointeur en C pour ceux qui connaissent). Par conséquence si la fonction modifie la variable, elle sera aussi modifiée dans le programme si on la réutilises.

Exemple de procédure évennementielle sur une feuille (avec déclaration de variable par valeur)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target = "" Then
   Target = "X"
   Target.interior.colorIndex = 7
Else
   Target = ""
   Target.interior.colorIndex = xlNone
End If
Cancel = True ' Cette variable doit être renseignée. Elle empêche l'édition (Cancel = Annuler). Cela signifie que le curseur est désactivé. On ne peut pas écrire dans la cellule à partir d'un double clic. On ne peut donc pas supprimer le x.
End Sub

-> Dans la feuille correspondante de votre classeur, double-cliquez sur une cellule et constatez le résultat.

Exemple qui marche tout seul (pas besoin de saisie dans Excel) d'une procédure qui raoute 2 à la variable "Donnee" qui contient 10
Dim Donnee As Integer

Sub MaProcedure_1(ByVal x As Integer)
x = x + 2
End Sub

Sub voir()
Donnee = 10 'initialisation
MaProcedure_1 Donnee 'Appel de procédure distante
MsgBox "Voici : " & Donnee
End Sub

L'idée est de modifier le ByRef (par défaut) en ByVal pour voir que le résultat n'est pas le même (12 ou 10)

VBA Exemple de manipulation de variable entre 2 modules

' Contenu de Module 1 :

' Premier cas je déclare mes variables avec le mot clé Dim
' Elle n'es pas utilisable dans le module 2
' Portée: uniquement dans ce module

' Deuxième cas: je déclare mes variables avec le mot clé Public
' Portée: dans tous les modules


Option Explicit
Dim str_MaVariable As String
Dim int_int_AutreVariable As Integer

Sub boubou()
' Initialisation de la variable
str_MaVariable = "Hello"
' Utilisation
Range("A1").Value = str_MaVariable
End Sub

' Contenu de Module 2 :

Sub boubou_aussi()
' Appel de procédure distante
boubou
' Utilisation de la variable
Range("A2").Value = str_MaVariable
End Sub

VBA Passage de paramètres dans une procédure évènementielle
'Déclancher une procédure si "oui" dans une cellule (procédure évènementielle sur feuille)

Private Sub Worksheet_Change(ByVal Target As Range)
' Une procédure évènementielle (dans le module d'une feuille)
' Target est une variable objet à utiliser
' L'évènement "Change" qui donne WorkSheet_Change signifie "saisie dans une cellule"


If (Target.Value = "oui") Then
MsgBox "ok" 'ou appel d'une procédure distante
Else: Exit Sub
End If
End Sub


< Page précédente VARIABLES VBA