Accueil | Ce site | CV | Excel | Livre dor | Macros XL4 | Modèles | VBA
Il est parfois nécessaire dopérer une conversion entre types de données. Il existe pour cela une dizaine de fonctions.
Par ailleurs, dans certains cas, une conversion automatique peut intervenir. Cette possibilité peut pallier certaines faiblesses de programmation, mais il est nettement préférable de définir correctement les types de données.
Voici la liste de ces fonctions :
| Nom de la fonction | Type de donnée en résultant |
|---|---|
| CBool | Boolean |
| CByte | Byte |
| CCur | Currency |
| CDate | Date |
| CDbl | Double |
| CDec | Decimal |
| CInt | Integer |
| CLng | Long |
| CSng | Single |
| CVar | Variant |
| CStr | String |
Lun des cas les plus fréquents où ces fonctions sont nécessaires est le traitement des données provenant dun contrôle TextBox. Comme son nom lindique, la propriété Value de ce contrôle est toujours une chaîne de caractères.
Si, par exemple un UserForm contient un TextBox nommé TDate, destiné à la saise dune date, il faudra utiliser CDate(TDate) avant de reporter la date dans une feuille de calcul.
VBA offre une certaine souplesse en matière de type de données. Dans certains cas, une conversion automatique peut sopérer.
Si une variable a été définie comme Integer (rappel, un Integer est un nombre entier compris entre - 32 768 et 32 767, bornes incluses), et quon tente de lui affecter quelque chose qui nest pas un Integer, voici ce qui se passe selon la situation :
La procédure Test1Integer affiche le message reproduit en figure 1.
Sub Test1Integer() Dim i As Integer, d As Double d = 1.24 i = d MsgBox i End Sub

Fig. 1 - Le message affiché par Test1Integer.
En effet, on essaye d'affecter à la variable i, définie comme Integer, la valeur de la variable d. Celle-ci est égale à 1,24 qui nest pas un entier, mais appartient à la plage des Integer : -32 768 <= 1,24 <= 32 767.
Dans ces conditions laffectation i = d provoque larrondi à l'entier le plus proche, 1.
NB - VBA nest pas localisé ; il nexiste pas de version française, italienne ou japonaise. Seule linterface et les fichiers daide sont traduits. Par conséquent, il FAUT utiliser le point comme séparateur décimal, comme si on utilisait une version américaine dExcel.
Cest pourquoi la ligne d = 1,24 apparaît en rouge dans la procédure Test2Integer. Par défaut, cest en effet le rouge qui souligne les erreurs de syntaxe. Si on lance cette procédure on obtient un message derreur (figure 2).
Sub Test2Integer() Dim i As Integer, d As Double d = 1,24 i = d MsgBox i End Sub

Fig. 2 - Message derreur dû à lemploi de la virgule comme séparateur décimal dans Test2Integer.
La procédure Test3Integer ne diffère de Test1Integer que par la valeur de d, 100 000 au lieu de 1,24. Cette fois, la conversion échoue, car d est supérieur à 32 767, la plus grande valeur que peut prendre un Integer. Un autre message derreur est affiché (figure 3).
Sub Test3Integer() Dim i As Integer, d As Double d = 100000 i = d MsgBox i End Sub

Fig. 3 - Message derreur dû à la tentative daffecter à un Integer une valeur trop grande dans Test3Integer.
Dans Test4Integer, la variable d des 3 procédures précédentes est remplacée par s, qui a pour type String (chaîne de caractères). s nest pas initialisée et contient donc une chaine vide. Aucune conversion nest possible, et le lancement de la procédure déclenche un troisième message derreur (figure 4)
Sub Test4Integer() Dim i As Integer, s As String i = s End Sub

Fig. 4 - Message d'erreur dû à la tentative daffecter une chaîne vide (String) à un Integer dans Test4Integer.
Toutefois, une chaîne de caractères peut aussi contenir un nombre, auquel cas la conversion en Integer est possible si ce nombre est un entier appartenant à lintervalle -32 768 à 32 767. Cest ce qui se produit avec Test5Integer (figure 5)
Sub Test5Integer() Dim i As Integer, s As String s = "24" i = s MsgBox i End Sub

Fig. 5 - Le message affiché par Test5Integer. Une conversion automatique a permis
daffecter à un Integer une chaine de caractères ne contenant que des chiffres, "24".