VBA
Opción VBA Palabra clave
Buscar..
Sintaxis
- Opción optionName [valor]
- Opción explícita
- Opción Comparar {Texto | Binario Base de datos}
- Opción Módulo Privado
- Base de opciones {0 | 1}
Parámetros
Opción | Detalle |
---|---|
Explícito | Requerir declaración de variable en el módulo en el que se especifica (idealmente todas); con esta opción especificada, el uso de una variable no declarada (/ mal escrito) se convierte en un error de compilación. |
Comparar texto | Hace que las comparaciones de cadenas del módulo no distingan entre mayúsculas y minúsculas, según la configuración regional del sistema, dando prioridad a la equivalencia alfabética (por ejemplo, "a" = "A"). |
Comparar binario | Modo de comparación de cadena predeterminado. Hace que las comparaciones de cadenas del módulo distingan entre mayúsculas y minúsculas, comparando cadenas utilizando la representación binaria / valor numérico de cada carácter (por ejemplo, ASCII). |
Comparar base de datos | (Solo MS-Access) Hace que las comparaciones de cadenas del módulo funcionen como lo harían en una declaración SQL. |
Módulo privado | Impide que se acceda al miembro Public del módulo desde fuera del proyecto en el que reside el módulo, ocultando efectivamente los procedimientos de la aplicación host (es decir, no está disponible para usar como macros o funciones definidas por el usuario). |
Opción Base 0 | Configuración predeterminada. Establece el límite inferior de la matriz implícita en 0 en un módulo. Cuando se declara una matriz sin un valor límite inferior explícito, se utilizará 0 . |
Opción Base 1 | Establece el límite inferior de la matriz implícita en 1 en un módulo. Cuando se declara una matriz sin un valor explícito límite inferior, 1 se utilizará. |
Observaciones
Es mucho más fácil controlar los límites de las matrices declarando los límites explícitamente en lugar de dejar que el compilador retroceda en una declaración de Option Base {0|1}
. Esto se puede hacer así:
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)
Opción explícita
Se considera la mejor práctica usar siempre Option Explicit
en VBA, ya que obliga al desarrollador a declarar todas sus variables antes de usar. Esto también tiene otros beneficios, como el uso de mayúsculas automáticas para los nombres de variables declarados e IntelliSense.
Option Explicit
Sub OptionExplicit()
Dim a As Integer
a = 5
b = 10 '// Causes compile error as 'b' is not declared
End Sub
La configuración de Requerir declaración de variable dentro de las Herramientas de VBE ► Opciones ► página de propiedades del editor colocará la declaración Option Explicit en la parte superior de cada hoja de códigos recién creada.
Esto evitará errores de codificación tontos, como errores ortográficos, y también influirá en el uso del tipo de variable correcto en la declaración de la variable. (Algunos ejemplos más se dan en SIEMPRE use "Opción explícita" .)
Opción Comparar {Binary | Texto | Base de datos}
Opción Comparar Binario
La comparación binaria hace que todas las comprobaciones de igualdad de cadenas dentro de un módulo / clase distingan entre mayúsculas y minúsculas . Técnicamente, con esta opción, las comparaciones de cadenas se realizan utilizando el orden de clasificación de las representaciones binarias de cada carácter.
A <B <E <Z <a <b <e <z
Si no se especifica ninguna opción de comparación en un módulo, se usa Binary de forma predeterminada.
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
Opción Comparar texto
Option Compare Text hace que todas las comparaciones de cadenas dentro de un módulo / clase use una comparación que no distinga mayúsculas y minúsculas .
(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
Opción Comparar base de datos
La base de datos de comparación de opciones solo está disponible dentro de MS Access. Establece el módulo / clase para usar la configuración actual de la base de datos para determinar si usar el modo Texto o Binario.
Nota: se desaconseja el uso de esta configuración a menos que el módulo se use para escribir UDF (funciones definidas por el usuario) personalizadas de Access que deban tratar las comparaciones de texto de la misma manera que las consultas SQL en esa base de datos.
Base de opciones {0 | 1}
Option Base
se utiliza para declarar el límite inferior predeterminado de los elementos de la matriz . Se declara a nivel de módulo y solo es válido para el módulo actual.
De forma predeterminada (y, por lo tanto, si no se especifica una Base de Opción), la Base es 0. Lo que significa que el primer elemento de cualquier matriz declarada en el módulo tiene un índice de 0.
Si se especifica la Option Base 1
, el primer elemento de la matriz tiene el índice 1
Ejemplo en 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
Mismo ejemplo con 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
El segundo ejemplo generó un Subíndice fuera de rango (Error 9) en la primera etapa del bucle porque se realizó un intento de acceder al índice 0 de la matriz, y este índice no existe ya que el módulo se declara con Base 1
El código correcto con Base 1 es:
For i = 1 To UBound(myStrings)
Debug.Print myStrings(i) ' This will print "Apple", then "Orange", then "Peach"
Next i
Debe tenerse en cuenta que la función Dividir siempre crea una matriz con un índice de elemento basado en cero, independientemente de la configuración de Option Base
. Los ejemplos sobre cómo usar la función Split se pueden encontrar aquí.
- Función de división
- Devuelve una matriz unidimensional basada en cero que contiene un número específico de subcadenas.
En Excel, las propiedades Range.Value
y Range.Formula
para un rango de varias celdas siempre devuelven una matriz de Variante 2D basada en 1.
Del mismo modo, en ADO, el método Recordset.GetRows
siempre devuelve una matriz 2D basada en 1.
Una de las mejores prácticas recomendadas es usar siempre las funciones LBound y UBound para determinar las extensiones de una matriz.
'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
La Option Base 1
debe estar en la parte superior de cada módulo de código donde se crea una matriz o se redimensiona para que las matrices se creen de manera consistente con un límite inferior de 1.