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.
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
- Prepara un array del mismo tamaño que el original
- Recorre el original y copia en orden solo los elementos no vacíos
- 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
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.
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 quesource(i) <> "", pero no produce error si un elemento esEmptyoNull(ambos se eliminan) - Usar
LBound/UBound: El índice inicial de los arrays creados con la funciónArraydepende deOption Base, y los obtenidos deRange.Valuesiempre 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 sicount = 0la función devuelveArray(), un array vacío - Comprobar el valor devuelto: Un array vacío se detecta con
UBound(array) < LBound(array)
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 Preservepara mayor eficiencia - Devuelve
Array()cuando todos los elementos están vacíos para queReDim ... To -1no produzca un error - Usa
Trimcuando también quieras eliminar los elementos con solo espacios