VBA
Types de données et limites
Recherche…
Octet
Dim Value As Byte
Un octet est un type de données non signé de 8 bits. Il peut représenter des nombres entiers compris entre 0 et 255 et tenter de stocker une valeur en dehors de cette plage entraîne l' erreur d'exécution 6: Overflow
. Byte est le seul type non signé intrinsèque disponible dans VBA.
La fonction de conversion en un octet est CByte()
. Pour les moulages à partir de types à virgule flottante, le résultat est arrondi à la valeur entière la plus proche, avec un arrondi de 0,5.
Byte Arrays et Strings
Les chaînes et les tableaux d'octets peuvent être remplacés par une simple affectation (aucune fonction de conversion nécessaire).
Par exemple:
Sub ByteToStringAndBack()
Dim str As String
str = "Hello, World!"
Dim byt() As Byte
byt = str
Debug.Print byt(0) ' 72
Dim str2 As String
str2 = byt
Debug.Print str2 ' Hello, World!
End Sub
Pour pouvoir encoder des caractères Unicode , chaque caractère de la chaîne occupe deux octets dans le tableau, l'octet le moins significatif étant le premier. Par exemple:
Sub UnicodeExample()
Dim str As String
str = ChrW(&H2123) & "." ' Versicle character and a dot
Dim byt() As Byte
byt = str
Debug.Print byt(0), byt(1), byt(2), byt(3) ' Prints: 35,33,46,0
End Sub
Entier
Dim Value As Integer
Un entier est un type de données signé 16 bits. Il peut stocker des nombres entiers compris entre -32 768 et 32 767 et toute tentative de stockage d'une valeur en dehors de cette plage entraîne l'erreur d'exécution 6: dépassement de capacité.
Les entiers sont stockés en mémoire sous forme de valeurs little-endian avec des négatifs représentés par un complément à deux .
Notez qu'en général, il est préférable d'utiliser un long plutôt qu'un entier à moins que le plus petit type soit membre d'un type ou qu'il soit requis (par une convention d'appel API ou pour toute autre raison) pour qu'il soit 2 octets. Dans la plupart des cas, VBA traite les entiers en 32 bits en interne, ce qui signifie qu’il n’ya généralement aucun avantage à utiliser un type plus petit. De plus, une pénalité de performance est encourue chaque fois qu'un type Integer est utilisé car il est lancé silencieusement en tant que Long.
La fonction de conversion en un entier est CInt()
. Pour les moulages à partir de types à virgule flottante, le résultat est arrondi à la valeur entière la plus proche, avec un arrondi de 0,5.
Booléen
Dim Value As Boolean
Un booléen permet de stocker des valeurs pouvant être représentées par True ou False. En interne, le type de données est stocké sous forme de valeur 16 bits avec 0 représentant la valeur False et toute autre valeur représentant True.
Il convient de noter que lorsqu'un booléen est converti en un type numérique, tous les bits sont définis sur 1. Cela se traduit par une représentation interne de -1 pour les types signés et la valeur maximale pour un type non signé (octet).
Dim Example As Boolean
Example = True
Debug.Print CInt(Example) 'Prints -1
Debug.Print CBool(42) 'Prints True
Debug.Print CByte(True) 'Prints 255
La fonction de conversion pour convertir en booléen est CBool()
. Même s'il est représenté en interne sous la forme d'un nombre à 16 bits, la conversion en booléen à partir de valeurs situées en dehors de cette plage est protégée contre le débordement, bien qu'il définisse tous les 16 bits sur 1:
Dim Example As Boolean
Example = CBool(2 ^ 17)
Debug.Print CInt(Example) 'Prints -1
Debug.Print CByte(Example) 'Prints 255
Longue
Dim Value As Long
Un long est un type de données 32 bits signé. Il peut stocker des nombres entiers compris entre -2 147 483 648 et 2 147 483 647, et tenter de stocker une valeur en dehors de cette plage entraînera une erreur d'exécution 6: dépassement de capacité.
Les longues sont stockées en mémoire sous forme de valeurs peu endiennes avec des négatifs représentés par un complément à deux .
Notez que comme un Long correspond à la largeur d'un pointeur dans un système d'exploitation 32 bits, les Longs sont couramment utilisés pour stocker et transmettre des pointeurs vers et depuis des fonctions API.
La fonction de conversion pour convertir en un long est CLng()
. Pour les moulages à partir de types à virgule flottante, le résultat est arrondi à la valeur entière la plus proche, avec un arrondi de 0,5.
Unique
Dim Value As Single
Un Single est un type de données à virgule flottante 32 bits signé. Il est stocké en interne en utilisant une disposition de mémoire IEEE 754 peu endian . En tant que tel, il n'y a pas de plage de valeurs fixe pouvant être représentée par le type de données - ce qui est limité est la précision de la valeur stockée. Un seul peut stocker une valeur entière de valeurs comprise entre -16 777 216 et 16 777 216 sans perte de précision. La précision des nombres à virgule flottante dépend de l'exposant.
Un seul dépassera si une valeur supérieure à environ 2 128 est attribuée. Il ne débordera pas d'exposants négatifs, bien que la précision utilisable soit discutable avant que la limite supérieure soit atteinte.
Comme avec tous les nombres à virgule flottante, il faut faire attention lors des comparaisons d'égalité. La meilleure pratique consiste à inclure une valeur delta adaptée à la précision requise.
La fonction de conversion en un seul est CSng()
.
Double
Dim Value As Double
Un double est un type de données à virgule flottante 64 bits signé. Comme le Single , il est stocké en interne à l’aide d’une mémoire IEEE 754 peu volumineuse et les mêmes précautions concernant la précision doivent être prises. Un double peut stocker des valeurs entières comprises entre -9 007 199 et 254 740 992 et 9 007 199 254 740 992 sans perte de précision. La précision des nombres à virgule flottante dépend de l'exposant.
Un Double débordera si une valeur supérieure à environ 2 1024 lui est attribuée. Il ne débordera pas d'exposants négatifs, bien que la précision utilisable soit discutable avant que la limite supérieure soit atteinte.
La fonction de conversion en double est CDbl()
.
Devise
Dim Value As Currency
Une devise est un type de données en virgule flottante de 64 bits signé similaire à un double , mais mis à l'échelle de 10 000 pour donner une plus grande précision aux 4 chiffres à droite du séparateur décimal. Une variable de devise peut stocker des valeurs de -922 337 203 685 477,5808 à 922 337 203 685 477,5807, ce qui lui donne la plus grande capacité de tout type intrinsèque dans une application 32 bits. Comme le nom du type de données l'indique, il est recommandé d'utiliser ce type de données lors de la représentation des calculs monétaires, car la mise à l'échelle permet d'éviter les erreurs d'arrondi.
La fonction de conversion en une devise est CCur()
.
Rendez-vous amoureux
Dim Value As Date
Un type de date est représentée en interne comme un type de données à virgule flottante signé 64 bits avec la valeur à la gauche de la décimale représentant le nombre de jours à compter de la date de l' époque du 30 Décembre 1899 (bien que voir la note ci - dessous). La valeur à droite de la décimale représente l'heure sous forme de jour fractionnaire. Ainsi, un entier Date aurait un composant temps de 12:00:00 AM et x.5 aurait un composant heure de 12:00:00 PM.
Les valeurs valides pour les dates sont entre le 1 er 100 et 31 Décembre 9999. Janvier Puisqu'une double a une portée plus grande, il est possible de déborder une date en attribuant des valeurs en dehors de cette plage.
En tant que tel, il peut être utilisé indifféremment avec un calcul Double pour la date:
Dim MyDate As Double
MyDate = 0 'Epoch date.
Debug.Print Format$(MyDate, "yyyy-mm-dd") 'Prints 1899-12-30.
MyDate = MyDate + 365
Debug.Print Format$(MyDate, "yyyy-mm-dd") 'Prints 1900-12-30.
La fonction de conversion à convertir en Date est CDate()
, qui accepte toute représentation par date / heure de type chaîne numérique. Il est important de noter que les représentations sous forme de chaîne des dates seront converties en fonction des paramètres régionaux en cours d'utilisation. Par conséquent, les distributions directes doivent être évitées si le code est censé être portable.
Chaîne
Une chaîne représente une séquence de caractères et se présente sous deux formes:
Longueur variable
Dim Value As String
Une chaîne de longueur variable permet l'ajout et la troncature et est stockée en mémoire en tant que COM BSTR . Cela consiste en un entier non signé de 4 octets qui stocke la longueur de la chaîne en octets, suivie des données de la chaîne elle-même sous la forme de caractères larges (2 octets par caractère) et se termine par 2 octets nuls. Ainsi, la longueur maximale de chaîne pouvant être gérée par VBA est de 2 147 483 647 caractères.
Le pointeur interne à la structure (récupérable par la fonction StrPtr()
) pointe sur l’emplacement mémoire des données et non sur le préfixe de longueur. Cela signifie qu'une chaîne VBA peut être transmise directement aux fonctions API nécessitant un pointeur sur un tableau de caractères.
Étant donné que la longueur peut changer, VBA réaffecte la mémoire pour une chaîne à chaque affectation de la variable , ce qui peut entraîner des pénalités de performance pour les procédures qui les modifient de manière répétée.
Longueur fixe
Dim Value As String * 1024 'Declares a fixed length string of 1024 characters.
Les chaînes de longueur fixe se voient attribuer 2 octets pour chaque caractère et sont stockées en mémoire sous la forme d'un tableau d'octets simple. Une fois allouée, la longueur de la chaîne est immuable. Ils ne sont pas terminés par la valeur NULL en mémoire, de sorte qu'une chaîne remplissant la mémoire allouée avec des caractères non nuls ne convient pas pour être transmise aux fonctions de l'API qui attendent une chaîne terminée par un caractère nul.
Les chaînes de longueur fixe transmettent une limitation d'index 16 bits héritée, elles ne peuvent donc comporter que 65 535 caractères. Tenter d'attribuer une valeur plus longue que l'espace mémoire disponible n'entraînera pas d'erreur d'exécution. La valeur résultante sera simplement tronquée:
Dim Foobar As String * 5
Foobar = "Foo" & "bar"
Debug.Print Foobar 'Prints "Fooba"
La fonction de conversion pour convertir en une chaîne de l'un ou l'autre type est CStr()
.
LongLong
Dim Value As LongLong
Un LongLong est un type de données 64 bits signé et n'est disponible que dans les applications 64 bits. Il n'est pas disponible dans les applications 32 bits fonctionnant sur des systèmes d'exploitation 64 bits. Il peut stocker des valeurs entières comprises entre -9,223,372,036,854,775,808 et 9,223,372,036,854,775,807 et tenter de stocker une valeur en dehors de cette plage entraînera une erreur d'exécution 6: dépassement de capacité.
Les LongLongs sont stockés en mémoire sous forme de valeurs little-endian avec des négatifs représentés par un complément à deux .
Le type de données LongLong a été introduit dans le cadre de la prise en charge du système d'exploitation 64 bits de VBA. Dans les applications 64 bits, cette valeur peut être utilisée pour stocker et transmettre des pointeurs à des API 64 bits.
La fonction de conversion pour convertir en LongLong est CLngLng()
. Pour les moulages à partir de types à virgule flottante, le résultat est arrondi à la valeur entière la plus proche, avec un arrondi de 0,5.
Une variante
Dim Value As Variant 'Explicit
Dim Value 'Implicit
Un Variant est un type de données COM utilisé pour stocker et échanger des valeurs de types arbitraires, et tout autre type dans VBA peut être affecté à un Variant. Variables déclarées sans type explicite spécifié par As [Type]
par défaut à Variant.
Les variantes sont stockées en mémoire sous la forme d'une structure VARIANT constituée d'un descripteur de type d'octet ( VARTYPE ) suivi de 6 octets réservés puis d'une zone de données de 8 octets. Pour les types numériques (y compris Date et Boolean), la valeur sous-jacente est stockée dans le Variant lui-même. Pour tous les autres types, la zone de données contient un pointeur sur la valeur sous-jacente.
Le type sous-jacent d'un Variant peut être déterminé avec la fonction VarType()
qui renvoie la valeur numérique stockée dans le descripteur de type ou la fonction TypeName()
qui renvoie la représentation sous forme de chaîne:
Dim Example As Variant
Example = 42
Debug.Print VarType(Example) 'Prints 2 (VT_I2)
Debug.Print TypeName(Example) 'Prints "Integer"
Example = "Some text"
Debug.Print VarType(Example) 'Prints 8 (VT_BSTR)
Debug.Print TypeName(Example) 'Prints "String"
Comme les variantes peuvent stocker des valeurs de n'importe quel type, les affectations de littéraux sans indications de type seront implicitement converties en un variant du type approprié, conformément au tableau ci-dessous. Les littéraux avec des indications de type seront convertis en une variante du type suggéré.
Valeur | Type résultant |
---|---|
Valeurs de chaîne | Chaîne |
Nombres non flottants dans la plage entière | Entier |
Nombres non flottants dans la plage longue | Longue |
Nombre non flottant en dehors de Long range | Double |
Tous les nombres à virgule flottante | Double |
Remarque: Sauf s'il existe une raison spécifique d'utiliser un variant (c'est-à-dire un itérateur dans une boucle For Each ou une exigence API), le type doit généralement être évité pour les tâches de routine pour les raisons suivantes:
- Ils ne sont pas sécurisés, ce qui augmente la possibilité d'erreurs d'exécution. Par exemple, un Variant contenant une valeur Integer changera silencieusement en Long au lieu de déborder.
- Ils introduisent une surcharge de traitement en exigeant au moins une déréférence de pointeur supplémentaire.
- La mémoire requise pour un variant est toujours supérieure d' au moins 8 octets à celle nécessaire pour stocker le type sous-jacent.
La fonction de conversion en une variante est CVar()
.
LongPtr
Dim Value As LongPtr
Le LongPtr a été introduit dans VBA afin de prendre en charge les plates-formes 64 bits. Sur un système 32 bits, il est traité comme un Long et sur les systèmes 64 bits, il est traité comme un LongLong .
Son utilisation principale consiste à fournir un moyen portable de stocker et de transmettre des pointeurs sur les deux architectures (voir Modification du comportement du code au moment de la compilation) .
Bien qu'il soit traité par le système d'exploitation comme une adresse mémoire lorsqu'il est utilisé dans les appels d'API, il convient de noter que VBA le traite comme un type signé (et donc sujet à un débordement signé ou non signé). Pour cette raison, toute arithmétique de pointeur effectuée à l'aide de LongPtrs ne doit pas utiliser >
ou <
comparaisons. Cette «bizarrerie» permet également d’ajouter des décalages simples pointant vers des adresses valides en mémoire, ce qui peut entraîner des erreurs de dépassement, il faut donc être prudent lorsque vous utilisez des pointeurs dans VBA.
La fonction de conversion pour convertir en LongPtr est CLngPtr()
. Pour les conversions à partir de types à virgule flottante, le résultat est arrondi à la valeur entière la plus proche, avec un arrondi supérieur à 0,5 (bien qu’il s’agisse généralement d’une adresse mémoire, son utilisation au mieux est dangereuse).
Décimal
Dim Value As Variant
Value = CDec(1.234)
'Set Value to the smallest possible Decimal value
Value = CDec("0.0000000000000000000000000001")
Le type de données Decimal
est uniquement disponible en tant que sous-type de Variant
. Vous devez donc déclarer toute variable devant contenir un Decimal
tant que Variant
, puis attribuer une valeur Decimal
à l'aide de la fonction CDec
. Le mot-clé Decimal
est un mot réservé (ce qui suggère que VBA allait éventuellement ajouter un support de première classe pour le type), de sorte que Decimal
ne peut pas être utilisé comme nom de variable ou de procédure.
Le type Decimal
nécessite 14 octets de mémoire (en plus des octets requis par le variant parent) et peut stocker des nombres comportant jusqu'à 28 décimales. Pour les nombres sans aucune décimale, la plage des valeurs autorisées est de -79 228 162 162 514 264 333 593 543 950 335 à +79 228 162 514 514 264 inclus. Pour les nombres ayant au maximum 28 décimales, la plage de valeurs autorisées est comprise entre -7,9228162514264337593543950335 et +7,9228162514264337593543950335 inclus.