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.

require_variable_declaration

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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow