Excluir Cadenas Vacías del Array

Los arrays de VBA suelen acabar con elementos de cadena vacía (""), por ejemplo en datos leídos de una hoja o en el resultado de la función Split.

VBA no tiene una función integrada para filtrar los elementos de un array según una condición, así que para eliminar las cadenas vacías hay que escribir el bucle uno mismo.

Este artículo crea una función que elimina las cadenas vacías de un array y explica cómo usarla y qué tener en cuenta.

¿Qué es una cadena vacía?

Una cadena vacía es una cadena de longitud 0, escrita "". Una cadena con solo un espacio, " ", no es una cadena vacía.

El enfoque básico

  1. Prepara un array del mismo tamaño que el original
  2. Recorre el original y copia en orden solo los elementos no vacíos
  3. Por último, reduce el array al número de elementos copiados con ReDim Preserve

Ejemplo de código: una función que elimina cadenas vacías

Función
Public Function RemoveEmptyStrings(ByVal source As Variant) As Variant
    Dim result() As Variant
    Dim i As Long
    Dim count As Long

    ' Si el array no tiene elementos, devuelve un array vacío tal cual
    If UBound(source) < LBound(source) Then
        RemoveEmptyStrings = Array()
        Exit Function
    End If

    ReDim result(0 To UBound(source) - LBound(source))

    For i = LBound(source) To UBound(source)
        If Len(source(i)) > 0 Then
            result(count) = source(i)
            count = count + 1
        End If
    Next i

    ' Si todos los elementos estaban vacíos, devuelve un array vacío
    If count = 0 Then
        RemoveEmptyStrings = Array()
        Exit Function
    End If

    ReDim Preserve result(0 To count - 1)
    RemoveEmptyStrings = result
End Function

Este es un ejemplo de llamada.

Ejemplo
Public Sub RemoveEmptyStringsSample()
    Dim originalArray As Variant
    Dim cleanedArray As Variant
    Dim i As Long

    originalArray = Array("Apple", "", "Banana", "", "Cherry", "Date", "")
    cleanedArray = RemoveEmptyStrings(originalArray)

    ' Un resultado vacío cumple UBound < LBound
    If UBound(cleanedArray) < LBound(cleanedArray) Then
        Debug.Print "No hay elementos válidos"
        Exit Sub
    End If

    For i = LBound(cleanedArray) To UBound(cleanedArray)
        Debug.Print cleanedArray(i)
    Next i
End Sub

La ventana Inmediato muestra Apple, Banana, Cherry y Date.

Puntos clave del código

  • Comprobar con Len(source(i)) > 0: Da el mismo resultado que source(i) <> "", pero no produce error si un elemento es Empty o Null (ambos se eliminan)
  • Usar LBound / UBound: El índice inicial de los arrays creados con la función Array depende de Option Base, y los obtenidos de Range.Value siempre empiezan en 1. No fijes el índice inicial
  • Cuando todos los elementos están vacíos: ReDim Preserve result(0 To -1) produce un error, por lo que si count = 0 la función devuelve Array(), un array vacío
  • Comprobar el valor devuelto: Un array vacío se detecta con UBound(array) < LBound(array)
No abuses de ReDim Preserve

ReDim Preserve reconstruye el array y copia los datos, por lo que llamarlo cada vez que se agrega un elemento ralentiza el proceso. Este ejemplo reserva el tamaño máximo desde el principio y lo reduce una sola vez al final.

Eliminar también los elementos con solo espacios

Para eliminar también los elementos formados solo por espacios, quita los espacios iniciales y finales con Trim antes de comprobar.

If Len(Trim(source(i))) > 0 Then

Para excluir también los espacios de ancho completo, combínalo con algo como Replace(source(i), " ", "").

Resumen

  • VBA no tiene una función integrada para eliminar cadenas vacías, así que copia los elementos a un nuevo array con un bucle
  • Prepara un array del tamaño original, rellénalo y redúcelo una sola vez al final con ReDim Preserve para mayor eficiencia
  • Devuelve Array() cuando todos los elementos están vacíos para que ReDim ... To -1 no produzca un error
  • Usa Trim cuando también quieras eliminar los elementos con solo espacios
#VBA #Array #Cadena Vacía #Manipulación de Datos