Ricerca…


Byte

Dim Value As Byte

Un byte è un tipo di dati a 8 bit senza segno. Può rappresentare numeri interi compresi tra 0 e 255 e il tentativo di memorizzare un valore al di fuori di tale intervallo provocherà l'errore di runtime 6: Overflow . Byte è l'unico tipo senza segno intrinseco disponibile in VBA.

La funzione di fusione per convertire in byte è CByte() . Per i cast dai tipi a virgola mobile, il risultato viene arrotondato al valore intero più vicino con 0,5 arrotondamento.

Array e stringhe di byte

Stringhe e array di byte possono essere sostituiti l'uno con l'altro tramite l'assegnazione semplice (non sono necessarie funzioni di conversione).

Per esempio:

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

Per poter codificare i caratteri Unicode , ogni carattere nella stringa occupa due byte nell'array, con il byte meno significativo per primo. Per esempio:

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

Numero intero

Dim Value As Integer

Un intero è un tipo di dati a 16 bit con segno. Può memorizzare numeri interi nell'intervallo compreso tra -32.768 e 32.767 e il tentativo di memorizzare un valore al di fuori di tale intervallo provocherà l'errore di runtime 6: Overflow.

I numeri interi sono memorizzati in memoria come valori little-endian con valori negativi rappresentati come complemento a due .

Si noti che in generale, è prassi meglio usare un lungo anziché un numero intero a meno che il tipo più piccolo è un membro di un tipo o è richiesto (o da una convenzione di chiamata API o altri motivi) ad essere di 2 byte. Nella maggior parte dei casi VBA considera gli interi come 32 bit internamente, quindi di solito non vi è alcun vantaggio nell'usare il tipo più piccolo. Inoltre, viene applicata una penalità legata alle prestazioni ogni volta che viene utilizzato un tipo Integer in quanto viene silenziosamente lanciato come Long.

La funzione di casting per convertire in un intero è CInt() . Per i cast dai tipi a virgola mobile, il risultato viene arrotondato al valore intero più vicino con 0,5 arrotondamento.

booleano

Dim Value As Boolean

Un booleano viene utilizzato per memorizzare valori che possono essere rappresentati come True o False. Internamente, il tipo di dati viene memorizzato come valore a 16 bit con 0 che rappresenta False e qualsiasi altro valore che rappresenta True.

