Utilisation des Fonctions Intégrées
Glissez pour afficher le menu
VBA est livré avec plusieurs centaines de fonctions intégrées, dont la plupart ne seront jamais utilisées. Celles ci-dessous sont fréquemment employées en automatisation d'entreprise — nettoyage de texte, gestion des dates et conversion de types.
Fonctions de date
Debug.Print Now() ' current date and time
Debug.Print Date ' today's date only
Debug.Print DateAdd("d", 30, Date) ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date) ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")
Now() et Date semblent similaires mais répondent à des besoins différents — Now() inclut l'heure actuelle jusqu'à la seconde près (utile pour horodater l'exécution d'une macro), tandis que Date fournit uniquement le jour du calendrier, ce qui est préférable pour tout ce qui concerne les dates d'échéance ou les âges. DateAdd et DateDiff sont complémentaires : DateAdd projette une date vers l'avant ou l'arrière selon une unité donnée ("d" pour jours, mais "m" pour mois et "yyyy" pour années fonctionnent aussi), tandis que DateDiff mesure l'écart entre deux dates existantes.
Les littéraux de date VBA — tout ce qui est écrit entre les symboles #, comme #01/09/2023# — utilisent toujours l'ordre MM/DD/YYYY en interne, indépendamment des paramètres régionaux de Windows ou du système. Ainsi, #01/09/2023# signifie 9 janvier 2023, et non le 1er septembre, même pour les utilisateurs dont le format de date habituel est JJ/MM/AAAA. Cela diffère de la saisie dans une cellule de feuille de calcul, où les paramètres régionaux s'appliquent — le format littéral #...# est une règle propre à VBA qui reste fixe, quel que soit l'environnement d'exécution du code.
Fonctions de texte
Debug.Print UCase("wireless mouse") ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE") ' wireless mouse
Debug.Print Left("P001", 1) ' P
Debug.Print Right("P001", 3) ' 001
Debug.Print Mid("P001", 2, 3) ' 001
Debug.Print Trim(" Keyboard ") ' Keyboard
Debug.Print Len("Laptop Stand") ' 12
Debug.Print InStr("Wireless Mouse", "Mouse") ' 10 (position found)
UCase et LCase sont utiles pour effectuer des comparaisons insensibles à la casse, par exemple, If UCase(category) = UCase("electronics") Then fonctionne quel que soit la casse d'origine de la catégorie. Left, Right et Mid extraient tous une partie d'une chaîne, la différence résidant dans le point de départ du comptage : Left et Right comptent à partir des deux extrémités, tandis que Mid prend une position de départ et une longueur, ce qui explique pourquoi Mid("P001", 2, 3) et Right("P001", 3) renvoient ici la même chose — "P001" n'a qu'un seul caractère préfixe, donc "à partir de la position 2" et "les 3 derniers caractères" aboutissent à la même sous-chaîne. Trim supprime discrètement les espaces en début et fin de chaîne — une fonction peu spectaculaire mais précieuse lorsque les données ont été copiées-collées avec des espacements incohérents. InStr recherche une chaîne dans une autre et retourne la position où elle est trouvée (ou 0 si elle n'est pas présente), ce qui permet de tester "ce nom de produit contient-il le mot Mouse ?" sans exiger une correspondance exacte.
Fonctions numériques
Debug.Print Round(24.996, 2) ' 25
Debug.Print Abs(-15) ' 15
Debug.Print Int(7.9) ' 7
Round et Int réduisent tous deux un nombre, mais de manière différente — Round(24.996, 2) arrondit à la valeur la plus proche avec 2 décimales (25,00, affiché comme 25), tandis que Int(7.9) tronque toujours vers zéro, quel que soit le rapprochement de la décimale à l'entier supérieur, donnant 7 au lieu de 8. Confondre ces deux fonctions est une source fréquente d'erreurs de tarification : l'arrondi d'un prix au centime le plus proche doit presque toujours utiliser Round, pas Int, sinon vous sous-facturerez systématiquement de quelques centimes à chaque transaction.
Conversion de type
Essentiel lors de l'extraction de valeurs depuis une feuille, car les valeurs de cellule arrivent souvent en Variant :
Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText) ' text → number
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)
CDbl convertit en Double, CInt en Integer, CStr convertit en String et CDate convertit en une vraie valeur Date.
Pourquoi ne pas laisser VBA convertir automatiquement si besoin ? Il le fait généralement, mais s'y fier est risqué : une cellule qui semble contenir un nombre mais a été saisie ou importée comme texte peut faire échouer une comparaison If ou une opération arithmétique, ou produire un comportement inattendu. La conversion explicite permet de détecter ce problème immédiatement, avec une erreur à la ligne exacte où se trouve la donnée incorrecte, plutôt que plusieurs étapes plus loin.
Tâche
- Écrire une ligne qui extrait uniquement la partie numérique de "P003" en utilisant
Mid(indice : commencer à la position 2). - Écrire une ligne qui convertit ce texte extrait en un nombre réel avec
CIntouCLng. - Utiliser
DateDiffpour calculer combien de jours se sont écoulés depuis l'embauche d'Emma Davis (15/03/2020) par rapport à aujourd'hui.
1. Extraction de la partie numérique
Midprend trois éléments : la chaîne elle-même, la position de départ et le nombre de caractères à extraire.- "P003" contient une lettre suivie de trois chiffres — il faut ignorer le "P" et récupérer tout ce qui suit.
- La position de départ 2 signifie « commencer au 2e caractère » — comptez "P003" sur vos doigts pour confirmer que la position 2 correspond au premier "0".
2. Conversion en nombre réel
- Ce que renvoie
Midreste du texte, même si cela ressemble à un nombre. - Encapsulez toute l'expression
Mid(...)dansCInt(...)ouCLng(...)— vous convertissez le résultat d'une fonction à l'aide d'une autre. - Rappel du début du chapitre :
CInt/CLngconvertissent du texte en nombre entier ; utilisezCLngsi le nombre peut être grand.
3. Nombre de jours depuis la date d'embauche
DateDiffnécessite trois éléments : l'unité de mesure ("d" pour jours), une date de début et une date de fin.- La difficulté réside dans l'écriture d'une date littérale en VBA — entourez-la de symboles
#, comme#03/15/2020#. À l'intérieur de#...#, VBA attend toujours le format mois/jour/année, quel que soit le paramétrage régional — donc le 15 mars s'écrit#03/15/2020#, et non#15/03/2020#. - Pour « aujourd'hui », il n'est pas nécessaire de saisir une date — il existe un mot-clé de la section 2.3 qui renvoie toujours la date du jour.
- Placez ces deux dates dans
DateDiffdans le bon ordre — la date la plus ancienne en premier — sinon vous obtiendrez un nombre négatif.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion