Suche…


Byte

Dim Value As Byte

Ein Byte ist ein vorzeichenloser 8-Bit-Datentyp. Es kann ganze Zahlen zwischen 0 und 255 darstellen. Wenn Sie versuchen, einen Wert außerhalb dieses Bereichs zu speichern, führt dies zu Laufzeitfehler 6: Overflow . Byte ist der einzige intrinsische vorzeichenlose Typ, der in VBA verfügbar ist.

Die Casting-Funktion, die in ein Byte konvertiert werden soll, ist CByte() . Bei Umsetzungen von Fließkommatypen wird das Ergebnis auf den nächsten ganzzahligen Wert mit einer Rundung von 0,5 gerundet.

Byte-Arrays und Strings

Strings und Byte-Arrays können durch einfache Zuweisung gegeneinander ausgetauscht werden (keine Konvertierungsfunktionen erforderlich).

Zum Beispiel:

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

Um Unicode- Zeichen kodieren zu können, belegt jedes Zeichen in der Zeichenfolge zwei Bytes im Array, wobei das niedrigstwertige Byte zuerst steht. Zum Beispiel:

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

Ganze Zahl

Dim Value As Integer

Eine Ganzzahl ist ein vorzeichenbehafteter 16-Bit-Datentyp. Es kann ganzzahlige Zahlen im Bereich von -32.768 bis 32.767 speichern. Wenn Sie versuchen, einen Wert außerhalb dieses Bereichs zu speichern, wird dies zu Laufzeitfehler 6: Überlauf.

Integer - Werte werden als Little-Endian- Werte gespeichert, wobei Negative als Zweierkomplement dargestellt werden .

Beachten Sie, dass es im Allgemeinen besser ist, Long anstelle von Integer zu verwenden, es sei denn, der kleinere Typ ist ein Member eines Typs oder muss (entweder aufgrund einer API-Aufrufkonvention oder aus einem anderen Grund) 2 Byte groß sein. In den meisten Fällen behandelt VBA Integer-Werte intern als 32-Bit. Daher hat die Verwendung des kleineren Typs normalerweise keinen Vorteil. Darüber hinaus tritt bei jeder Verwendung eines Integer-Typs ein Performance-Nachteil auf, da dieser lautlos als Long geworfen wird.

Die Casting-Funktion, die in eine Ganzzahl konvertiert werden soll, ist CInt() . Bei Umsetzungen von Fließkommatypen wird das Ergebnis auf den nächsten ganzzahligen Wert mit einer Rundung von 0,5 gerundet.

Boolean

Dim Value As Boolean

Ein Boolean-Wert wird zum Speichern von Werten verwendet, die als "True" oder "False" dargestellt werden können. Intern wird der Datentyp als 16-Bit-Wert gespeichert, wobei 0 False und jeder andere Wert True darstellt.

Wenn ein boolescher Wert in einen numerischen Typ umgewandelt wird, werden alle Bits auf 1 gesetzt. Dies führt zu einer internen Darstellung von -1 für vorzeichenbehaftete Typen und dem Maximalwert für einen vorzeichenlosen 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

Die Casting-Funktion, die in ein Boolean konvertiert werden soll, ist CBool() . Obwohl es intern als 16-Bit-Zahl dargestellt wird, ist das Umsetzen von Werten außerhalb dieses Bereichs auf einen Booleschen Wert vor einem Überlauf sicher, obwohl alle 16 Bits auf 1 gesetzt werden:

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

Lange

Dim Value As Long

Ein Long ist ein vorzeichenbehafteter 32-Bit-Datentyp. Es kann ganzzahlige Zahlen im Bereich von -2.147.483.648 bis 2.147.483.647 speichern. Wenn Sie versuchen, einen Wert außerhalb dieses Bereichs zu speichern, führt dies zu Laufzeitfehler 6: Überlauf.

Longs werden als Little-Endian- Werte gespeichert, wobei Negative als Zweierkomplement dargestellt werden .

Beachten Sie, dass Longs allgemein zum Speichern und Weiterleiten von Zeigern zu und von API-Funktionen verwendet werden, da Long mit der Breite eines Zeigers in einem 32-Bit-Betriebssystem übereinstimmt.

Die Casting-Funktion, die in ein Long konvertiert werden soll, ist CLng() . Bei Umsetzungen von Fließkommatypen wird das Ergebnis auf den nächsten ganzzahligen Wert mit einer Rundung von 0,5 gerundet.

Single

Dim Value As Single

