HOWTO · VBA

Obtenga la longitud del array en VBA

Este tutorial demuestra diferentes formas de obtener la longitud del array en VBA.

En esta página

Para contar los elementos de un array de VBA, resta el índice más bajo del más alto y suma uno: UBound(array) - LBound(array) + 1. El + 1 incluye ambos índices extremos. Esto funciona si el array empieza en cero, en uno o en otro límite inferior declarado. UBound por sí solo solo indica el índice más alto, que no necesariamente coincide con el número de elementos. Usa COUNTA solo si quieres contar los valores no vacíos en vez de medir la capacidad del array.

Usa UBound y LBound para obtener la longitud de un array en VBA

Por ejemplo, Dim names(5 To 9) As String declara cinco elementos, con índices del 5 al 9. Su longitud es UBound(names) - LBound(names) + 1, es decir, 9 - 5 + 1 = 5. Los límites explícitos dejan claro por qué el límite superior, por sí solo, no indica la cantidad de elementos. Este procedimiento completo de VBA usa Debug.Print y & para unir la etiqueta con el valor calculado: Sub ShowArrayLength(): Dim names(5 To 9) As String: Debug.Print "Array length: " & (UBound(names) - LBound(names) + 1): End Sub. Debug.Print envía el valor calculado a la ventana Inmediato del editor de VBA; la evidencia de ejecución suministrada corresponde al ejemplo aritmético independiente en Python que aparece abajo, no a la ejecución de este procedimiento de VBA.

Si varios procedimientos necesitan el mismo cálculo, puedes poner una función auxiliar en un módulo estándar y llamarla donde haga falta: Public Function ArrayLength(ByRef values As Variant) As Long: ArrayLength = UBound(values) - LBound(values) + 1: End Function. Pásale un array que ya esté asignado; la función auxiliar presupone que se pueden consultar sus límites y no gestiona un array dinámico sin asignar. El parámetro Variant puede recibir el array, mientras que UBound y LBound conservan sus límites inferior y superior reales, incluido un límite inferior distinto de cero.

La misma fórmula se aplica a los arrays devueltos por Array, como un Variant al que se asigna Array("Glen", "Yumi", "Myla"). Calcula su longitud a partir de sus límites en lugar de dar por supuesto un límite inferior concreto. El límite inferior predeterminado de VBA puede verse afectado por Option Base, y una llamada explícita a Array o una declaración puede tener su propio comportamiento; consultar LBound evita incorporar esa suposición al cálculo.

Ejecuta este ejemplo aritmético en Python para obtener el mismo resultado; no ejecuta el procedimiento de VBA. La etiqueta visible en el código y la salida del ejemplo se mantiene en inglés:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

lower_bound = 5
upper_bound = 9
length = upper_bound - lower_bound + 1
print(f"Array length: {length}")
Array length: 5

Gestiona los arrays dinámicos y los que aún no se han asignado

Un array dinámico se declara sin límites, por ejemplo, Dim values() As String, y estos se establecen más adelante con ReDim values(1 To 4). Una vez asignado, usa la misma fórmula con UBound y LBound. Los límites de un array de tamaño fijo se definen al declararlo; los de uno dinámico dependen de su asignación actual.

Un array dinámico sin asignar no tiene límites utilizables: llamar a LBound o UBound en ese caso provoca un error en tiempo de ejecución. IsEmpty comprueba si un Variant tiene el valor especial Empty; no detecta si se ha asignado un array dinámico. Si el código puede recibir un array sin asignar, coloca las llamadas a LBound y UBound en una sección acotada de gestión de errores y trata el error de límites como el caso de un array sin asignar. Deja el resto del trabajo fuera de esa sección para no confundir un fallo ajeno con una comprobación de asignación. Una vez asignado mediante ReDim, se aplica la fórmula habitual. El procedimiento anterior usa un array de tamaño fijo, por lo que siempre tiene límites.

Usa COUNTA para contar los valores no vacíos de un array

En Excel VBA, WorksheetFunction.CountA(values) cuenta los valores no vacíos de un array según las reglas de COUNTA de Excel. Puede resultar práctico si quieres saber cuántas entradas contienen valores. No es un sustituto general de la longitud del array: un array asignado puede tener posiciones sin valor, por lo que la cantidad de entradas no vacías puede ser menor que la cantidad de índices. Si todos los elementos tienen valor, ambos recuentos pueden coincidir; si necesitas conocer la capacidad o el número de posiciones disponibles, usa en su lugar la fórmula basada en los límites.

COUNTA es una llamada a una función de hoja de cálculo, no una operación de VBA para consultar límites, y el array debe tener un formato que la función pueda aceptar. No hace falta imponer un límite de 30 elementos al usar este método. Elige UBound y LBound para contar los elementos del array, incluso si sus límites inferiores no son cero; usa COUNTA solo cuando quieras medir la cantidad de valores no vacíos.