Macros-commandes VBA/Les types en VB
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] :
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 |
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
[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 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
[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 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
[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]- ↑ 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