Va notato che quando un booleano viene convertito in un tipo numerico, tutti i bit sono impostati su 1. Ciò determina una rappresentazione interna di -1 per i tipi firmati e il valore massimo per un tipo senza segno (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

La funzione di casting per convertire in un booleano è CBool() . Anche se è rappresentato internamente come un numero a 16 bit, il casting su un booleano da valori esterni a tale intervallo è sicuro dall'overflow, anche se imposta tutti i 16 bit su 1:

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

Lungo

Dim Value As Long

A Long è un tipo di dati a 32 bit con segno. Può memorizzare numeri interi compresi tra -2.147.483.648 e 2.147.483.647 e il tentativo di memorizzare un valore al di fuori di tale intervallo comporterà l'errore di runtime 6: Overflow.

I long vengono archiviati in memoria come valori little-endian con i negativi rappresentati come complemento a due .

Si noti che poiché Long corrisponde alla larghezza di un puntatore in un sistema operativo a 32 bit, i Long vengono comunemente usati per archiviare e passare i puntatori alle e dalle funzioni API.

La funzione di fusione per convertire in Long è CLng() . Per i cast dai tipi a virgola mobile, il risultato viene arrotondato al valore intero più vicino con 0,5 arrotondamento.

singolo

Dim Value As Single

Un singolo è un tipo di dati a virgola mobile a 32 bit con segno. Viene memorizzato internamente utilizzando un layout di memoria IEEE 754 little-endian . Pertanto, non esiste un intervallo di valori fisso che può essere rappresentato dal tipo di dati: ciò che è limitato è la precisione del valore memorizzato. Un singolo può memorizzare valori interi di valori nell'intervallo da -16.777.216 a 16.777.216 senza una perdita di precisione. La precisione dei numeri in virgola mobile dipende dall'esponente.

Una singola traboccherà se viene assegnato un valore superiore a circa 2 128 . Non traboccherà con esponenti negativi, anche se la precisione utilizzabile sarà discutibile prima che venga raggiunto il limite superiore.

Come con tutti i numeri in virgola mobile, è necessario prestare attenzione quando si effettuano confronti di uguaglianza. La migliore pratica consiste nell'includere un valore delta appropriato alla precisione richiesta.

La funzione di fusione per convertire in un singolo è CSng() .

Doppio

Dim Value As Double

Un Double è un tipo di dati a virgola mobile a 64 bit con segno. Come il Single , è memorizzato internamente utilizzando un layout di memoria IEEE 754 little endian e devono essere prese le stesse precauzioni per quanto riguarda la precisione. Un Double può memorizzare valori interi nell'intervallo da -9,007,199,254,740,992 a 9,007,199,254,740,992 senza perdita di precisione. La precisione dei numeri in virgola mobile dipende dall'esponente.

Una doppia sarà overflow se assegnata a un valore superiore a circa 2 1024 . Non traboccherà con esponenti negativi, anche se la precisione utilizzabile sarà discutibile prima che venga raggiunto il limite superiore.

La funzione di casting per convertire in Double è CDbl() .

Moneta

Dim Value As Currency

Una valuta è un tipo di dati in virgola mobile a 64 bit con segno simile a un doppio , ma ridimensionato di 10.000 per dare maggiore precisione alle 4 cifre a destra del punto decimale. Una variabile di valuta può memorizzare valori da -922,337,203,685,477,5808 a 922,337,203,685,477,5807, fornendo la massima capacità di qualsiasi tipo intrinseco in un'applicazione a 32 bit. Come suggerisce il nome del tipo di dati, è consigliabile utilizzare questo tipo di dati quando si rappresentano calcoli monetari poiché il ridimensionamento aiuta a evitare errori di arrotondamento.

La funzione di casting per convertire in una valuta è CCur() .

Data

Dim Value As Date

Un tipo Date viene rappresentato internamente come un tipo di dati con segno a 64 bit in virgola mobile con il valore alla sinistra del decimale che rappresenta il numero di giorni dalla data epoca del 30 dicembre 1899 (anche se vedi nota sotto). Il valore alla destra del decimale rappresenta il tempo come un giorno frazionario. Pertanto, una data intera avrebbe un componente orario di 12:00 AM e x.5 avrebbe una componente temporale di 12:00:00 PM.

I valori validi per le date sono compresi tra 1 ° gennaio 100 e il 31 dicembre 9999. Dal momento che un doppio ha una gamma più ampia, è possibile traboccare una data assegnando valori al di fuori di tale intervallo.

Come tale, può essere usato in modo intercambiabile con i calcoli Double for 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 funzione di fusione per convertire in una data è CDate() , che accetta qualsiasi rappresentazione di data / ora stringa di tipo numerico. È importante notare che le rappresentazioni di stringa delle date verranno convertite in base all'impostazione locale corrente in uso, quindi i cast diretti dovrebbero essere evitati se il codice è pensato per essere portabile.

Stringa

Una stringa rappresenta una sequenza di caratteri ed è disponibile in due versioni:

Lunghezza variabile

Dim Value As String

Una stringa di lunghezza variabile consente l'aggiunta e il troncamento e viene archiviata in memoria come un BSTR COM. Si tratta di un intero senza segno a 4 byte che memorizza la lunghezza della stringa in byte seguita dai dati della stringa stessa come caratteri di larghezza (2 byte per carattere) e terminata con 2 byte nulli. Pertanto, la lunghezza massima della stringa che può essere gestita da VBA è di 2.147.483.647 caratteri.

Il puntatore interno alla struttura (recuperabile dalla funzione StrPtr() ) punta alla posizione di memoria dei dati , non al prefisso di lunghezza. Ciò significa che una stringa VBA può essere passata direttamente alle funzioni API che richiedono un puntatore a un array di caratteri.

Poiché la lunghezza può variare, VBA rialloca la memoria per una stringa ogni volta che viene assegnata la variabile , il che può imporre sanzioni per le prestazioni per le procedure che le modificano ripetutamente.

Lunghezza fissa

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

Le stringhe a lunghezza fissa sono assegnate a 2 byte per ogni carattere e vengono memorizzate come semplice array di byte. Una volta assegnato, la lunghezza della stringa è immutabile. Essi non sono zero finale in memoria, quindi una stringa che riempie la memoria allocata con caratteri non nulli è adatto per il passaggio di funzioni API che prevedono una terminazione null stringa.

Le stringhe a lunghezza fissa supportano una limitazione di indice legacy di 16 bit, quindi possono avere una lunghezza massima di 65.535 caratteri. Il tentativo di assegnare un valore più lungo dello spazio di memoria disponibile non comporterà un errore di runtime, ma il valore risultante verrà semplicemente troncato:

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

La funzione di fusione per convertire in una stringa di entrambi i tipi è CStr() .

Lungo lungo

Dim Value As LongLong

LongLong è un tipo di dati a 64 bit con segno ed è disponibile solo in applicazioni a 64 bit. Non è disponibile in applicazioni a 32 bit in esecuzione su sistemi operativi a 64 bit. Può memorizzare valori interi nell'intervallo compreso tra -9,223,372,036,854,775,808 e 9,223,372,036,854,775,807 e il tentativo di memorizzare un valore al di fuori di tale intervallo provocherà l'errore di runtime 6: Overflow.

I LongLongs sono archiviati in memoria come valori little-endian con i negativi rappresentati come complemento a due .

Il tipo di dati LongLong è stato introdotto come parte del supporto del sistema operativo a 64 bit di VBA. Nelle applicazioni a 64 bit, questo valore può essere utilizzato per archiviare e passare i puntatori a API a 64 bit.

La funzione di fusione per convertire in LongLong è CLngLng() . Per i cast dai tipi a virgola mobile, il risultato viene arrotondato al valore intero più vicino con 0,5 arrotondamento.

Variante

Dim Value As Variant    'Explicit
Dim Value               'Implicit

Un Variant è un tipo di dati COM che viene utilizzato per l'archiviazione e lo scambio di valori di tipi arbitrari e qualsiasi altro tipo in VBA può essere assegnato a un Variant. Le variabili dichiarate senza un tipo esplicito specificato da As [Type] impostate su Variant.

Le varianti sono archiviate in memoria come una struttura VARIANT che consiste in un descrittore di tipo byte ( VARTYPE ) seguito da 6 byte riservati quindi da un'area di dati da 8 byte. Per i tipi numerici (inclusi Date e Boolean), il valore sottostante viene memorizzato nella Variant stessa. Per tutti gli altri tipi, l'area dati contiene un puntatore al valore sottostante.

inserisci la descrizione dell'immagine qui

Il tipo sottostante di Variant può essere determinato con la funzione VarType() che restituisce il valore numerico memorizzato nel descrittore di tipo o la funzione TypeName() che restituisce la rappresentazione di stringa:

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"

Poiché le varianti possono memorizzare valori di qualsiasi tipo, gli assegnamenti dai valori letterali senza i suggerimenti di tipo verranno convertiti implicitamente in una variante del tipo appropriato in base alla tabella seguente. I valori letterali con suggerimenti tipo verranno convertiti in una variante del tipo suggerito.

Valore Tipo risultante
Valori di stringa Stringa
Numeri senza virgola mobile nell'intervallo dei numeri interi Numero intero
Numeri a virgola mobile in lungo raggio Lungo
Numeri senza virgola mobile fuori da Lungo raggio Doppio
Tutti i numeri in virgola mobile Doppio

Nota: a meno che non vi sia un motivo specifico per utilizzare una variante (ovvero un iteratore in un ciclo For Each o un requisito API), il tipo dovrebbe essere generalmente evitato per le attività di routine per i seguenti motivi:

  • Non sono sicuri, aumentando la possibilità di errori di runtime. Ad esempio, un valore Variant che contiene un valore intero si modifica automaticamente in un valore Long anziché in overflow.
  • Introducono l'overhead di elaborazione richiedendo almeno un ulteriore dereferenziamento del puntatore.
  • Il requisito di memoria per un valore Variant è sempre superiore di almeno 8 byte rispetto a quello necessario per memorizzare il tipo sottostante.

La funzione di fusione per convertire in Variant è CVar() .

LongPtr

Dim Value As LongPtr

Il LongPtr è stato introdotto in VBA per supportare piattaforme a 64 bit. Su un sistema a 32 bit, viene trattato come un sistema Long e su sistemi a 64 bit viene trattato come LongLong .

Il suo scopo principale è fornire un modo portatile per archiviare e passare i puntatori su entrambe le architetture (vedere Modifica del comportamento del codice in fase di compilazione .

Sebbene sia utilizzato dal sistema operativo come indirizzo di memoria quando viene utilizzato nelle chiamate API, è necessario notare che VBA lo considera come un tipo firmato (e quindi soggetto a overflow con segno non firmato). Per questo motivo, qualsiasi aritmetica del puntatore eseguita usando LongPtrs non dovrebbe usare > o < confronti. Questa "stranezza" rende anche possibile che l'aggiunta di offset semplici che puntano a indirizzi validi in memoria possa causare errori di overflow, quindi occorre prestare attenzione quando si lavora con i puntatori in VBA.

La funzione di fusione per convertire in LongPtr è CLngPtr() . Per i cast dai tipi a virgola mobile, il risultato viene arrotondato al valore intero più vicino con 0,5 arrotondamenti (sebbene poiché di solito è un indirizzo di memoria, usarlo come target di assegnazione per un calcolo a virgola mobile è pericoloso al meglio).

Decimale

Dim Value As Variant
Value = CDec(1.234)

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

Il tipo di dati Decimal è disponibile solo come sottotipo di Variant , pertanto è necessario dichiarare qualsiasi variabile che deve contenere un Decimal come Variant e quindi assegnare un valore Decimal utilizzando la funzione CDec . La parola chiave Decimal è una parola riservata (che suggerisce che VBA alla fine avrebbe aggiunto il supporto di prima classe per il tipo), quindi Decimal non può essere utilizzato come variabile o nome di procedura.

Il tipo Decimal richiede 14 byte di memoria (oltre ai byte richiesti dalla variante padre) e può memorizzare numeri con un massimo di 28 cifre decimali. Per i numeri senza cifre decimali, l'intervallo di valori consentiti è compreso tra -79,228,162,514,264,337,593,543,950,335 e +79,228,162,514,264,337,593,543,950,335 inclusi. Per i numeri con un massimo di 28 cifre decimali, l'intervallo di valori consentiti è compreso tra -7.9228162514264337593543950335 e +7.9228162514264337593543950335.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow