W artykule Uchwyt okna w 64-bitowym środowisku VBA 7, poruszającym zagadnienie przekazania uchwytu hwnd w 32 bitowej i 64 bitowej wersji MS Access 2010+ oraz udzielenia odpowiedzi na pytanie: „Czy w 64 bitowym VBA 7 właściwość Me.hwnd jest liczbą typu LongLong” w celu sprawdzenia typu zmiennej użyłem funkcji:
Function VarType(VarName) As VbVarType
zwracającej liczbę typu Integer określającą typ zmiennej.
Aby określić opisowy typ zmiennej, który odpowiada zwracanej wartości, spróbuję napisać funkcję, która zwróci nam numeryczny i opisowy typ zmiennej.
Najprościej by było skorzystać z tabeli ze strony msdn.microsoft.com - Opis Funkcji VarType
Stała | Wartość | Opis |
---|---|---|
vbEmpty | 0 | Empty (puste, niezainicjowana) |
vbNull | 1 | Null (brak prawidłowych wartości) |
vbInteger | 2 | Integer (liczba całkowita) |
vbLong | 3 | Long integer (liczba całkowita długa) |
vbSingle | 4 | Single-precision (liczba zmiennoprzecinkowa pojedynczej precyzji) |
vbDouble | 5 | Double-precision (liczba zmiennoprzecinkowa podwójnej precyzji) |
vbCurrency | 6 | Currency value (wartość walutowa) |
vbDate | 7 | Date value (Data/Godzina) |
vbString | 8 | String (ciąg znaków) |
vbObject | 9 | Object (obiekt) |
vbError | 10 | Error value (wartość błędu) |
vbBoolean | 11 | Boolean value (wartość logiczna) |
vbVariant | 12 | Variant (używana tylko w przypadku tablicy typu Variant) |
vbDataObject | 13 | A data access object (obiekt dostępu do danych) |
vbDecimal | 14 | Decimal value (wartość dziesiętna) |
vbByte | 17 | Byte value (wartość bajtowa) |
vbLongLong | 20 | LongLong integer (liczba 64-bitowa, tylko w środowisku 64-bitowym) |
vbUserDefinedType | 36 | Variants that contain user-defined types (typ Variant zawierający typy zdefiniowane przez użytkownika) |
vbArray | 8192 | Array |
- • vbArray
- Funkcja VarType(...) nigdy nie zwraca samej wartości vbArray. W przypadku przekazania tablicy do funkcji VarType(...) zwracana jest wartość = 8192 powiększona o wartość stałej odpowiadającej typowi przekazanej tablicy.
' zadeklarujmy tablicę typu Long Dim lngTablica() As Long VarType(lngTablica) '- zwraca 8195 = vbArray + vbLong = 8192 + 3 ' zadeklarujmy tablicę typu Object Dim objObiekty() As Object VarType(objObiekty) '- zwraca 8201 = vbArray + vbObject = 8192 + 9
- • vbVariant
- Stała vbVariant jest zwracana tylko w połączeniu ze stałą vbArray w celu wskazania, że argument funkcji VarType(...) jest tablicą wartości typu Variant.
' zadeklarujmy tablicę typu Variant Dim varTablica() As Variant VarType(varTablica) ' - zwraca 8204 = vbArray + vbVariant = 8192 + 12 ' zadeklarujmy zmienną typu Variant Dim varVariant As Variant ' przekształćmy ją w tablicę typu Variant varVariant = Array("Lista elementów") VarType(varVariant) ' - zwraca 8204 = vbArray + vbVariant = 8192 + 12 ' Ale przypisanie do zmiennej typu Variant, tablicy typu Long, nie daje tablicy typu Variant Dim lngTablica() As Long ' przypisz do zmiennej typu Variant tablicę typu Long varVariant = lngTablica VarType(varVariant) ' - zwraca 8192 = vbArray + vbLong = 8192 + 3
- • vbObject
- Jeżeli obiekt ma właściwość domyślną, wywołanie funkcji VarType(obiekt) zwróci typ domyślnej właściwości obiektu.
' dla formantu klasy CommandButton (przycisk) VarType (Me.btnTest) ' - zwraca 9 = vbObject ' dla niezwiązanego formantu klasy TextBox (pole tekstowe), ' którego domyślną właściwością jest .Value funkcja VarType zwraca: ' 1. dla pustego formantu VarType (Me.txtTextBox) ' - zwraca 1 = vbNull - Null (brak poprawnych danych) ' 2. po wpisaniu z klawiatury liczby 123 VarType (Me.txtTextBox) ' - zwraca 8 = vbString - String (ciąg znaków) ' 3. po wypełnieniu formantu za pomocą kodu Me.txtTextBox = 123 MsgBox VarType(Me.txtTextBox) ' - zwraca 2 = vbInteger - Integer (liczba całkowita)
- • vbInteger
- Po zadeklarowaniu zmiennej jako Variant i przypisaniu jej wartości z zakresu typu Byte funkcja VarType(VarName) zwróci domyślny typ vbInteger (liczba całkowita). Nie ma powodów do obaw, że dla niejawnego przypisania do zmiennej typu Variant liczby całkowitej leżącej poza zakresem liczby typu Integer (-32768 do 32767), VBA obetnie liczbę do zakresu Integer. W takim przypadku funkcja VarType(VarName) zwróci nam typ vbLong (liczba całkowita długa).
- • vbDouble
- Po zadeklarowaniu zmiennej jako Variant i przypisaniu jej wartości z zakresu typu Single funkcja VarType(VarName) zwróci domyślny typ vbDouble (liczba zmiennoprzecinkowa podwójnej precyzji).
' zadeklarujmy zmienną typu Variant Dim varVariant As Variant varVariant = 123 MsgBox VarType(varVariant) ' - zwraca 2 = vbInteger - Integer (liczba całkowita) varVariant = 32768 MsgBox VarType(varVariant) ' - zwraca 3 = vbLong - Long (liczba całkowita długa) varVariant = 123.01 MsgBox VarType(varVariant) ' - zwraca 5 = vbDouble - ' Double (liczba zmiennoprzecinkowa podwójnej precyzji)
Mając już jako takie podstawy odnośnie typów zmiennych zwracanych przez funkcję VarType(VarName), spróbę napisać funkcję zwracającą liczbowy i opisowy typ zmiennych. Jeden mały problem to stała vbLongLong patrz tabela typów zmiennych. Stała ta występuje tylko w 64-bitowym środowisku VBA 7. Ale od czego mamy stałą kompilacji warunkowej Win64. No to jeden problem z głowy. Drugim problemem jest określenie typu tablicy, kiedy wartość zwracana przez funkcję VarType(VarName) jest większa od vbArray = 8192. W tym przypadku musimy rekurencujnie wywołać funkcję z argumentem (iType - vbArray), by określić typ tablicy. I to już wszystko:
' Public Function GetVarType(iType As Integer) As String ' ------------------------------------------------------- ' autor: Zbigniew Bratko - 01.2016 ' [iType] - liczba typu Integer, zwracana przez funkcję VarType(varname) ' [Out] - zwraca wartość opisową typu zmiennej, przypisanej do argumentu iType ' Uwaga ! ' - w przypadku przekazania argumentu iType > vbArray odpowiadajacego tablicy, ' następuje rekurencyjne wywołanie funkcji GetVarType(iType - vbArray) ' w celu określenia typu tablicy. ' - stała kompilacji warunkowej #If Win64 została użyta dla typu vbLongLong, ponieważ ' w 32-bitowym środowisku stała ta nie występuje (wystąpi błąd kompilacji) ' ' wywołanie - GetVarType(VarType(VarName)) ' Public Function GetVarType(iType As Integer) As String Select Case iType Case vbEmpty GetVarType = "Typ = " & CStr(vbEmpty) & " - Empty (niezainicjowana)" Case vbNull GetVarType = "Typ = " & CStr(vbNull) & " - Null (brak poprawnych danych)" Case vbInteger GetVarType = "Typ = " & CStr(vbInteger) & " - Integer (liczba całkowita)" Case vbLong GetVarType = "Typ = " & CStr(vbLong) & " - Long (liczba całkowita długa)" Case vbSingle GetVarType = "Typ = " & CStr(vbSingle) & " - Single (liczba zmiennoprzecinkowa" & _ " pojedynczej precyzji)" Case vbDouble GetVarType = "Typ = " & CStr(vbDouble) & " - Double (liczba zmiennoprzecinkowa" & _ " podwójnej precyzji)" Case vbCurrency GetVarType = "Typ = " & CStr(vbCurrency) & " - Currency (typ walutowy)" Case vbDate GetVarType = "Typ = " & CStr(vbDate) & " - Date (data, godzina)" Case vbString GetVarType = "Typ = " & CStr(vbString) & " - String (ciąg znaków)" Case vbObject GetVarType = "Typ = " & CStr(vbObject) & " - Object (obiekt)" Case vbError GetVarType = "Typ = " & CStr(vbError) & " - Error (błąd)" Case vbBoolean GetVarType = "Typ = " & CStr(vbBoolean) & " - Boolean (wartość logiczna Prawda/Fałsz)" Case vbVariant GetVarType = "Typ = " & CStr(vbVariant) & " - Variant (tylko dla tablic Variant)" Case vbDataObject GetVarType = "Typ = " & CStr(vbDataObject) & " - (Dane dostępu do obiektu)" Case vbDecimal GetVarType = "Typ = " & CStr(vbDecimal) & " - Decimal (typ dziesiętny)" Case vbByte GetVarType = "Typ = " & CStr(vbByte) & " - Byte (liczba całkowita - bajt)" #If Win64 Then Case vbLongLong GetVarType = "Typ = " & CStr(vbLongLong) & " - LongLong (liczba całkowita 8-bajtowa" & _ " - tylko 64-bitowe środowisko)" #End If Case vbUserDefinedType GetVarType = "Typ = " & CStr(vbUserDefinedType) & _ " - Variants that contain user-defined" & _ " types" & vbNewLine & _ " - (typ Variant zawierający typy zdefiniowane przez użytkownika)" ' Case vbArray ' wartość vbArray nie jest zwracana przez funkcję VarType ' GetVarType = "Typ = " & CStr(vbArray) & " - Tablica" Case Is > vbArray ' wywołaj rekurencyjnie, by sprawdzić typ tablicy GetVarType = "Tablica (" & CStr(vbArray) & "), " & GetVarType(iType - vbArray) Case Else GetVarType = "Typ = " & CStr(iType) & " - unknown (nieznany)" End Select End Function ' przykładowe wywołanie Private Sub btnTest_Click() ' zmienna typu Variant Dim varVariant As Variant ' konwertuj na tablicę varVariant = Array("Ala", "Ola") MsgBox GetVarType(VarType(varVariant)) ' zmienna typu String Dim strString As String MsgBox GetVarType(VarType(strString)) End Sub