Ein Single ist ein vorzeichenbehafteter 32-Bit-Gleitkomma-Datentyp. Es wird intern mit einem Little-Endian- Speicherlayout nach IEEE 754 gespeichert. Daher gibt es keinen festen Wertebereich, der durch den Datentyp dargestellt werden kann - begrenzt ist die Genauigkeit der gespeicherten Werte. Ein Single kann ganzzahlige Werte im Bereich von -16.777.216 bis 16.777.216 ohne Genauigkeitsverlust speichern. Die Genauigkeit der Gleitkommazahlen hängt vom Exponenten ab.

Ein Single wird überlaufen, wenn ein Wert größer als ungefähr 2 128 zugewiesen wird. Bei negativen Exponenten wird es nicht überlaufen, obwohl die nutzbare Genauigkeit fraglich ist, bevor die Obergrenze erreicht wird.

Wie bei allen Fließkommazahlen sollte beim Vergleich der Gleichheit sorgfältig vorgegangen werden. Am besten verwenden Sie einen Deltawert, der der erforderlichen Genauigkeit entspricht.

Die Casting-Funktion, die in ein Single konvertiert werden soll, ist CSng() .

Doppelt

Dim Value As Double

Ein Double ist ein 64-Bit-Gleitkommadatentyp mit Vorzeichen. Wie das Single wird es intern unter Verwendung eines Little-Endian- IEEE 754- Speicherlayouts gespeichert, und es sollten die gleichen Vorsichtsmaßnahmen hinsichtlich der Genauigkeit getroffen werden. Ein Double kann ganzzahlige Werte im Bereich von -9.007.199.254.740.992 bis 9.007.199.254.740.992 ohne Genauigkeitsverlust speichern. Die Genauigkeit der Gleitkommazahlen hängt vom Exponenten ab.

Ein Double wird überlaufen, wenn ein Wert größer als 2 1024 zugewiesen wird. Bei negativen Exponenten wird es nicht überlaufen, obwohl die nutzbare Genauigkeit fraglich ist, bevor die Obergrenze erreicht wird.

Die Casting-Funktion zum Konvertieren in ein Double ist CDbl() .

Währung

Dim Value As Currency

Eine Währung ist ein 64-Bit-Gleitkomma-Datentyp mit Vorzeichen, der einem Double ähnelt, jedoch um 10.000 skaliert ist, um den vier Stellen rechts vom Dezimalpunkt eine höhere Genauigkeit zu geben. Eine Currency-Variable kann Werte von -922.337.203.685.477.5808 bis 922.337.203.685.477.5807 speichern, wodurch sie die größte Kapazität eines beliebigen intrinsischen Typs in einer 32-Bit-Anwendung darstellt. Wie der Name des Datentyps impliziert, wird empfohlen, diesen Datentyp bei der Darstellung von monetären Berechnungen zu verwenden, da durch die Skalierung Rundungsfehler vermieden werden.

Die Casting-Funktion, die in eine Währung konvertiert werden soll, ist CCur() .

Datum

Dim Value As Date

Ein Date-Typ wird intern als vorzeichenbehafteter 64-Bit-Gleitkomma-Datentyp dargestellt, wobei der Wert links von der Dezimalzahl die Anzahl der Tage ab dem Epochendatum des 30. Dezember 1899 darstellt (siehe jedoch den Hinweis unten). Der Wert rechts von der Dezimalstelle steht für die Uhrzeit als gebrochenen Tag. Ein ganzzahliges Datum hätte also eine Zeitkomponente von 12:00:00 Uhr und x.5 eine Zeitkomponente von 12:00:00 Uhr.

Gültige Werte für Termine sind zwischen dem 1. Januar und dem 31. Dezember 100 st 9999. Da ein Doppel eine größere Reichweite hat, ist es möglich , ein Datum zu überfluten von Werten außerhalb dieses Bereichs zuweisen.

Als solches kann es austauschbar mit einer Double for Date-Berechnung verwendet werden:

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.

Die Casting-Funktion, die in ein Datum konvertiert werden soll, ist CDate() , die eine beliebige Datums- / CDate() numerischen Typ akzeptiert. Es ist wichtig zu beachten, dass Zeichenfolgendarstellungen von Datumsangaben basierend auf der aktuell verwendeten Gebietsschemaeinstellung konvertiert werden. Daher sollten direkte Casts vermieden werden, wenn der Code portierbar sein soll.

String

Ein String steht für eine Folge von Zeichen und ist in zwei Ausführungen erhältlich:

Variable Länge

Dim Value As String

Ein String mit variabler Länge ermöglicht das Anhängen und Abschneiden und wird als COM- BSTR im Speicher gespeichert . Diese besteht aus einer vorzeichenlosen 4-Byte-Ganzzahl, die die Länge des Strings in Bytes speichert, gefolgt von den String-Daten selbst als Breitzeichen (2 Bytes pro Zeichen) und mit 2 Null-Bytes abgeschlossen. Daher beträgt die maximale Zeichenfolgenlänge, die von VBA verarbeitet werden kann, 2.147.483.647 Zeichen.

Der interne Zeiger auf die Struktur (abrufbar mit der Funktion StrPtr() ) zeigt auf den Speicherplatz der Daten , nicht auf das Längenpräfix. Dies bedeutet, dass ein VBA-String direkt an API-Funktionen übergeben werden kann, für die ein Zeiger auf ein Zeichenarray erforderlich ist.

Da sich die Länge ändern kann, ordnet VBA bei jeder Variablenzuweisung den Speicher für einen String neu zu. Dies kann zu Performance-Strafen für Prozeduren führen, die sie wiederholt ändern.

Feste Länge

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

Zeichenfolgen fester Länge werden 2 Byte für jedes Zeichen zugewiesen und als einfaches Byte-Array im Speicher abgelegt. Nach der Zuweisung ist die Länge der Zeichenfolge unveränderlich. Sie werden im Arbeitsspeicher nicht mit Null abgeschlossen, daher ist eine Zeichenfolge, die den mit Nicht-Null-Zeichen belegten Speicher füllt, nicht für die Weitergabe an API-Funktionen geeignet, die eine mit Null endende Zeichenfolge erwarten.

Zeichenfolgen mit fester Länge haben eine ältere 16-Bit-Indexbegrenzung und können daher nur bis zu 65.535 Zeichen lang sein. Wenn Sie versuchen, einen Wert länger als den verfügbaren Speicherplatz zuzuweisen, führt dies nicht zu einem Laufzeitfehler. Stattdessen wird der resultierende Wert einfach abgeschnitten:

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

Die Casting-Funktion, die in einen String eines der beiden Typen konvertiert werden soll, ist CStr() .

Lang Lang

Dim Value As LongLong

Ein LongLong ist ein signierter 64-Bit-Datentyp und ist nur in 64-Bit-Anwendungen verfügbar. Es ist nicht in 32-Bit-Anwendungen verfügbar, die auf 64-Bit-Betriebssystemen ausgeführt werden. Es kann ganzzahlige Werte im Bereich von -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 speichern, und der Versuch, einen Wert außerhalb dieses Bereichs zu speichern, führt zu Laufzeitfehler 6: Überlauf.

LongLongs werden als Little-Endian- Werte gespeichert, wobei Negative als Zweierkomplement dargestellt werden .

Der LongLong-Datentyp wurde als Teil der 64-Bit-Betriebssystemunterstützung von VBA eingeführt. In 64-Bit-Anwendungen kann dieser Wert verwendet werden, um Zeiger zu speichern und an 64-Bit-APIs zu übergeben.

Die Casting-Funktion zum Konvertieren in LongLong ist CLngLng() . Bei Umsetzungen von Fließkommatypen wird das Ergebnis auf den nächsten ganzzahligen Wert mit einer Rundung von 0,5 gerundet.

Variante

Dim Value As Variant    'Explicit
Dim Value               'Implicit

Eine Variante ist ein COM-Datentyp, der zum Speichern und Austauschen von Werten beliebiger Typen verwendet wird. Jeder andere Typ in VBA kann einer Variante zugewiesen werden. Variablen, die ohne expliziten Typ deklariert wurden, der mit As [Type] Standard angegeben ist, sind Variant.

Varianten werden als VARIANT-Struktur im Speicher abgelegt, die aus einem Byte-Deskriptor ( VARTYPE ) gefolgt von 6 reservierten Bytes und einem 8-Byte-Datenbereich besteht. Bei numerischen Typen (einschließlich Date und Boolean) wird der zugrunde liegende Wert in der Variante selbst gespeichert. Bei allen anderen Typen enthält der Datenbereich einen Zeiger auf den zugrunde liegenden Wert.

Geben Sie hier die Bildbeschreibung ein

Der zugrunde liegende Typ einer Variante kann entweder mit der VarType() Funktion, die den im VarType() gespeicherten numerischen Wert zurückgibt, oder mit der TypeName() Funktion, die die String-Darstellung zurückgibt, bestimmt werden:

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"

Da Varianten Werte eines beliebigen Typs speichern können, werden Zuweisungen aus Literalen ohne Typhinweise implizit in eine Variante des entsprechenden Typs gemäß der nachstehenden Tabelle umgewandelt. Literale mit Typhinweisen werden in eine Variante des angedeuteten Typs umgewandelt.

Wert Resultierender Typ
String-Werte String
Nicht-Fließkommazahlen im Integer-Bereich Ganze Zahl
Nicht-Fließkommazahlen in großer Reichweite Lange
Nicht-Fließkommazahlen außerhalb des Long-Bereichs Doppelt
Alle Gleitkommazahlen Doppelt

Anmerkung: Wenn es keinen bestimmten Grund gibt, eine Variante zu verwenden (dh einen Iterator in einer For Each-Schleife oder eine API-Anforderung), sollte der Typ aus folgenden Gründen für Routineaufgaben generell vermieden werden:

  • Sie sind nicht typsicher, was die Möglichkeit von Laufzeitfehlern erhöht. Eine Variante, die einen Integer-Wert enthält, ändert sich beispielsweise automatisch in einen Long-Wert, anstatt überzulaufen.
  • Sie führen zu einem Verarbeitungsaufwand, indem sie mindestens eine zusätzliche Zeigerdereferenzierung erfordern.
  • Der Speicherbedarf für eine Variante ist immer mindestens 8 Byte höher als zum Speichern des zugrunde liegenden Typs erforderlich.

Die Casting-Funktion, die in eine Variante konvertiert werden soll, ist CVar() .

LongPtr

Dim Value As LongPtr

Der LongPtr wurde in VBA eingeführt, um 64-Bit-Plattformen zu unterstützen. Bei einem 32-Bit-System wird es als Long und bei 64-Bit-Systemen als LongLong behandelt.

Sie wird hauptsächlich zum Bereitstellen einer tragbaren Methode zum Speichern und Übergeben von Zeigern auf beiden Architekturen verwendet (siehe Ändern des Codeverhaltens zur Kompilierzeit) .

Obwohl es vom Betriebssystem als Speicheradresse bei der Verwendung in API-Aufrufen behandelt wird, ist zu beachten, dass es von VBA als vorzeichenbehafteter Typ behandelt wird (und daher einem vorzeichenlosen Überlauf ohne Vorzeichen unterliegt). Aus diesem Grund sollte für eine Zeigerarithmetik, die mit LongPtrs ausgeführt wird, kein Vergleich mit > oder < . Diese "Eigenart" macht es außerdem möglich, dass das Hinzufügen einfacher Offsets, die auf gültige Adressen im Speicher verweisen, Überlauffehler verursachen kann. Daher ist bei der Arbeit mit Zeigern in VBA Vorsicht geboten.

Die Casting-Funktion zum Konvertieren in einen LongPtr ist CLngPtr() . Bei Umsetzungen von Fließkommatypen wird das Ergebnis auf den nächsten ganzzahligen Wert gerundet, wobei aufgerundet wird. (Da es sich jedoch normalerweise um eine Speicheradresse handelt, ist die Verwendung als Zuweisungsziel für eine Fließkommaberechnung bestenfalls gefährlich).

Dezimal

Dim Value As Variant
Value = CDec(1.234)

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

Der Decimal Datentyp ist nur als Variant -Subtyp verfügbar. Sie müssen daher jede Variable, die ein Decimal enthalten muss, als Variant deklarieren und anschließend mit der CDec Funktion einen Decimal CDec . Das Schlüsselwort Decimal ist ein reserviertes Wort (was darauf hindeutet, dass VBA schließlich erstklassige Unterstützung für den Typ hinzufügte). Decimal kann Decimal nicht als Variablen- oder Prozedurname verwendet werden.

Der Decimal Typ benötigt 14 Byte Speicher (zusätzlich zu den Bytes, die von der übergeordneten Variante benötigt werden) und kann Zahlen mit bis zu 28 Dezimalstellen speichern. Für Zahlen ohne Nachkommastellen liegt der zulässige Wertebereich bei -79.228.162.514.264.337.593.543.950.335 bis +79.228.162.514.264.337.593.543.950.335. Bei Zahlen mit maximal 28 Dezimalstellen liegt der zulässige Wertebereich zwischen -7,9228162514264337593543950335 und +7,9228162514264337593543950335.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow