Macros-commandes VBA/Les types en VB
Différents types
modifierProgrammer, 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] :
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
modifierPour 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 |
IsDate |
Oui | Oui | Oui | Oui | Oui |
IsDBNull |
Non | Non | Non | Oui | Non |
IsEmpty |
Oui | Oui | Oui | Non | Non |
IsError |
Oui | Oui | Non | Oui | Non |
IsMissing |
Oui | Oui | Non | Non | Non |
IsNothing |
Non | Non | Non | Oui | Non |
IsNull |
Oui | Oui | Oui | Non | Oui |
IsNumeric |
Oui | Oui | Oui | Oui | Oui |
IsObject |
Oui | Oui | Oui | Non | Non |
IsReference |
Non | Non | Non | Oui | Non |
Déclaration des types
modifierLes types des variables sont donc déclarés grâce à la commande dim, par exemple pour stocker un nom :
Dim nom as String
Tableaux
modifierLes 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 duDim
pour redimensionner le tableau, afin par exemple que leUBound
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
modifierPour 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
modifierUn 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
modifierLes 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 ligneApplication.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
modifierEn 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
modifierL'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- ↑ http://www.chennaiiq.com/developers/reference/visual_basic/functions/type_conversion_functions.asp
- ↑ https://msdn.microsoft.com/en-us/library/aa263420%28v=vs.60%29.aspx
- ↑ http://support.microsoft.com/kb/105416/fr
- ↑ Marcus et Levy 2002, p. 750–751.
- ↑ Roman, Petrusha et Lomax 2002b, p. 394 et seq..
- ↑ Harris 1999, p. 402–403.
- ↑ Knittel 2002, p. 609.
- ↑ http://msdn.microsoft.com/fr-fr/library/2k7ayc03%28v=vs.80%29.aspx
- ↑ http://silkyroad.developpez.com/vba/tableaux/
- ↑ http://ericrenaud.fr/droitetableaux.htm
- ↑ http://www.excelabo.net/excel/trouver_valeur_array
- ↑ http://msdn.microsoft.com/fr-fr/library/sect4ck6%28v=vs.80%29.aspx
- ↑ http://www.excel-pratique.com/fr/vba/evenements_classeur.php