Accueil | Ce site | CV | Excel | Livre d’or | Macros XL4 | Modèles | VBA

 Conversion entre types de données

Il est parfois nécessaire d’opé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.

Fonctions de conversion

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

L’un des cas les plus fréquents où ces fonctions sont nécessaires est le traitement des données provenant d’un contrôle TextBox. Comme son nom l’indique, 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 d’une date, il faudra utiliser CDate(TDate) avant de reporter la date dans une feuille de calcul.

Conversion automatique

VBA offre une certaine souplesse en matière de type de données. Dans certains cas, une conversion automatique peut s’opé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 qu’on tente de lui affecter quelque chose qui n’est 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 n’est pas un entier, mais appartient à la plage des Integer : -32 768 <= 1,24 <= 32 767.

Dans ces conditions l’affectation i = d provoque l’arrondi à l'entier le plus proche, 1.

NB - VBA n’est pas localisé ; il n’existe pas de version française, italienne ou japonaise. Seule l’interface et les fichiers d’aide sont traduits. Par conséquent, il FAUT utiliser le point comme séparateur décimal, comme si on utilisait une version américaine d’Excel.

C’est pourquoi la ligne d = 1,24 apparaît en rouge dans la procédure Test2Integer. Par défaut, c’est en effet le rouge qui souligne les erreurs de syntaxe. Si on lance cette procédure on obtient un message d’erreur (figure 2).

Sub Test2Integer()
Dim i As Integer, d As Double
    d = 1,24
    i = d
    MsgBox i
End Sub


Fig. 2 - Message d’erreur dû à l’emploi 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 d’erreur est affiché (figure 3).

Sub Test3Integer()
Dim i As Integer, d As Double
    d = 100000
    i = d
    MsgBox i
End Sub


Fig. 3 - Message d’erreur dû à la tentative d’affecter à 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 n’est pas initialisée et contient donc une chaine vide. Aucune conversion n’est possible, et le lancement de la procédure déclenche un troisième message d’erreur (figure 4)

Sub Test4Integer()
Dim i As Integer, s As String
    i = s
End Sub


Fig. 4 - Message d'erreur dû à la tentative d’affecter 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 à l’intervalle -32 768 à 32 767. C’est 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
d’affecter à un Integer une chaine de caractères ne contenant que des chiffres, "24".