VBA
VBA Optie Sleutelwoord
Zoeken…
Syntaxis
- Optie optionName [waarde]
- Optie Expliciet
- Optie Vergelijk {Text | Binair | Database}
- Optie privémodule
- Optie Base {0 | 1}
parameters
Optie | Detail |
---|---|
uitdrukkelijk | Vereisen variabele declaratie in de module waarin het is gespecificeerd (idealiter allemaal); met deze optie opgegeven, wordt het gebruik van een niet-aangegeven (/ verkeerd gespelde) variabele een compilatiefout. |
Vergelijk tekst | Maakt de stringvergelijkingen van de module niet hoofdlettergevoelig, gebaseerd op systeemlocale, waarbij prioriteit wordt gegeven aan alfabetische equivalentie (bijvoorbeeld "a" = "A"). |
Vergelijk Binary | Standaard stringvergelijkingsmodus. Maakt de stringvergelijkingen van de module hoofdlettergevoelig, waarbij strings worden vergeleken met behulp van de binaire weergave / numerieke waarde van elk teken (bijv. ASCII). |
Database vergelijken | (Alleen MS-Access) Zorgt ervoor dat de stringvergelijkingen van de module werken zoals in een SQL-instructie. |
Privémodule | Voorkomt dat toegang tot het Public lid van de module wordt verkregen van buiten het project waarin de module zich bevindt, waardoor procedures effectief worden verborgen voor de host-applicatie (dwz niet beschikbaar voor gebruik als macro's of door de gebruiker gedefinieerde functies). |
Optie Base 0 | Standaardinstelling. Stelt de impliciete array ondergrens in op 0 in een module. Wanneer een array wordt gedeclareerd zonder een expliciete ondergrenswaarde, wordt 0 gebruikt. |
Optie Base 1 | Stelt de impliciete array ondergrens in op 1 in een module. Wanneer een array wordt gedeclareerd zonder een expliciete ondergrenswaarde, wordt 1 gebruikt. |
Opmerkingen
Het is veel eenvoudiger om de grenzen van arrays te controleren door de grenzen expliciet aan te geven in plaats van de compiler terug te laten vallen op een Option Base {0|1}
-verklaring. Dit kan als volgt:
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)
Optie Expliciet
Het wordt als beste praktijk beschouwd om Option Explicit
altijd in VBA te gebruiken, omdat het de ontwikkelaar dwingt om al zijn variabelen vóór gebruik te declareren. Dit heeft ook andere voordelen, zoals automatisch hoofdlettergebruik voor opgegeven variabelenamen en IntelliSense.
Option Explicit
Sub OptionExplicit()
Dim a As Integer
a = 5
b = 10 '// Causes compile error as 'b' is not declared
End Sub
Instelling Vereiste variabele verklaring binnen de VBE's Tools ► Opties ► Editor eigenschappenpagina zal de Option Explicit- verklaring bovenaan elk nieuw aangemaakt codeblad plaatsen.
Dit voorkomt dwaze codeerfouten zoals spelfouten en beïnvloedt je ook om het juiste variabeletype te gebruiken in de variabele declaratie. (Nog enkele voorbeelden worden gegeven op ALTIJD Gebruik "Optie Expliciet" .)
Optie Vergelijk {Binair | Tekst | Database}
Optie Vergelijk Binair
Binary vergelijking maakt alle controles voor strijkkwartet gelijkheid binnen een module / klasse hoofdlettergevoelig. Technisch gezien worden met deze optie stringvergelijkingen uitgevoerd met behulp van de sorteervolgorde van de binaire representaties van elk karakter.
A <B <E <Z <a <b <e <z
Als er in een module geen optievergelijking is opgegeven, wordt standaard Binair gebruikt.
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
Optie Tekst vergelijken
Optie Vergelijken Tekst maakt alle stringvergelijkingen binnen een module / klasse een hoofdletterongevoelige vergelijking.
(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
Optie Database vergelijken
Optie Database vergelijken is alleen beschikbaar binnen MS Access. Hiermee wordt ingesteld dat de module / klasse de huidige database-instellingen gebruikt om te bepalen of de tekst- of binaire modus moet worden gebruikt.
Opmerking: het gebruik van deze instelling wordt afgeraden, tenzij de module wordt gebruikt voor het schrijven van aangepaste Access UDF's (door de gebruiker gedefinieerde functies) die tekstvergelijkingen op dezelfde manier moeten behandelen als SQL-query's in die database.
Optie Base {0 | 1}
Option Base
wordt gebruikt om de standaard ondergrens van arrayelementen aan te geven. Het wordt op moduleniveau verklaard en is alleen geldig voor de huidige module.
Standaard (en dus als er geen Option Base is opgegeven) is de Base 0. Dit betekent dat het eerste element van een array die in de module wordt gedeclareerd, een index van 0 heeft.
Als Option Base 1
is opgegeven, heeft het eerste array-element index 1
Voorbeeld in Base 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
Hetzelfde voorbeeld met Base 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
Het tweede voorbeeld genereerde een Subscript buiten bereik (Fout 9) in de eerste lusfase omdat een poging werd gedaan om toegang te krijgen tot de index 0 van de array en deze index bestaat niet omdat de module wordt verklaard met Base 1
De juiste code met Base 1 is:
For i = 1 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
Opgemerkt moet worden dat de Split-functie altijd een array met een op nul gebaseerde elementindex maakt, ongeacht een Option Base
instelling. Voorbeelden van het gebruik van de Split- functie vindt u hier
- Split functie
- Retourneert een op nul gebaseerde, eendimensionale array met een opgegeven aantal substrings.
In Excel Range.Formula
eigenschappen Range.Value
en Range.Formula
voor een bereik met meerdere Range.Formula
altijd een op 1 gebaseerde 2D Variant-array.
Evenzo retourneert in ADO de methode Recordset.GetRows
altijd een op 1 gebaseerde 2D-array.
Een aanbevolen 'best practice' is om altijd de LBound- en UBound- functies te gebruiken om de omvang van een array te bepalen.
'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
moet bovenaan elke codemodule staan waar een array wordt gemaakt of opnieuw gedimensioneerd als arrays consistent moeten worden gemaakt met een ondergrens van 1.