Zoeken…


Byte

Dim Value As Byte

Een byte is een niet-ondertekend 8-bits gegevenstype. Het kan gehele getallen tussen 0 en 255 vertegenwoordigen en een poging om een waarde buiten dat bereik op te slaan, resulteert in runtime error 6: Overflow . Byte is het enige intrinsieke niet-ondertekende type dat beschikbaar is in VBA.

De CByte() om te converteren naar een byte is CByte() . Voor afgietsels van drijvende-kommatypes wordt het resultaat afgerond op de dichtstbijzijnde gehele waarde met .5 naar boven afgerond.

Byte Arrays and Strings

Strings en byte-arrays kunnen elkaar vervangen door eenvoudige toewijzing (geen conversiefuncties nodig).

Bijvoorbeeld:

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

Om Unicode- tekens te kunnen coderen, neemt elk teken in de reeks twee bytes in de array in, met de minst significante byte eerst. Bijvoorbeeld:

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

Geheel getal

Dim Value As Integer

Een geheel getal is een 16-bits gegevenstype. Het kan gehele getallen opslaan in het bereik van -32.768 tot 32.767 en een poging om een waarde buiten dat bereik op te slaan, resulteert in runtime error 6: Overflow.

Gehele getallen worden in het geheugen opgeslagen als little-endian waarden met negatieven weergegeven als een complement van twee .

Merk op dat het in het algemeen beter is om een Long te gebruiken in plaats van een geheel getal, tenzij het kleinere type lid is van een Type of vereist is (hetzij door een API-aanroepconventie of een andere reden) om 2 bytes te zijn. In de meeste gevallen behandelt VBA gehele getallen intern als 32-bits, dus het gebruik van het kleinere type heeft meestal geen voordeel. Bovendien wordt er een prestatieverlies opgelegd telkens wanneer een type Integer wordt gebruikt, omdat het stil als een Long wordt gecast.

De CInt() om te converteren naar een geheel getal is CInt() . Voor afgietsels van drijvende-kommatypes wordt het resultaat afgerond op de dichtstbijzijnde gehele waarde met .5 naar boven afgerond.

Boolean

Dim Value As Boolean

Een Boolean wordt gebruikt om waarden op te slaan die kunnen worden weergegeven als Waar of Onwaar. Intern wordt het gegevenstype opgeslagen als een 16-bits waarde waarbij 0 False vertegenwoordigt en elke andere waarde True.

Opgemerkt moet worden dat wanneer een Boolean naar een numeriek type wordt gegoten, alle bits worden ingesteld op 1. Dit resulteert in een interne weergave van -1 voor ondertekende typen en de maximale waarde voor een niet-ondertekend type (byte).

Dim Example As Boolean
Example = True
Debug.Print CInt(Example)  'Prints -1
Debug.Print CBool(42)      'Prints True
Debug.Print CByte(True)    'Prints 255

De CBool() om te converteren naar een Boolean is CBool() . Hoewel het intern wordt weergegeven als een 16-bits getal, is casten naar een Boolean van waarden buiten dat bereik veilig tegen overloop, hoewel het alle 16 bits instelt op 1:

Dim Example As Boolean
Example = CBool(2 ^ 17)
Debug.Print CInt(Example)   'Prints -1
Debug.Print CByte(Example)  'Prints 255

Lang

Dim Value As Long

A Long is een ondertekend 32-bits gegevenstype. Het kan gehele getallen opslaan in het bereik van -2.147.483.648 tot 2.147.483.647 en een poging om een waarde buiten dat bereik op te slaan zal resulteren in runtime error 6: Overflow.

Longs worden in het geheugen opgeslagen als little-endian waarden met negatieven weergegeven als een complement van twee .

Aangezien een Long overeenkomt met de breedte van een aanwijzer in een 32-bits besturingssysteem, worden Longs gewoonlijk gebruikt voor het opslaan en doorgeven van pointers naar en van API-functies.

De CLng() om te converteren naar een lange is CLng() . Voor afgietsels van drijvende-kommatypes wordt het resultaat afgerond op de dichtstbijzijnde gehele waarde met .5 naar boven afgerond.

