VBA : Arguments multiples pour un même paramètre par l’exemple

Certaines syntaxes permettent de passer plusieurs arguments dans le paramètre. C’est le cas de la commande MsgBox par exemple, où le paramètre Buttons accepte plusieurs valeurs de l’énumérateur vbMsgBoxStyle.

Il est assez simple d’utiliser cette technique dans vos propres commandes ou fonctions. Voici comment procéder :

L’énumérateur VBA

Commencez par créer un module standard pour accueillir la fonction. Dans l’en-tête, après la ligne Option Explicit, nous allons définir l’énumérateur. L’énumérateur est une simple structure de données de variable.





Option Compare Database
Option Explicit 

Public Enum efFichierExt 
       Unite = 8 
       Chemin = 16 
       Fichier = 32 
       Extension = 64 
End Enum

Pour en savoir plus sur l’énumération en VBA, son potentiel et ses bienfaits dans votre code, consultez mon tutoriel : http://loufab.developpez.com/tutoriels/access/enumVBA/

Il est très important que les valeurs de l’enum soit en base 8, comme vous le verrez par la suite.

La fonction

L’écriture de la fonction est assez triviale. La signature de la fonction fait référence à l’enum comme un type classique.

Public Function fFichierExt(strCheminFichier As String, _
iType As efFichierExt) As String


Le paramètre iType est donc de type efFichierExt, notre enum.

Maintenant, pour tester la présence des différentes valeurs dans iType, il ne faut pas utiliser les opérateurs logiques (=, <>…) habituels mais AND.

Voici comme on procède :

If iType And Unite Then ' l'unité 
   vRetour = Left(strCheminFichier, InStr(strCheminFichier, ":")) 
End If

iType And Unite est l’équivalent de « Est-ce que iType contient Unite ? »

Voici la fonction complète qui permet d’extraire de parties du chemin d’un fichier.

Public Function fFichierExt(strCheminFichier As String, _
                            iType As efFichierExt) As String 
'-------------------------------------------------------------- 
' Procedure : fFichierExt 
' Author : Fabrice CONSTANS (MVP) 
' Date : 13/03/2013 
' Purpose : Retourne l'un des éléments suivant le chemin/fichier passé 
' Parametres: 
' strCheminFichier contient le chemin et fichier 
' strType = enum eTypeFichierExt 
' 64 renvoi l'extension du fichier sans le point 
' 32 renvoi le nom du fichier sans son extension 
' 16 renvoi le chemin sans le nom ni l'extension 
' 8 renvoi l'unité 
'-------------------------------------------------------------- 
On Error GoTo Errsub 
Dim vRetour As String 
If iType And Unite Then ' l'unité 
   vRetour = Left(strCheminFichier, InStr(strCheminFichier, ":")) 
End If 
If iType And Chemin Then ' le chemin sans l'unité logique
   vRetour = vRetour & Mid(strCheminFichier, 3, InStrRev(strCheminFichier, "\") - 2) 
End If 
If iType And Fichier Then 
   Dim tmpFic As String 
   If strCheminFichier Like "*.*" Then 
      tmpFic = Right(strCheminFichier, 
             _ Len(strCheminFichier) - InStrRev(strCheminFichier, "\")) 
      vRetour = vRetour & Left(tmpFic, InStrRev(tmpFic, ".") - 1) 
   Else 
      vRetour = strCheminFichier 
   End If
End If 
If iType And Extension Then ' renvoi l'extension 
   If iType And Fichier Then 
      vRetour = vRetour & "." vRetour = vRetour & Right(strCheminFichier, _                    
                Len(strCheminFichier) - InStrRev(strCheminFichier, ".")) 
   End If 
fFichierExt = vRetour 
Exit Function 

Errsub: 'ici utiliser votre propre traitement d'erreur 
Exit Function 

End Function

Comme vous le voyez, iType est analysé plusieurs fois. A chaque analyse on concatène ou non l’élément souhaité.

La première analyse détermine si l’on doit renvoyer l’unité, la deuxième le chemin etc.

L’appel se fait de la manière suivante :

? fFichierExt("c:\windows\temp\monfichier.tmp", Fichier + Extension)

On remarque que, comme pour MsgBox, les paramètres multiples sont additionnés.

Dans cet exemple le résultat sera :

monfichier.tmp

On peut donc renvoyer tout ou partie de la valeur passée. Par exemple :

? fFichierExt("c:\windows\temp\monfichier.tmp", Unite + Chemin + 
             _ Fichier + Extension)

Evidemment, vous pouvez faire l’addition dans l’ordre que vous souhaitez, le résultat sera toujours le même.

? fFichierExt("c:\windows\temp\monfichier.tmp", Extension + Fichier)

Conclusion

L’utilisation d’un enum en base 8 et de l’opérateur logique AND permet de passer autant de paramètres que l’on souhaite. Encore faut-il en avoir l’utilité…

Vous pouvez utiliser la fonction ci-dessus dans vos applications dans la mesure où vous ne modifiez pas le nom de l’auteur.

Bonne utilisation !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *