VBA
VBA-alternativ sökord
Sök…
Syntax
- Alternativalternativ Namn [värde]
- Alternativ Explicit
- Alternativ Jämför {Text | Binär | Databas}
- Alternativ privat modul
- Alternativbas {0 | 1}
parametrar
Alternativ | Detalj |
---|---|
Explicit | Kräv variabel deklaration i modulen den anges i (helst alla); med det här alternativet specificerat, blir en kompileringsfel att använda en odeklarerad (/ felstavad) variabel. |
Jämför text | Gör modulens strängjämförelser att vara okänsliga för versaler, baserade på systeminställning, prioritera alfabetisk ekvivalens (t.ex. "a" = "A"). |
Jämför Binary | Standardläge för jämförelse av sträng. Gör modulens strängjämförelser att vara skiftlägeskänsliga och jämföra strängar med det binära representations- / numeriska värdet för varje tecken (t.ex. ASCII). |
Jämför databas | (Endast MS-Access) Gör modulens strängjämförelser att fungera som de skulle i ett SQL-uttalande. |
Privat modul | Förhindrar att modulens Public medlem kommer åt från utsidan av projektet som modulen finns i, döljer effektivt procedurer från värdapplikationen (dvs. inte tillgänglig för användning som makron eller användardefinierade funktioner). |
Alternativ Base 0 | Standardinställning. Ställer in den implicita matrisen nedre gränsen till 0 i en modul. När en matris deklareras utan ett uttryckligt lägre gränsvärde kommer 0 att användas. |
Alternativ Base 1 | Ställer in den implicita matrisen nedre gränsen till 1 i en modul. När en array deklareras utan ett explicit lägre gränsvärde, 1 kommer att användas. |
Anmärkningar
Det är mycket lättare att kontrollera gränserna för matriser genom att deklarera gränserna uttryckligen snarare än att låta kompilatorn falla tillbaka på en Option Base {0|1}
-deklaration. Detta kan göras så:
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)
Alternativ Explicit
Det anses bästa praxis att alltid använda Option Explicit
i VBA eftersom det tvingar utvecklaren att deklarera alla sina variabler före användning. Detta har också andra fördelar, till exempel autokapitalisering för deklarerade variabla namn och IntelliSense.
Option Explicit
Sub OptionExplicit()
Dim a As Integer
a = 5
b = 10 '// Causes compile error as 'b' is not declared
End Sub
Om du ställer in Kräver variabel deklaration i VBE: s verktyg ► Alternativ ► Editor-egenskapssidan placeras alternativet Explicit- uttalandet högst upp på varje nyskapat kodark.
Detta undviker dumma kodfel som felstavningar och påverkar dig att använda rätt variabeltyp i variabeldeklarationen. (Några fler exempel ges på ALLTID Använd "Option Explicit" .)
Alternativ Jämför {Binary | Text | Databas}
Alternativ Jämför Binary
Binärjämförelse gör alla kontroller för strängjämlikhet inom en modul / klass är känslig . Tekniskt med detta alternativ utförs strängjämförelser med sorteringsordning för de binära representationerna för varje tecken.
A <B <E <Z <a <b <e <z
Om inget alternativ Jämför anges i en modul används Binary som standard.
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
Alternativ Jämför text
Alternativ Jämför text gör att alla strängjämförelser inom en modul / klass använder sig av en okänslig jämförelse.
(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
Alternativ Jämför databas
Alternativ Jämför databas är endast tillgänglig inom MS Access. Den ställer in modulen / klassen för att använda de aktuella databasinställningarna för att avgöra om du vill använda text- eller binärläge.
Obs! Användningen av den här inställningen avskräcks om inte modulen används för att skriva anpassade Access UDF: er (användardefinierade funktioner) som ska behandla textjämförelser på samma sätt som SQL-frågor i den databasen.
Alternativbas {0 | 1}
Option Base
används för att förklara den förvalda undre gränsen för arrayelement. Det deklareras på modulnivå och gäller endast för den aktuella modulen.
Som standard (och därmed om ingen Option Base anges) är Base 0. Vilket innebär att det första elementet i en matris som deklareras i modulen har ett index på 0.
Om Option Base 1
anges har det första matriselementet index 1
Exempel i bas 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
Samma exempel med bas 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
Det andra exemplet genererade ett Subscript utanför räckvidden (Fel 9) i det första slingsteget eftersom ett försök att få tillgång till index 0 för matrisen gjordes, och detta index finns inte eftersom modulen förklaras med Base 1
Rätt kod med Base 1 är:
For i = 1 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
Det bör noteras att Split-funktionen alltid skapar en matris med ett nollbaserat elementindex oavsett inställning för Option Base
. Exempel på hur man använder splitfunktionen kan hittas här
- Delad funktion
- Returnerar en nollbaserad, endimensionell matris som innehåller ett specificerat antal underlag.
I Excel Range.Value
och Range.Formula
egenskaperna för ett multicellområde alltid en 1-baserad 2D Variant-grupp.
På samma sätt Recordset.GetRows
metoden Recordset.GetRows
i ADO alltid en 1-baserad 2D-grupp.
En rekommenderad "bästa praxis" är att alltid använda LBound- och UBound- funktionerna för att bestämma omfattningen av en matris.
'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
Option Base 1
måste vara högst upp i varje kodmodul där en matris skapas eller dimensioneras på nytt om matriser konsekvent ska skapas med en undre gräns 1.