single

Dim Value As Single

A Single is een 32-bits gegevenstype met drijvende komma. Het wordt intern opgeslagen met behulp van een little-endian IEEE 754- geheugenlay-out. Als zodanig is er geen vast bereik van waarden dat kan worden weergegeven door het gegevenstype - wat beperkt is, is de precisie van de opgeslagen waarde. Een Single kan een waarde- geheel getal in het bereik van -16.777.216 tot 16.777.216 opslaan zonder verlies van precisie. De precisie van zwevende kommagetallen hangt af van de exponent.

Een Single loopt over als een waarde groter dan ruwweg 2 128 wordt toegewezen. Het zal niet overstromen met negatieve exponenten, hoewel de bruikbare precisie twijfelachtig zal zijn voordat de bovengrens wordt bereikt.

Zoals met alle drijvende-kommagetallen, moet u voorzichtig zijn bij het maken van gelijkheidsvergelijkingen. De beste praktijk is om een deltawaarde op te nemen die geschikt is voor de vereiste precisie.

De casting functie om te zetten naar een Single is CSng() .

Dubbele

Dim Value As Double

Een Double is een 64-bits gegevenstype met drijvende komma. Net als de Single wordt deze intern opgeslagen met behulp van een Little-Endian IEEE 754- geheugenlay-out en moeten dezelfde voorzorgsmaatregelen worden genomen. Een Double kan gehele waarden opslaan tussen -9,007,199,254,740,992 tot 9,007,199,254,740,992 zonder verlies van precisie. De precisie van zwevende kommagetallen hangt af van de exponent.

Een dubbele overloop als een waarde wordt toegewezen die groter is dan ongeveer 2 1024 . Het zal niet overstromen met negatieve exponenten, hoewel de bruikbare precisie twijfelachtig zal zijn voordat de bovengrens wordt bereikt.

De CDbl() om te converteren naar een Double is CDbl() .

Valuta

Dim Value As Currency

Een valuta is een 64-bits gegevenstype met drijvende komma, vergelijkbaar met een dubbel , maar geschaald met 10.000 om de 4 cijfers rechts van de komma nauwkeuriger te maken. Een valutavariabele kan waarden opslaan van -922.337.203.685.477.5808 tot 922.337.203.685.477.5807 en heeft daarmee de grootste capaciteit van elk intrinsiek type in een 32-bits toepassing. Zoals de naam van het gegevenstype impliceert, wordt het als een goede praktijk beschouwd om dit gegevenstype te gebruiken bij het weergeven van monetaire berekeningen, omdat de schaling helpt om afrondingsfouten te voorkomen.

De CCur() om te converteren naar een valuta is CCur() .

Datum

Dim Value As Date

Een datumtype wordt intern weergegeven als een ondertekend 64-bit drijvend gegevenstype met de waarde links van het decimaal dat het aantal dagen vanaf de epochdatum van 30 december 1899 vertegenwoordigt (hoewel de opmerking hieronder wordt weergegeven). De waarde rechts van de komma vertegenwoordigt de tijd als een fractionele dag. Dus een geheel getal Date zou een tijdcomponent hebben van 12:00:00 AM en x.5 zou een tijdcomponent hebben van 12:00:00 PM.

Geldige waarden voor data tussen 1 januari ste 100 en december 9999. 31 Omdat een dubbele een groter bereik, is het mogelijk een overloop Datum van externe toekennen van waarden van dat bereik.

Als zodanig kan het uitwisselbaar worden gebruikt met een Double for Date-berekeningen:

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.

De CDate() om te converteren naar een datum is CDate() , die elke numerieke tekenreeks datum / tijd representatie accepteert. Het is belangrijk op te merken dat tekenreeksrepresentaties van datums worden geconverteerd op basis van de huidige locale-instelling die wordt gebruikt, dus directe casts moeten worden vermeden als de code draagbaar is.

Draad

Een tekenreeks vertegenwoordigt een reeks tekens en heeft twee smaken:

Variabele lengte

Dim Value As String

Een string met variabele lengte maakt optellen en afkappen mogelijk en wordt als COM BSTR in het geheugen opgeslagen. Dit bestaat uit een niet-ondertekend geheel getal van 4 bytes dat de lengte van de String opslaat in bytes, gevolgd door de stringgegevens zelf als brede tekens (2 bytes per karakter) en afgesloten met 2 nulbytes. De maximale tekenreekslengte die door VBA kan worden verwerkt, is dus 2.147.483.647 tekens.

De interne aanwijzer naar de structuur (op te halen met de functie StrPtr() ) StrPtr() naar de geheugenlocatie van de gegevens , niet naar het voorvoegsel lengte. Dit betekent dat een VBA-string rechtstreeks API-functies kan worden doorgegeven waarvoor een pointer naar een tekenreeks nodig is.

Omdat de lengte kan veranderen, wijst VBA het geheugen opnieuw toe voor een String telkens wanneer de variabele wordt toegewezen , wat prestatieboetes kan opleggen voor procedures die ze herhaaldelijk wijzigen.

Vaste lengte

Dim Value As String * 1024    'Declares a fixed length string of 1024 characters.

Strings met een vaste lengte krijgen 2 bytes toegewezen voor elk karakter en worden in het geheugen opgeslagen als een eenvoudige byte-array. Eenmaal toegewezen, is de lengte van de String onveranderlijk. Ze zijn niet null beëindigd in het geheugen, dus een string die het geheugen vult dat is toegewezen met niet-null tekens is niet geschikt om door te geven aan API-functies die een null-terminated string verwachten.

Tekenreeksen met een vaste lengte hebben een oudere 16-bits indexbeperking, dus kunnen maximaal 65.535 tekens lang zijn. Als u probeert een waarde toe te kennen die langer is dan de beschikbare geheugenruimte, leidt dit niet tot een runtime-fout - in plaats daarvan wordt de resulterende waarde gewoon afgekapt:

Dim Foobar As String * 5
Foobar = "Foo" & "bar"
Debug.Print Foobar          'Prints "Fooba"

De castingfunctie om te converteren naar een string van beide typen is CStr() .

Lang Lang

Dim Value As LongLong

Een LongLong is een ondertekend 64-bits gegevenstype en is alleen beschikbaar in 64-bits toepassingen. Het is niet beschikbaar in 32-bits applicaties die op 64-bits besturingssystemen draaien. Het kan gehele waarden opslaan binnen het bereik van -9.223.372.036.854.775.808 tot 9.223.372.036.854.775.807 en een poging om een waarde buiten dat bereik op te slaan zal resulteren in runtime error 6: Overflow.

LongLongs worden in het geheugen opgeslagen als little-endian waarden met negatieven weergegeven als een complement van twee .

Het gegevenstype LongLong werd geïntroduceerd als onderdeel van de ondersteuning van 64-bits besturingssysteem van VBA. In 64-bits applicaties kan deze waarde worden gebruikt om pointers op te slaan en door te geven aan 64-bits API's.

De castingfunctie om te converteren naar een LongLong is CLngLng() . Voor afgietsels van drijvende-kommatypes wordt het resultaat afgerond op de dichtstbijzijnde gehele waarde met .5 naar boven afgerond.

Variant

Dim Value As Variant    'Explicit
Dim Value               'Implicit

Een variant is een COM-gegevenstype dat wordt gebruikt voor het opslaan en uitwisselen van waarden van willekeurige typen, en elk ander type in VBA kan worden toegewezen aan een variant. Variabelen gedeclareerd zonder een expliciet type opgegeven door Standaard As [Type] .

Varianten worden in het geheugen opgeslagen als een VARIANT-structuur die bestaat uit een byte type descriptor ( VARTYPE ) gevolgd door 6 gereserveerde bytes en vervolgens een gegevensgebied van 8 bytes. Voor numerieke typen (inclusief datum en Boolean) wordt de onderliggende waarde opgeslagen in de variant zelf. Voor alle andere typen bevat het gegevensgebied een aanwijzer naar de onderliggende waarde.

voer hier de afbeeldingsbeschrijving in

Het onderliggende type van een variant kan worden bepaald met de functie VarType() die de numerieke waarde retourneert die is opgeslagen in de TypeName() , of de functie TypeName() die de tekenreeksrepresentatie retourneert:

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"

Omdat Varianten waarden kunnen opslaan van elke soort, opdrachten van letterlijke zonder soort hints wordt impliciet uitgebrachte variant van hetzelfde type volgens de onderstaande tabel. Letterlijke typen met hints worden naar een variant van het hinttype gegoten.

Waarde Resulterend type
Stringwaarden Draad
Niet-zwevende kommagetallen in Integer-bereik Geheel getal
Niet-zwevende puntnummers op lange afstand Lang
Niet-zwevende puntnummers buiten het lange bereik Dubbele
Alle getallen met drijvende komma Dubbele

Opmerking: Tenzij er een specifieke reden is om een variant te gebruiken (dwz een iterator in een For Each-lus of een API-vereiste), moet het type in het algemeen worden vermeden voor routinetaken om de volgende redenen:

  • Ze zijn niet type-veilig, waardoor de kans op runtime-fouten toeneemt. Een Variant met een Integer-waarde verandert bijvoorbeeld in stilte in een Long in plaats van dat deze overloopt.
  • Ze introduceren verwerkingsoverhead door ten minste één extra verwijzing naar de aanwijzer te vereisen.
  • De geheugenvereiste voor een variant is altijd minimaal 8 bytes hoger dan nodig is om het onderliggende type op te slaan.

De CVar() om te converteren naar een variant is CVar() .

LongPtr

Dim Value As LongPtr

De LongPtr werd geïntroduceerd in VBA om 64-bit platforms te ondersteunen. Op een 32-bits systeem wordt het behandeld als een Long en op 64-bits systemen wordt het behandeld als een LongLong .

Het primaire gebruik is het bieden van een draagbare manier om pointers op beide architecturen op te slaan en door te geven (zie Codegedrag tijdens het compileren wijzigen .

Hoewel het door het besturingssysteem wordt behandeld als een geheugenadres bij gebruik in API-aanroepen, moet worden opgemerkt dat VBA het als een ondertekend type behandelt (en daarom onderhevig is aan niet-ondertekende tot ondertekende overloop). Om deze reden mag elke aanwijzerberekening die is uitgevoerd met LongPtrs geen > of < -vergelijkingen gebruiken. Deze "gril" maakt het ook mogelijk dat het toevoegen van eenvoudige offsets die verwijzen naar geldige adressen in het geheugen, overloopfouten kunnen veroorzaken, dus wees voorzichtig bij het werken met pointers in VBA.

De castingfunctie om te converteren naar een LongPtr is CLngPtr() . Voor afgietsels van drijvende-komma-typen wordt het resultaat afgerond op de dichtstbijzijnde gehele waarde met .5 naar boven afgerond (hoewel het meestal een geheugenadres is, is het op zijn best gevaarlijk om het als toewijzingsdoel voor een berekening van een drijvende komma te gebruiken).

Decimale

Dim Value As Variant
Value = CDec(1.234)

'Set Value to the smallest possible Decimal value
Value = CDec("0.0000000000000000000000000001")

Het gegevenstype Decimal is alleen beschikbaar als een subtype van Variant , dus u moet elke variabele die een Decimal moet bevatten als Variant declareren en vervolgens een Decimal waarde toewijzen met de CDec functie. Het sleutelwoord Decimal is een gereserveerd woord (wat suggereert dat VBA uiteindelijk eersteklas ondersteuning voor het type zou toevoegen), dus Decimal kan niet worden gebruikt als variabele of procedurenaam.

Het Decimal type vereist 14 bytes geheugen (naast de bytes vereist door de bovenliggende variant) en kan getallen opslaan met maximaal 28 decimalen. Voor getallen zonder decimalen is het bereik van toegestane waarden -79.228.162.514.264.337.593.543.950.335 tot +79.228.162.514.264.337.593.543.950.335. Voor getallen met maximaal 28 decimalen is het bereik van toegestane waarden -7.9228162514264337593543950335 tot +7.9228162514264337593543950335.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow