Sök…


byte

Dim Value As Byte

En Byte är en ounderskriven 8-bitars datatyp. Det kan representera heltal mellan 0 och 255 och att försöka lagra ett värde utanför det intervallet kommer att leda till körningsfel 6: Overflow . Byte är den enda intrinsiska osignerade typen som finns i VBA.

Gjutningsfunktionen för att konvertera till en Byte är CByte() . För avgjutningar från flytande punkttyper avrundas resultatet till närmaste heltal med 0,5 avrundning.

Byte Arrays and Strings

Strängar och byte-matriser kan ersättas med varandra genom enkel tilldelning (inga konverteringsfunktioner nödvändiga).

Till exempel:

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

För att kunna koda Unicode- tecken tar varje tecken i strängen två byte i matrisen, med den minst signifikanta byten först. Till exempel:

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

Heltal

Dim Value As Integer

Ett heltal är en signerad 16 bitars datatyp. Det kan lagra heltal i intervallet -32,768 till 32,767 och försöker lagra ett värde utanför det intervallet kommer att resultera i körtidfel 6: Överflöde.

Heltal lagras i minnet som små-endian värden med negativa representerade som ett två komplement .

Observera att det i allmänhet är bättre att använda en Long snarare än ett heltal såvida inte den mindre typen är medlem av en typ eller krävs (antingen genom en API-samtalskonvention eller av någon annan anledning) att vara 2 byte. I de flesta fall behandlar VBA heltal som 32-bitars internt, så det är vanligtvis ingen fördel att använda den mindre typen. Dessutom finns det en prestationsstraff som uppstår varje gång en heltalstyp används eftersom den tyst kastas som en lång.

Gjutningsfunktionen för att konvertera till ett heltal är CInt() . För avgjutningar från flytande punkttyper avrundas resultatet till närmaste heltal med 0,5 avrundning.

Boolean

Dim Value As Boolean

En boolean används för att lagra värden som kan representeras som antingen sant eller falskt. Internt lagras datatypen som ett 16-bitarsvärde med 0 som representerar falskt och något annat värde som representerar sant.

Det bör noteras att när en Boolean kastas till en numerisk typ är alla bitarna inställda på 1. Detta resulterar i en internrepresentation av -1 för signerade typer och det maximala värdet för en osignerad typ (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

Gjutningsfunktionen för att konvertera till en Boolean är CBool() . Även om det representeras internt som ett 16-bitarsnummer, är det säkert från överflödet att kasta till en Boolean från värden utanför det området, även om det ställer alla 16 bitar till 1:

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

Lång

Dim Value As Long

A Long är en signerad 32 bitars datatyp. Det kan lagra heltal i intervallet -2,147,483,648 till 2,147,483,647 och försöker lagra ett värde utanför det intervallet kommer att resultera i runtime-fel 6: Överflöde.

Långt lagras i minnet som små-endian värden med negativa representerade som ett två komplement .

Observera att eftersom en Long matchar bredden på en pekare i ett 32-bitars operativsystem används Longs ofta för att lagra och vidarebefordra pekare till och från API-funktioner.

Gjutningsfunktionen för att konvertera till en Long är CLng() . För avgjutningar från flytande punkttyper avrundas resultatet till närmaste heltal med 0,5 avrundning.

Enda

Dim Value As Single

En singel är en signerad 32-bitars datatyp för flytande punkt. Det lagras internt med hjälp av en liten-endian IEEE 754- minneslayout. Som sådan finns det inte ett fast värdeintervall som kan representeras av datatypen - det som är begränsat är precisionen för det lagrade värdet. En singel kan lagra ett heltal med ett heltal i intervallet -16 777 216 till 16 777 216 utan förlust av precision. Precisionen för flytande punktnummer beror på exponenten.

En singel kommer att flyta om den tilldelas ett värde som är större än ungefär 2 128 . Det kommer inte att flöda av negativa exponenter, även om den användbara precisionen kommer att ifrågasättas innan den övre gränsen nås.

Liksom med alla flytande punktnummer bör man vara försiktig när man gör jämställdhetsjämförelser. Bästa praxis är att inkludera ett deltavärde som passar den erforderliga precisionen.

Gjutningsfunktionen för att konvertera till en singel är CSng() .

Dubbel

Dim Value As Double

En dubbel är en signerad 64-bitars datatyp för flytande punkt. Liksom singeln lagras den internt med en liten endian IEEE 754- minneslayout och samma försiktighetsåtgärder för precision bör vidtas. En dubbel kan lagra heltal i intervallet -9,007,199,254,740,992 till 9,007,199,254,740,992 utan förlust av precision. Precisionen för flytande punktnummer beror på exponenten.

En dubbel kommer att flyta om den tilldelas ett värde som är större än ungefär 2 1024 . Det kommer inte att flöda av negativa exponenter, även om den användbara precisionen kommer att ifrågasättas innan den övre gränsen nås.

Gjutningsfunktionen för att konvertera till en dubbel är CDbl() .

Valuta

Dim Value As Currency

En valuta är en signerad 64-bitars flytpunkttatatyp som liknar en dubbel , men skalad med 10.000 för att ge större precision till de 4 siffrorna till höger om decimalpunkten. En valutavariabel kan lagra värden från -922,337,203,685,477,5808 till 922,337,203,685,477,5807, vilket ger den den största kapaciteten av någon intrinsik typ i en 32-bitars applikation. Som namnet på datatypen antyder anses det vara bästa praxis att använda denna datatyp när man representerar monetära beräkningar, eftersom skalningen hjälper till att undvika avrundningsfel.

Gjutningsfunktionen för att konvertera till en valuta är CCur() .

Datum

Dim Value As Date

En Datumtyp representeras internt som ett signerat 64-bitars flyttal datatyp med värdet till vänster om decimaltecknet representerar antalet dagar från den dag den 30 december: e, 1899 epok (även se not nedan). Värdet till höger om decimalen representerar tiden som en bråkdag. Således skulle ett heltal Datum ha en tidskomponent 12:00: 00 AM och x 5 skulle ha en tidskomponent från 12:00:00 PM.

Giltiga värden för Datum är mellan 1 januari st 100 och 31 december st 9999. Eftersom en dubbel har ett större utbud, är det möjligt att svämma över ett datum genom att tilldela värden utanför detta intervall.

Som sådan kan den användas omväxlande med en Double for Date-beräkning:

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.

Gjutningsfunktionen för att konvertera till ett datum är CDate() , som accepterar alla CDate() . Det är viktigt att notera att strängrepresentationer av datum kommer att konverteras baserat på den aktuella platsinställningen som används, så direkta avkastningar bör undvikas om koden är tänkt att vara portabel.

Sträng

En sträng representerar en sekvens av tecken och finns i två smaker:

Variabel längd

Dim Value As String

Sträng med variabel längd tillåter tillägg och avkortning och lagras i minnet som en COM BSTR . Detta består av ett 4-byte osignerat heltal som lagrar strängens längd i byte följt av själva strängdata som breda tecken (2 byte per tecken) och avslutas med 2 nollbyte. Således är den maximala stränglängden som kan hanteras av VBA 2 147 483 647 tecken.

Den interna pekaren till strukturen (som kan hämtas med StrPtr() -funktionen) pekar på minnesplatsen för data , inte längdprefixet. Detta innebär att en VBA-sträng kan skickas direkt API-funktioner som kräver en pekare till en teckenuppsättning.

Eftersom längden kan ändras, omfördelar VBA minne för en sträng varje gång variabeln tilldelas , vilket kan införa prestandaböter för procedurer som ändrar dem upprepade gånger.

Bestämd längd

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

Strängar med fast längd tilldelas 2 byte för varje tecken och lagras i minnet som en enkel byte-grupp. När strängen har tilldelats är strängens längd oföränderlig. De är inte nollavslutade i minnet, så en sträng som fyller minnet som är allokerat med tecken som inte är noll är olämpligt för överföring till API-funktioner som förväntar sig en nollterminerad sträng.

Strängar med fast längd överför en gammal 16-bitars indexbegränsning, så kan endast vara upp till 65 535 tecken i längd. Att försöka tilldela ett värde som är längre än det tillgängliga minnesutrymmet resulterar inte i ett körningsfel - istället kommer det resulterande värdet helt enkelt att trunkeras:

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

Gjutningsfunktionen för att konvertera till en sträng av någon typ är CStr() .

Lång lång

Dim Value As LongLong

En LongLong är en signerad 64 bitars datatyp och är endast tillgänglig i 64 bitars applikationer. Det är inte tillgängligt i 32-bitars applikationer som körs på 64-bitars operativsystem. Det kan lagra heltal i intervallet -9,223,372,036,854,775,808 till 9,223,372,036,854,775,807 och att försöka lagra ett värde utanför det intervallet kommer att resultera i körtidfel 6: Överflöde.

LongLongs lagras i minnet som little-endian värden med negativa representerade som ett två komplement .

LongLong-datatypen introducerades som en del av VBA: s 64-bitars operativsystemstöd. I 64-bitarsapplikationer kan detta värde användas för att lagra och skicka pekare till 64-bitars API: er.

Gjutningsfunktionen för att konvertera till en LongLong är CLngLng() . För avgjutningar från flytande punkttyper avrundas resultatet till närmaste heltal med 0,5 avrundning.

Variant

Dim Value As Variant    'Explicit
Dim Value               'Implicit

En variant är en COM-datatyp som används för att lagra och utbyta värden på godtyckliga typer, och alla andra typer i VBA kan tilldelas en variant. Variabler som deklareras utan en uttrycklig typ som anges av As [Type] standard till Variant.

Varianter lagras i minnet som en VARIANT-struktur som består av en bytyp-deskriptor ( VARTYPE ) följt av 6 reserverade byte och sedan ett 8-byte dataområde . För numeriska typer (inklusive datum och booleska) lagras det underliggande värdet i själva varianten. För alla andra typer innehåller dataområdet en pekare till det underliggande värdet.

ange bildbeskrivning här

Den underliggande typen av en variant kan bestämmas med antingen VarType() som returnerar det numeriska värdet som är lagrat i typbeskrivningen, eller TypeName() som returnerar strängrepresentationen:

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"

Eftersom varianter kan lagra värden av vilken typ som helst, kommer tilldelningar från bokstäver utan typstips att implicit kastas till en variant av lämplig typ enligt tabellen nedan. Bokstäver med typtips kommer att kastas till en variant av den antydda typen.

Värde Resulterande typ
Strängvärden Sträng
Icke-flytande punktnummer i heltal Heltal
Icke-flytande punktnummer i lång räckvidd Lång
Icke-flytande punktnummer utanför lång räckvidd Dubbel
Alla flyttalsnummer Dubbel

Obs: Om det inte finns ett specifikt skäl att använda en variant (dvs. en iterator i en för varje slinga eller ett API-krav), bör typen i allmänhet undvikas för rutinuppgifter av följande skäl:

  • De är inte typsäkra, vilket ökar möjligheten till runtime-fel. Till exempel kommer en variant med ett heltal att ändra sig självt till ett långt istället för att flyta över.
  • De introducerar bearbetningskostnader genom att kräva minst en ytterligare pekarenterferens.
  • Minneskravet för en variant är alltid minst 8 byte högre än vad som behövs för att lagra den underliggande typen.

Gjutningsfunktionen för att konvertera till en variant är CVar() .

LongPtr

Dim Value As LongPtr

LongPtr introducerades i VBA för att stödja 64 bitars plattformar. På ett 32-bitars-system behandlas det som ett långt och på 64-bitars-system behandlas det som ett LongLong .

Den främsta användningen är att tillhandahålla ett portabelt sätt att lagra och skicka pekare på båda arkitekturerna (Se Ändra kodbeteende vid sammanställningstiden) .

Även om det behandlas av operativsystemet som en minnesadress när det används i API-samtal, bör det noteras att VBA behandlar det som signerad typ (och därför föremål för osignerat till signerat överflöde). Av denna anledning bör alla pekarearmetrar som utförs med LongPtrs inte använda > eller < jämförelser. Detta "skämt" gör det också möjligt att lägga till enkla förskjutningar som pekar på giltiga adresser i minnet kan orsaka överflödesfel, så man bör vara försiktig när man arbetar med pekare i VBA.

Gjutningsfunktionen för att konvertera till en LongPtr är CLngPtr() . För avgjutningar från flytande punkttyper avrundas resultatet till närmaste heltal med .5 avrundning (även om det vanligtvis är en minnesadress, i bästa fall är det farligt att använda den som ett tilldelningsmål för en beräkning av flytande punkt).

Decimal

Dim Value As Variant
Value = CDec(1.234)

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

Decimal är endast tillgänglig som en subtyp av Variant , så du måste deklarera alla variabler som måste innehålla ett Decimal som en Variant och sedan tilldela ett Decimal hjälp av CDec funktionen. Nyckelordet Decimal är ett reserverat ord (vilket antyder att VBA så småningom skulle lägga till förstklassigt stöd för typen), så Decimal kan inte användas som variabel eller procedurnamn.

Decimal kräver 14 byte minne (utöver de byte som krävs av modervarianten) och kan lagra siffror med upp till 28 decimaler. För siffror utan decimaler är intervallet för tillåtna värden -79,228,162,514,264,337,593,543,950,335 till +79,228,162,514,264,337,593,543,950,335 inklusive. För siffror med högst 28 decimaler är intervallet för tillåtna värden -7.9228162514264337593543950335 till +7.9228162514264337593543950335 inklusive.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow