< Macros-commandes VBA
fin de la boite de navigation du chapitre

Différents types

Programmer, c’est avant tout manipuler des variables, qui peuvent être de plusieurs types selon les données que l’on stocke dedans. Il est primordial de les avoir à l'esprit, car par exemple si on compare un nombre et un texte (ex : 1 < "2"), le résultat pourra être le contraire de celui attendu.

Il existe ainsi en VB de nombreux types, dont les plus courants sont résumés ci-dessous[1] :

Types VB les plus couramment rencontrés
TypeDescriptionValeurs possiblesEncombrement mémoire[2]Fonction de conversion
Byte Octet 0 à 255 1 o CByte()
Boolean Booléen True (vrai, -1) ou False (faux, 0) 2 o CBool()
Integer Entier -32 768 (soit ) à 32 767 () 2 o CInt()
Long Entier long -2 147 483 648 (soit ) à 2 147 483 647 () 4 o CLng()
Single Variable à virgule flottante : simple précision de -3.402823 à -1.401298 pour les nombres négatifs

de 1.401298 à 3.402823 pour les nombres positifs

4 o CSng()
Double Variable à virgule flottante : double précision de -1.79769313486232 à -4.94065645841247 pour les nombres négatifs

de 4.94065645841247 à 1.79769313486232 pour les nombres positifs

8 o CDbl()
String Chaîne de caractères (texte unicode) * < 255 o[3] Cstr()
Currency Monnaie 8 o CCur()
Date Date du calendrier grégorien Par défaut la commande Now() renvoie la date actuelle sous la forme 22/06/2012 17:23:58. Mais il est modifiable avec la commande Format(Now(), "yyy-mm-dd"). 8 o CDate()
Decimal Flottant signé 14 o CDec()
Variant Ce type permet de s'adapter à n’importe quel autre type, mais au prix d'une consommation de mémoire importante. Il s'agit du type par défaut des variables non déclarées. 16 o CVar(), CVErr()

Détermination des types

Pour déterminer le type d'une variable, il existe la fonction TypeName() :

MsgBox ("La cellule 1 contient un " & TypeName(Cells(1,1).Value))

On peut aussi utiliser des fonctions booléennes de test :

Fonction VB 6[4][5] VBA[6] VBScript[7] VB .NET T-SQL
IsArrayOuiOuiOuiOuiNon Non
IsDateOuiOuiOuiOuiOui
IsDBNullNon NonNon NonNon NonOuiNon Non
IsEmptyOuiOuiOuiNon NonNon Non
IsErrorOuiOuiNon NonOuiNon Non
IsMissingOuiOuiNon NonNon NonNon Non
IsNothingNon NonNon NonNon NonOuiNon Non
IsNullOuiOuiOuiNon NonOui
IsNumericOuiOuiOuiOuiOui
IsObjectOuiOuiOuiNon NonNon Non
IsReferenceNon NonNon NonNon NonOuiNon Non

Déclaration des types

Les types des variables sont donc déclarés grâce à la commande dim, par exemple pour stocker un nom :

Dim nom as String

Tableaux

Les tableaux se déclarent par le type de leur contenu[8] :

Sub ordinaux()
    Dim liste(2) As String  ' Tableau de trois éléments texte
    
    liste(0) = "premier"
    liste(1) = "deuxième"
    liste(2) = "troisième"
    
    For i = 0 To 2
      MsgBox (liste(i))
    Next
End Sub

Tableau à deux dimensions[9] :

Sub ordinaux2()
    Dim Tabl(2, 1) As String
    Dim LigneTab, ColonneTab As Integer
 
    Tabl(0, 0) = "premier"
    Tabl(1, 0) = "deuxième"
    Tabl(2, 0) = "troisième"
    Tabl(0, 1) = "1er"
    Tabl(1, 1) = "2e"
    Tabl(2, 1) = "3e"
 
    For LigneTab = LBound(Tabl, 1) To UBound(Tabl, 1)
      For ColonneTab = LBound(Tabl, 2) To UBound(Tabl, 2)
        MsgBox (Tabl(LigneTab, ColonneTab))
      Next ColonneTab
    Next LigneTab

    ' reset
    Erase Tabl
    MsgBox UBound(Tabl) ' = 2 car le tableau vide a conservé sa taille
End Sub

Tableau dynamique[10] :

  • Utiliser ReDim au lieu du Dim pour redimensionner le tableau, afin par exemple que le UBound ne considère que le nombre de champs remplis (et non celui déclaré au début).
  • Idem pour ReDim Preserve qui conserve le contenu du tableau redimensionné.

Voir aussi les tableaux Excel.

Recherches

Pour rechercher dans un tableau[11] :

If Not IsError(Application.Match("Valeur", MonTableau, 0)) Then
  MsgBox "Valeur trouvée"
Else
  MsgBox "Valeur non trouvée"
End If

Test si nul

Un tableau déclaré mais non utilisé ne renverra pas une taille zéro avec UBound(), mais une erreur disant que l’indice n'appartient pas à la sélection. Voici donc l’astuce pour vérifier qu'un tableau est vierge :

 if Len(Join(MonTableau)) = 0 then ...

Fonctions

Les fonctions aussi peuvent être de plusieurs types, et sont déclarées ainsi :

Sub NomDeFonction()
 ...
End Sub

Celle-ci ne renvoie rien, c’est l'équivalent du type void en C et en Java.

Ou encore privée avec un paramètre obligatoire :

Private Sub NomDeFonction(NomDuParametre As String)
 ...
End Sub

Publique avec un paramètre facultatif :

Public Sub NomDeFonction2(Optional NomDuParametre2 As Integer)
 ...
End Sub

Pour se servir de la fonction comme d'une variable[12] :

Function NomDeFonction() as String
 ...
 NomDeFonction = "résultat"  ' ou
 return "résultat"
End Function
Remarques
  • Cela peut aussi servir à créer des fonctions pour les formules Excel : une cellule peut contenir =NomDeFonction() si la fonction est placée dans un module et contient la ligne Application.Volatile.
  • Si la fonction est placée dans ThisWorkbook, et s’appelle Sub Auto_open() ou Sub ThisWorkbook_Open(), elle se lance automatiquement à l'ouverture du fichier qui la contient.
  • Si elle s’appelle Auto_close(), elle s'exécutera à la fermeture du fichier[13].

POO

En programmation orientée objets, les procédures correspondent aux classes, et sont stockées dans des fichiers .cls.

  • La déclaration des objets se fait ainsi : Dim NomDeLaVariable As New NomDeLaClasse.
  • Les classes filles spécifient leur classe mère avec le code Implements NomDeLaClasseMere.
Type MaClasse
  Nom As String
  Taille As Long
End Type

On y accède avec MaClasse.Nom.

Collections

L'avantage des collections sur les tableaux est que l’on peut incrémenter la liste à la suite ou insérer une ligne à un endroit, sans connaitre ou modifier manuellement sa taille.

L'exemple suivant affiche "ligne 1", ligne 2", "ligne 3" (sans tenir compte des autres lignes supprimées) :

 Dim Liste As New Collection
 Dim c as Integer ' compteur
 Liste.Add "ligne 1"
 Liste.Add "ligne 3"
 Liste.Add "ligne 2", Before:=2
 Liste.Add "ligne 4"
 Liste.Remove(4)
 For c = 1 To Liste.Count
     MsgBox Liste(c)
 Next c
 ' reset
 Set Liste = New Collection
 MsgBox Liste.Count ' = 0

Références

  1. http://www.chennaiiq.com/developers/reference/visual_basic/functions/type_conversion_functions.asp
  2. https://msdn.microsoft.com/en-us/library/aa263420%28v=vs.60%29.aspx
  3. http://support.microsoft.com/kb/105416/fr
  4. Marcus et Levy 2002, p. 750–751.
  5. Roman, Petrusha et Lomax 2002b, p. 394 et seq..
  6. Harris 1999, p. 402–403.
  7. Knittel 2002, p. 609.
  8. http://msdn.microsoft.com/fr-fr/library/2k7ayc03%28v=vs.80%29.aspx
  9. http://silkyroad.developpez.com/vba/tableaux/
  10. http://ericrenaud.fr/droitetableaux.htm
  11. http://www.excelabo.net/excel/trouver_valeur_array
  12. http://msdn.microsoft.com/fr-fr/library/sect4ck6%28v=vs.80%29.aspx
  13. http://www.excel-pratique.com/fr/vba/evenements_classeur.php
Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.