VBA
Słowo kluczowe opcji VBA
Szukaj…
Składnia
- Opcja opcja Nazwa [wartość]
- Opcja Jawna
- Opcja Porównaj {Tekst | Binarny | Baza danych}
- Opcja Moduł prywatny
- Podstawa opcji {0 | 1}
Parametry
Opcja | Szczegół |
---|---|
Wyraźny | Wymagaj deklaracji zmiennych w module, w którym jest określony (najlepiej we wszystkich); z tą opcją określona, użycie niezadeklarowanej (/ błędnej) zmiennej staje się błędem kompilacji. |
Porównaj tekst | Sprawia, że porównania ciągów w module nie uwzględniają wielkości liter, na podstawie ustawień regionalnych systemu, nadając priorytet równoważności alfabetycznej (np. „A” = „A”). |
Porównaj binarne | Domyślny tryb porównywania ciągów. Sprawia, że w porównaniach napisów modułu rozróżniana jest wielkość liter, porównanie ciągów przy użyciu reprezentacji binarnej / wartości liczbowej każdego znaku (np. ASCII). |
Porównaj bazę danych | (Tylko MS-Access) Sprawia, że porównania ciągów modułu działają tak, jak w instrukcji SQL. |
Moduł prywatny | Zapobiega uzyskiwaniu dostępu do członka Public modułu spoza projektu, w którym rezyduje moduł, skutecznie ukrywając procedury przed aplikacją hosta (tj. Niedostępne do użycia jako makra lub funkcje zdefiniowane przez użytkownika). |
Opcja Podstawa 0 | Ustawienia domyślne. Ustawia dolną granicę niejawnej tablicy na 0 w module. Gdy tablica zostanie zadeklarowana bez wyraźnej dolnej granicy, zostanie użyte 0 . |
Baza opcji 1 | Ustawia dolną granicę niejawnej tablicy na 1 w module. Gdy tablica zostanie zadeklarowana bez wyraźnej dolnej granicy, zostanie użyta wartość 1 . |
Uwagi
Znacznie łatwiej jest kontrolować granice tablic, jawnie deklarując granice, niż pozwalając kompilatorowi powrócić do deklaracji Option Base {0|1}
. Można to zrobić w następujący sposób:
Dim myStringsA(0 To 5) As String '// This has 6 elements (0 - 5)
Dim myStringsB(1 To 5) As String '// This has 5 elements (1 - 5)
Dim myStringsC(6 To 9) As String '// This has 3 elements (6 - 9)
Opcja Jawna
Za najlepszą praktykę uważa się zawsze używanie Option Explicit
w VBA, ponieważ zmusza ona programistę do zadeklarowania wszystkich swoich zmiennych przed użyciem. Ma to również inne zalety, takie jak automatyczne pisanie wielkimi literami dla deklarowanych nazw zmiennych i IntelliSense.
Option Explicit
Sub OptionExplicit()
Dim a As Integer
a = 5
b = 10 '// Causes compile error as 'b' is not declared
End Sub
Ustawienie Wymagaj deklaracji zmiennej w narzędziach VBE ► Opcje ► Strona właściwości Edytora umieści opcję Opcja Jawna na górze każdego nowo utworzonego arkusza kodu.
Pozwoli to uniknąć głupich błędów w kodowaniu, takich jak błędy ortograficzne, a także wpływać na użycie poprawnego typu zmiennej w deklaracji zmiennej. (Więcej przykładów podano ZAWSZE Użyj opcji „Wyraźnie” .)
Opcja Porównaj {Binarny | Tekst | Baza danych}
Opcja Porównaj Binarne
Porównanie binarne rozróżnia wielkość liter w modułach / klasach. Technicznie, z tą opcją, porównania ciągów są wykonywane przy użyciu kolejności sortowania reprezentacji binarnych każdego znaku.
A <B <E <Z <a <b <e <z
Jeśli w module nie podano opcji Porównywanie opcji, domyślnie używana jest opcja Binarna.
Option Compare Binary
Sub CompareBinary()
Dim foo As String
Dim bar As String
'// Case sensitive
foo = "abc"
bar = "ABC"
Debug.Print (foo = bar) '// Prints "False"
'// Still differentiates accented characters
foo = "ábc"
bar = "abc"
Debug.Print (foo = bar) '// Prints "False"
'// "b" (Chr 98) is greater than "a" (Chr 97)
foo = "a"
bar = "b"
Debug.Print (bar > foo) '// Prints "True"
'// "b" (Chr 98) is NOT greater than "á" (Chr 225)
foo = "á"
bar = "b"
Debug.Print (bar > foo) '// Prints "False"
End Sub
Opcja Porównaj tekst
Opcja Porównaj tekst powoduje, że wszystkie porównania ciągów w module / klasie korzystają z porównania bez rozróżniania wielkości liter .
(A | a) <(B | b) <(Z | z)
Option Compare Text
Sub CompareText()
Dim foo As String
Dim bar As String
'// Case insensitivity
foo = "abc"
bar = "ABC"
Debug.Print (foo = bar) '// Prints "True"
'// Still differentiates accented characters
foo = "ábc"
bar = "abc"
Debug.Print (foo = bar) '// Prints "False"
'// "b" still comes after "a" or "á"
foo = "á"
bar = "b"
Debug.Print (bar > foo) '// Prints "True"
End Sub
Opcja Porównaj bazę danych
Opcja Porównaj bazę danych jest dostępna tylko w MS Access. Ustawia moduł / klasę, aby korzystała z bieżących ustawień bazy danych w celu ustalenia, czy użyć trybu tekstowego czy binarnego.
Uwaga: odradza się korzystanie z tego ustawienia, chyba że moduł jest używany do pisania niestandardowych funkcji UDF programu Access (funkcje zdefiniowane przez użytkownika), które powinny traktować porównania tekstowe w taki sam sposób, jak zapytania SQL w tej bazie danych.
Podstawa opcji {0 | 1}
Option Base
służy do deklarowania domyślnej dolnej granicy elementów tablicy . Jest deklarowany na poziomie modułu i jest ważny tylko dla bieżącego modułu.
Domyślnie (a zatem jeśli nie określono opcji Podstawa), Podstawa wynosi 0. Co oznacza, że pierwszy element dowolnej tablicy zadeklarowanej w module ma indeks 0.
Jeśli określono Option Base 1
, pierwszy element tablicy ma indeks 1
Przykład w bazie 0:
Option Base 0
Sub BaseZero()
Dim myStrings As Variant
' Create an array out of the Variant, having 3 fruits elements
myStrings = Array("Apple", "Orange", "Peach")
Debug.Print LBound(myStrings) ' This Prints "0"
Debug.Print UBound(myStrings) ' This print "2", because we have 3 elements beginning at 0 -> 0,1,2
For i = 0 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
End Sub
Ten sam przykład z bazą 1
Option Base 1
Sub BaseOne()
Dim myStrings As Variant
' Create an array out of the Variant, having 3 fruits elements
myStrings = Array("Apple", "Orange", "Peach")
Debug.Print LBound(myStrings) ' This Prints "1"
Debug.Print UBound(myStrings) ' This print "3", because we have 3 elements beginning at 1 -> 1,2,3
For i = 0 To UBound(myStrings)
Debug.Print myStrings(i) ' This triggers an error 9 "Subscript out of range"
Next i
End Sub
Drugi przykład wygenerował indeks dolny poza zakresem (błąd 9) na pierwszym etapie pętli, ponieważ podjęto próbę uzyskania dostępu do indeksu 0 tablicy, a ten indeks nie istnieje, ponieważ moduł jest zadeklarowany w Base 1
Prawidłowy kod z bazą 1 to:
For i = 1 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
Należy zauważyć, że funkcja podziału zawsze tworzy tablicę z indeksem elementu liczonym od zera, niezależnie od ustawienia Option Base
. Przykłady korzystania z funkcji podziału można znaleźć tutaj
- Funkcja podziału
- Zwraca zerową, jednowymiarową tablicę zawierającą określoną liczbę podciągów.
W programie Excel właściwości Range.Value
i Range.Formula
dla zakresu wielokomórkowego zawsze zwracają tablicę wariantu 2D opartą na 1.
Podobnie w ADO metoda Recordset.GetRows
zawsze zwraca tablicę 2D opartą na 1.
Jedną z zalecanych „najlepszych praktyk” jest zawsze używanie funkcji LBound i UBound do określania zakresu tablicy.
'for single dimensioned array
Debug.Print LBound(arr) & ":" & UBound(arr)
Dim i As Long
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next i
'for two dimensioned array
Debug.Print LBound(arr, 1) & ":" & UBound(arr, 1)
Debug.Print LBound(arr, 2) & ":" & UBound(arr, 2)
Dim i As long, j As Long
For i = LBound(arr, 1) To UBound(arr, 1)
For j = LBound(arr, 2) To UBound(arr, 2)
Debug.Print arr(i, j)
Next j
Next i
Podstawa Option Base 1
musi znajdować się na górze każdego modułu kodu, w którym tworzona jest tablica, lub musi zostać ponownie zwymiarowana, jeśli tablice mają być konsekwentnie tworzone z dolną granicą 1.