Macros-commandes VBA/Les types en VB

Leçons de niveau 14
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du chapitre
Les types en VB
Icône de la faculté
Chapitre no 4
Leçon : Macros-commandes VBA
Chap. préc. :Architecture
Chap. suiv. :Manipulation des variables
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Macros-commandes VBA : Les types en VB
Macros-commandes VBA/Les types en VB
 », n'a pu être restituée correctement ci-dessus.

Différents types[modifier | modifier le wikicode]

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
Type Description Valeurs possibles Encombrement 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[modifier | modifier le wikicode]

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
IsArray Oui Oui Oui Oui Non Non
IsDate Oui Oui Oui Oui Oui
IsDBNull Non Non Non Non Non Non Oui Non Non
IsEmpty Oui Oui Oui Non Non Non Non
IsError Oui Oui Non Non Oui Non Non
IsMissing Oui Oui Non Non Non Non Non Non
IsNothing Non Non Non Non Non Non Oui Non Non
IsNull Oui Oui Oui Non Non Oui
IsNumeric Oui Oui Oui Oui Oui
IsObject Oui Oui Oui Non Non Non Non
IsReference Non Non Non Non Non Non Oui Non Non

Déclaration des types[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

  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