Szukaj…


Bajt

Dim Value As Byte

Bajt to 8-bitowy typ danych bez znaku. Może reprezentować liczby całkowite od 0 do 255, a próba zapisania wartości spoza tego zakresu spowoduje błąd wykonania 6: Overflow . Bajt jest jedynym wewnętrznym typem bez znaku dostępnym w VBA.

Funkcja rzutowania do konwersji na bajt to CByte() . W przypadku rzutów z typów zmiennoprzecinkowych wynik jest zaokrąglany do najbliższej liczby całkowitej za pomocą .5 zaokrąglania w górę.

Tablice i ciągi bajtów

Łańcuchy i tablice bajtów mogą być zastępowane przez proste przypisanie (nie są wymagane funkcje konwersji).

Na przykład:

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

Aby móc kodować znaki Unicode , każdy znak w ciągu zajmuje dwa bajty w tablicy, najpierw bajt najmniej znaczący. Na przykład:

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

Liczba całkowita

Dim Value As Integer

Liczba całkowita jest podpisanym 16-bitowym typem danych. Może przechowywać liczby całkowite w zakresie od -32 768 do 32 767, a próba zapamiętania wartości spoza tego zakresu spowoduje błąd wykonania 6: Przepełnienie.

Liczby całkowite są przechowywane w pamięci jako wartości little-endian z ujemnymi reprezentowanymi jako uzupełnienie do dwóch .

Zauważ, że ogólnie lepiej jest używać Długiej niż Liczby całkowitej, chyba że mniejszy typ jest członkiem Typu lub nie jest wymagany (albo przez konwencję wywoływania API lub z innego powodu), aby miał 2 bajty. W większości przypadków VBA traktuje liczby całkowite wewnętrznie jako 32-bitowe, więc zwykle nie ma przewagi przy użyciu mniejszego typu. Ponadto za każdym razem, gdy używany jest typ całkowity, ponoszony jest spadek wydajności, ponieważ jest on cicho rzucany jako Długi.

Funkcja rzutowania do konwersji na liczbę całkowitą to CInt() . W przypadku rzutów z typów zmiennoprzecinkowych wynik jest zaokrąglany do najbliższej liczby całkowitej za pomocą .5 zaokrąglania w górę.

Boolean

Dim Value As Boolean

Wartość logiczna służy do przechowywania wartości, które mogą być reprezentowane jako Prawda lub Fałsz. Wewnętrznie typ danych jest przechowywany jako 16-bitowa wartość, gdzie 0 oznacza False, a każda inna wartość reprezentuje True.

Należy zauważyć, że gdy wartość logiczna jest rzutowana na typ liczbowy, wszystkie bity są ustawiane na 1. To powoduje wewnętrzną reprezentację -1 dla typów ze znakiem i maksymalnej wartości dla typu bez znaku (Bajt).

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

Funkcja rzutowania do konwersji na wartość logiczną to CBool() . Mimo że jest wewnętrznie reprezentowany jako liczba 16-bitowa, rzutowanie na wartość logiczną z wartości spoza tego zakresu jest bezpieczne przed przepełnieniem, chociaż ustawia wszystkie 16 bitów na 1:

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

Długo

Dim Value As Long

Długi to 32-bitowy typ danych ze znakiem. Może przechowywać liczby całkowite w zakresie od -2 147 483 648 do 2 147 483 647, a próba zapamiętania wartości spoza tego zakresu spowoduje błąd wykonania 6: Przepełnienie.

Długie są przechowywane w pamięci jako wartości little-endian , a negatywy przedstawiane są jako uzupełnienie dwójki .

Zauważ, że ponieważ Long pasuje do szerokości wskaźnika w 32-bitowym systemie operacyjnym, Longs są powszechnie używane do przechowywania i przekazywania wskaźników do i z funkcji API.

Funkcja rzutowania do konwersji na Long to CLng() . W przypadku rzutów z typów zmiennoprzecinkowych wynik jest zaokrąglany do najbliższej liczby całkowitej za pomocą .5 zaokrąglania w górę.

Pojedynczy

Dim Value As Single

Single jest podpisanym 32-bitowym zmiennoprzecinkowym typem danych. Jest przechowywany wewnętrznie przy użyciu układu pamięci typu endian IEEE 754 . Jako taki nie ma ustalonego zakresu wartości, które mogą być reprezentowane przez typ danych - ograniczona jest dokładność przechowywanej wartości. Pojedynczy może przechowywać wartości liczb całkowitych w zakresie od -16,777,216 do 16,777,216 bez utraty precyzji. Dokładność liczb zmiennoprzecinkowych zależy od wykładnika.

Pojedynczy przepełni się, jeśli zostanie mu przypisana wartość większa niż około 2 128 . Nie przepełni się ujemnymi wykładnikami wykładniczymi, chociaż użyteczna precyzja będzie wątpliwa przed osiągnięciem górnej granicy.

Podobnie jak w przypadku wszystkich liczb zmiennoprzecinkowych, należy zachować ostrożność podczas dokonywania porównań równości. Najlepszą praktyką jest uwzględnienie wartości delta odpowiedniej do wymaganej precyzji.

Funkcja rzutowania do konwersji na Single to CSng() .

Podwójnie

Dim Value As Double

Double jest podpisanym 64-bitowym zmiennoprzecinkowym typem danych. Podobnie jak Single , jest przechowywany wewnętrznie przy użyciu układu pamięci typu endian IEEE 754 i należy zachować takie same środki ostrożności dotyczące precyzji. Double może przechowywać wartości całkowite w zakresie od -9,007,199,254,740,992 do 9,007,199,254,740,992 bez utraty precyzji. Dokładność liczb zmiennoprzecinkowych zależy od wykładnika.

Double przepełni się, jeśli zostanie mu przypisana wartość większa niż około 2 1024 . Nie przepełni się ujemnymi wykładnikami wykładniczymi, chociaż użyteczna precyzja będzie wątpliwa przed osiągnięciem górnej granicy.

Funkcja rzutowania do konwersji na Double to CDbl() .

Waluta

Dim Value As Currency

Waluta to 64-bitowy zmiennoprzecinkowy typ danych podobny do Double , ale skalowany o 10 000, aby zapewnić większą precyzję 4 cyfrom po prawej stronie przecinka dziesiętnego. Zmienna Currency może przechowywać wartości od -922,337,203,685,477,5808 do 922,337,203,685,477,5807, co daje największą pojemność dowolnego typu wewnętrznego w 32-bitowej aplikacji. Jak sugeruje nazwa typu danych, za najlepszą praktykę uważa się stosowanie tego typu danych podczas reprezentowania obliczeń pieniężnych, ponieważ skalowanie pomaga uniknąć błędów zaokrąglania.

Funkcja rzutowania do konwersji na walutę to CCur() .

Data

Dim Value As Date

A Data typ reprezentowany jest wewnętrznie jako podpisane 64 bitowe zmiennoprzecinkowe typu danych z wartością w lewo po przecinku reprezentujący liczbę dni od daty Epoki 30 grudnia 1899 roku (chociaż patrz uwaga poniżej). Wartość po prawej stronie dziesiętnej reprezentuje czas jako dzień ułamkowy. Zatem liczba całkowita Data miałaby składnik czasu 12:00:00 AM, a x.5 miałby składnik czasu 12:00:00 PM.

Prawidłowe wartości daty są między dniem 1 stycznia 100 do 31 grudnia 9999. Ponieważ Pokój ma większy zasięg, możliwe jest przepełnienie na randkę przez przypisanie wartości spoza tego zakresu.

Jako taki może być używany zamiennie z obliczeniami 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.

Funkcja rzutowania do konwersji na datę to CDate() , która akceptuje dowolną reprezentację daty / godziny w postaci ciągu liczbowego. Ważne jest, aby pamiętać, że reprezentacje ciągów dat będą konwertowane w oparciu o bieżące używane ustawienia regionalne, więc należy unikać rzutowania bezpośredniego, jeśli kod ma być przenośny.

Strunowy

Ciąg reprezentuje sekwencję znaków i występuje w dwóch odmianach:

Zmienna długość

Dim Value As String

Ciąg o zmiennej długości umożliwia dołączanie i obcinanie i jest przechowywany w pamięci jako COM BSTR . Składa się z 4-bajtowej liczby całkowitej bez znaku, która przechowuje długość ciągu w bajtach, po której następują same dane ciągu jako szerokie znaki (2 bajty na znak) i zakończone 2 bajtami zerowymi. Zatem maksymalna długość łańcucha, którą może obsłużyć VBA, wynosi 2 147 483 647 znaków.

Wewnętrzny wskaźnik do struktury ( StrPtr() do odzyskania przez funkcję StrPtr() ) wskazuje lokalizację pamięci danych , a nie prefiks długości. Oznacza to, że ciąg VBA można przekazać bezpośrednio do funkcji API, które wymagają wskaźnika do tablicy znaków.

Ponieważ długość może się zmieniać, VBA przydziela zmienną pamięć dla Ciągu za każdym razem, gdy przypisywana jest zmienna , co może nakładać kary wydajnościowe za procedury, które zmieniają je wielokrotnie.

Poprawiona długość

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

Ciągi o stałej długości są przydzielane 2 bajty dla każdego znaku i są przechowywane w pamięci jako prosta tablica bajtów. Po przydzieleniu długość ciągu jest niezmienna. Oni nie są nieważne rozwiązana w pamięci, więc ciąg znaków, który wypełnia pamięć przydzieloną ze znaków innych niż null jest nieodpowiedni dla przejścia do funkcji API oczekujących NUL łańcuch.

Ciągi o stałej długości przenoszą starsze ograniczenie indeksu 16 bitów, więc mogą mieć długość do 65 535 znaków. Próba przypisania wartości dłuższej niż dostępna pamięć nie spowoduje błędu w czasie wykonywania - zamiast tego wynikowa wartość zostanie po prostu obcięta:

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

Funkcja rzutowania do konwersji na ciąg dowolnego typu to CStr() .

LongLong

Dim Value As LongLong

LongLong to 64-bitowy typ ze znakiem i jest dostępny tylko w aplikacjach 64-bitowych. To nie jest dostępna w 32-bitowych aplikacji działających w 64-bitowych systemach operacyjnych. Może przechowywać wartości całkowite w zakresie od -9 223 372,036,854,775,808 do 9 223 372,036,854,775,807, a próba zapisania wartości spoza tego zakresu spowoduje błąd czasu wykonania 6: Przepełnienie.

LongLongi są przechowywane w pamięci jako wartości little-endian z negatywami reprezentowanymi jako uzupełnienie do dwóch .

Typ danych LongLong został wprowadzony w ramach 64-bitowej obsługi systemu operacyjnego VBA. W aplikacjach 64-bitowych ta wartość może służyć do przechowywania i przekazywania wskaźników do 64-bitowych interfejsów API.

Funkcja rzutowania do konwersji na LongLong to CLngLng() . W przypadku rzutów z typów zmiennoprzecinkowych wynik jest zaokrąglany do najbliższej liczby całkowitej za pomocą .5 zaokrąglania w górę.

Wariant

Dim Value As Variant    'Explicit
Dim Value               'Implicit

Wariant jest typem danych COM, który służy do przechowywania i wymiany wartości dowolnych typów, a dowolny inny typ w języku VBA można przypisać do wariantu. Zmienne zadeklarowane bez jawnego typu określonego przez As [Type] domyślnie na Variant.

Warianty są przechowywane w pamięci jako struktura VARIANT, która składa się z deskryptora typu bajtu ( VARTYPE ), po którym następuje 6 bajtów zarezerwowanych, a następnie 8-bajtowy obszar danych. W przypadku typów numerycznych (w tym Date i Boolean) wartość bazowa jest przechowywana w samym wariancie. W przypadku wszystkich innych typów obszar danych zawiera wskaźnik do wartości bazowej.

wprowadź opis zdjęcia tutaj

Typ podstawowy wariantu można określić za pomocą funkcji VarType() która zwraca wartość numeryczną zapisaną w deskryptorze typu, lub funkcji TypeName() która zwraca ciąg znaków:

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"

Ponieważ warianty mogą przechowywać wartości dowolnego typu, przypisania z literałów bez podpowiedzi typu zostaną domyślnie rzutowane na wariant odpowiedniego typu zgodnie z poniższą tabelą. Literały z podpowiedziami typu zostaną rzutowane na wariant typu podpowiedzi.

Wartość Wynikowy typ
Wartości łańcuchowe Strunowy
Liczby zmiennoprzecinkowe w zakresie liczb całkowitych Liczba całkowita
Liczby zmiennoprzecinkowe w dalekim zasięgu Długo
Liczby zmiennoprzecinkowe spoza Dalekiego zasięgu Podwójnie
Wszystkie liczby zmiennoprzecinkowe Podwójnie

Uwaga: O ile nie istnieje konkretny powód do użycia wariantu (tj. Iteratora w pętli For Each lub wymagania API), tego typu należy zasadniczo unikać w przypadku rutynowych zadań z następujących powodów:

  • Nie są bezpieczne pod względem typu, co zwiększa prawdopodobieństwo wystąpienia błędów w czasie wykonywania. Na przykład Wariant posiadający wartość całkowitą po cichu zmieni się w Długi zamiast się przelewać.
  • Wprowadzają narzut przetwarzania, wymagając co najmniej jednego dodatkowego odwołania do wskaźnika.
  • Wymaganie pamięci dla wariantu jest zawsze co najmniej 8 bajtów wyższe niż potrzebne do przechowywania typu bazowego.

Funkcja rzutowania do konwersji na wariant to CVar() .

LongPtr

Dim Value As LongPtr

LongPtr został wprowadzony do VBA w celu obsługi platform 64-bitowych. W systemie 32-bitowym jest traktowany jako Long, a w systemach 64-bitowych jest traktowany jako LongLong .

Jego podstawowym zastosowaniem jest zapewnienie przenośnego sposobu przechowywania i przekazywania wskaźników na obu architekturach (patrz Zmiana zachowania kodu w czasie kompilacji .

Chociaż system operacyjny traktuje go jako adres pamięci, gdy jest używany w wywołaniach API, należy zauważyć, że VBA traktuje go jak typ podpisany (i dlatego podlega przepełnieniu niepodpisanemu). Z tego powodu żadna arytmetyka wskaźnika wykonana przy użyciu LongPtrs nie powinna używać porównań > lub < . To „dziwactwo” pozwala również, że dodanie prostych przesunięć wskazujących prawidłowe adresy w pamięci może powodować błędy przepełnienia, dlatego należy zachować ostrożność podczas pracy ze wskaźnikami w VBA.

Funkcja rzutowania do konwersji na LongPtr to CLngPtr() . W przypadku rzutów z typów zmiennoprzecinkowych wynik jest zaokrąglany do najbliższej wartości całkowitej z 0,5 zaokrąglaniem w górę (chociaż ponieważ jest to zwykle adres pamięci, użycie go jako celu przydziału do obliczenia zmiennoprzecinkowego jest co najwyżej niebezpieczne).

Dziesiętny

Dim Value As Variant
Value = CDec(1.234)

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

Typ danych Decimal jest dostępny tylko jako podtyp Variant , więc musisz zadeklarować dowolną zmienną, która musi zawierać Decimal jako Variant a następnie przypisać wartość Decimal za pomocą funkcji CDec . Słowo kluczowe Decimal jest słowem zastrzeżonym (co sugeruje, że VBA ostatecznie doda obsługę pierwszej klasy dla tego typu), więc Decimal nie może być używany jako nazwa zmiennej lub procedury.

Typ Decimal wymaga 14 bajtów pamięci (oprócz bajtów wymaganych przez wariant nadrzędny) i może przechowywać liczby z maksymalnie 28 miejscami dziesiętnymi. W przypadku liczb bez miejsc po przecinku zakres dozwolonych wartości wynosi -79 228,162,514,264,337,593,543,950,335 do + 79 228,162,514,264,337,593,543,950,335 włącznie. W przypadku liczb zawierających maksymalnie 28 miejsc po przecinku zakres dozwolonych wartości wynosi od -7,9228162514264337593543950335 do +7,9228162514264337593543950335 włącznie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow