VBA – Función Split – Dividir una Cadena de Texto en un Array
In this Article
- Uso de la función de división de VBA
- Uso de la Función de División con un Carácter Delimitador
- Uso de un parámetro de límite en una función de división
- Uso del parámetro de comparación en una función de división
- Uso de caracteres no imprimibles como carácter delimitador
- Uso de la función Join para invertir una división
- Uso de la función de división para hacer un recuento de palabras
- Cómo dividir una dirección en Celdas de la Hoja de Cálculo
- Cómo Dividir una Cadena en Celdas de una Hoja de Cálculo
- Creación de una nueva función para permitir la división desde un punto dado
Uso de la función de división de VBA
La función VBA Split divide una cadena de texto en subcadenas basándose en un carácter delimitador específico (por ejemplo, una coma, un espacio o dos puntos). Es más fácil de usar que escribir código para buscar los delimitadores en la cadena y luego extraer los valores.
Podría utilizarse si está leyendo una línea de un archivo de valores separados por comas (CSV) o si tiene una dirección de correo que está toda en una línea, pero quiere verla como varias líneas. La sintaxis es:
Split expresión, delimitador[opcional], límite[opcional], comparar[opcional]
La función VBA Split tiene cuatro parámetros:
- Expresión – La cadena de texto que desea dividir en diferentes partes.
- Delimitador (opcional) – cadena o carácter no imprimible – Define el carácter delimitador que se va a utilizar para la división. Si no se proporciona ningún carácter delimitador, se utilizará por defecto un espacio.
- Límite (opcional) – número – Define cuántas divisiones se harán. Si está en blanco, se harán todas las divisiones disponibles dentro de la cadena. Si se establece en 1, no se realizará ninguna división. Básicamente, le permite separar un número específico de valores empezando por el principio de la cadena, por ejemplo, cuando la cadena es muy larga y sólo necesita las tres primeras divisiones.
- Comparar (opcional) – Si el delimitador es un carácter de texto, se utiliza para alternar si el delimitador distingue entre mayúsculas y minúsculas o no. Los valores son vbBinaryCompare (distingue entre mayúsculas y minúsculas) y vbTextCompare (no distingue entre mayúsculas y minúsculas).
La función Split siempre devuelve un array.
Ejemplo simple de la función Split
Sub Ejemplo_Funcion_Split()
'Definir variable
Dim MyArray() As String, MyString As String, I As Variant
'Ejemplo de cadena con delimitadores de espacio
MyString = "Uno Dos Tres Cuatro"
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString)
'iterar por el array creado para mostrar cada valor
For Each I In MyArray
MsgBox I
Next I
End Sub
En este ejemplo, no se especifica ningún delimitador porque todas las palabras tienen un espacio entre ellas, por lo que se puede utilizar el delimitador por defecto (espacio).
El array no tiene dimensiones, y se establece como una cadena. La variable I, que se utiliza en el bucle For…Next debe ser dimensionada como una variante.
Cuando este código se ejecuta, mostrará cuatro cuadros de mensaje, uno para cada una de las divisiones, por ejemplo: Uno, Dos, Tres. Cuatro.
Tenga en cuenta que si hay un doble espacio entre las palabras de la cadena, esto se evaluará como una división, aunque sin nada en ella. Este puede no ser el resultado que usted desea ver.
Puede solucionar este problema utilizando la función Replace para reemplazar cualquier espacio doble por un solo espacio:
MyString = Replace(MyString, " ", " ")
Un espacio final o inicial también puede causar problemas al producir una división vacía. A menudo son muy difíciles de ver. Puede eliminar estos espacios extraños utilizando la función TRIM:
MyString = Trim(MyString)
Uso de la Función de División con un Carácter Delimitador
Podemos utilizar como delimitador un punto y coma (;). Esto se encuentra con frecuencia en las cadenas de direcciones de correo electrónico para separar las direcciones. Es posible que te envíen un correo electrónico que se comparta con varios colegas y quieras ver una lista en tu hoja de trabajo de a quién ha llegado. Puede copiar fácilmente las direcciones de correo electrónico de las casillas «Para» o «Copiar» del correo electrónico en su código.
Sub Ejemplo_Split_Separador_PuntoYComa()
'Definir variables
Dim MyArray() As String, MyString As String, I As Variant, N As Integer
'Ejemplo de cadena con delimitadores de punto y coma
MyString = "john@myco.com;jane@myco.com;bill@myco.com;james@myco.com"
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString, ";")
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'iterar a través del array
For N = 0 To UBound(MyArray)
'Coloque cada dirección de correo electrónico en la primera columna de la hoja de cálculo
Range("A" & N + 1).Value = MyArray(N)
Next N
End Sub
Observe que se utiliza un bucle For…Next para iterar a través del array. El primer elemento del array siempre empieza en cero, y la función Upper Bound se utiliza para obtener el número máximo de elementos.
Después de ejecutar este código, tu hoja de cálculo tendrá el siguiente aspecto:
Uso de un parámetro de límite en una función de división
El parámetro límite permite realizar un número específico de divisiones desde el inicio de la cadena. Desafortunadamente, no se puede proporcionar una posición de inicio o un rango de divisiones a realizar, por lo que es bastante básico. Puede crear su propio código VBA para crear una función que haga esto, y esto se explicará más adelante en este artículo.
Sub Split_con_Limite()
'Crear variables
Dim MyArray() As String, MyString As String, I As Variant, N As Integer
'Ejemplo de cadena con delimitadores de comas
MyString = "Uno,Dos,Tres,Cuatro,Cinco,Seis"
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString, ",", 4)
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'Iterar a través del array
For N = 0 To UBound(MyArray)
'Coloque cada división en la primera columna de la hoja de cálculo
Range("A" & N + 1).Value = MyArray(N)
Next N
End Sub
Después de ejecutar este código, su hoja de trabajo tendrá el siguiente aspecto:
Sólo los tres primeros valores divididos se muestran por separado. Los tres últimos valores se muestran como una cadena larga y no se dividen.
Si elige un valor límite que sea mayor que el número de delimitadores dentro de una cadena, no se producirá un error. La cadena se dividirá en todas las partes que la componen como si no se hubiera proporcionado el valor límite.
Uso del parámetro de comparación en una función de división
El parámetro Compare determina si el delimitador distingue entre mayúsculas y minúsculas o no. Esto no es aplicable si los delimitadores son comas, puntos y comas o dos puntos.
Nota: En su lugar, siempre puede colocar Option Compare Text en la parte superior de su módulo para eliminar la distinción entre mayúsculas y minúsculas para todo el módulo.
Sub Split_Comparacion_Binaria()
'Crear variables
Dim MyArray() As String, MyString As String, I As Variant, N As Integer
'Ejemplo de cadena con delimitadores X
MyString = "UnoXDosXTresxCuatroXCincoxSix"
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString, "X", , vbBinaryCompare)
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'iterar a través del array
For N = 0 To UBound(MyArray)
'Coloque cada división en la primera columna de la hoja de cálculo
Range("A" & N + 1).Value = MyArray(N)
Next N
End Sub
En este ejemplo, la cadena a dividir utiliza el carácter ‘X’ como delimitador. Sin embargo, en esta cadena hay una mezcla de caracteres ‘X’ en mayúsculas y minúsculas. El parámetro Compare de la función Split utiliza un carácter ‘X’ en mayúsculas.
Si el parámetro Comparar se establece como vbBinaryCompare, entonces los caracteres ‘x’ en minúscula serán ignorados y su hoja de trabajo se verá así:
Si el parámetro de comparación se establece como vbTextCompare, los caracteres «x» en minúscula se utilizarán en la división y la hoja de trabajo tendrá este aspecto:
Observe que el valor de la celda A6 está truncado porque contiene un carácter ‘x’ en minúscula. Como la división no distingue entre mayúsculas y minúsculas, cualquier delimitador que forme parte de una subcadena provocará una división.
Este es un punto importante a tener en cuenta cuando se utiliza un delimitador de texto y vbTextCompare. Puede terminar fácilmente con un resultado erróneo.
Uso de caracteres no imprimibles como carácter delimitador
Puede utilizar caracteres no imprimibles como delimitador, como un retorno de carro (un salto de línea).
Aquí usamos el vbCr para especificar un retorno de carro.
Sub Split_Caracteres_No_Imprimibles()
'Crear variables
Dim MyArray() As String, MyString As String, I As Variant, N As Integer
'Ejemplo de cadena con delimitadores de retorno de carro
MyString = "Uno" & vbCr & "Dos" & vbCr & "Tres" & vbCr & "Cuatro" & vbCr & "Cinco" & vbCr & "Seis"
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString, vbCr, , vbTextCompare)
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'Iterar a través del array
For N = 0 To UBound(MyArray)
'Coloque cada división en la primera columna de la hoja de cálculo
Range("A" & N + 1).Value = MyArray(N)
Next N
End Sub
En este ejemplo, se construye una cadena utilizando vbCr (carácter de retorno de carro) como delimitador.
Cuando se ejecute este código, la hoja de cálculo tendrá el siguiente aspecto:
Uso de la función Join para invertir una división
La función Join volverá a unir todos los elementos de un array, pero utilizando un delimitador especificado. Si no se especifica ningún carácter delimitador, se utilizará un espacio.
Sub Ejemplo_Funcion_Join()
'Crear variables
Dim MyArray() As String, MyString As String, I As Variant, N As Integer
Dim Target As String
'Ejemplo de cadena con delimitadores de comas
MyString = "Uno,Dos,Tres,Cuatro,Cinco,Seis"
'Coloca MyString en la celda A1
Range("A1").Value = MyString
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString, ",")
'Utilice la función Join para recrear la cadena original utilizando un delimitador de punto y coma
Target = Join(MyArray, ";")
'Coloca la cadena de resultados en la celda A2
Range("A2").Value = Target
End Sub
Este código divide una cadena con delimitadores de comas en un array, y la vuelve a unir utilizando delimitadores de punto y coma.
Después de ejecutar este código su hoja de cálculo tendrá el siguiente aspecto:
La celda A1 tiene la cadena original con delimitadores de coma, y la celda A2 tiene la nueva cadena unida con delimitadores de punto y coma.
Uso de la función de división para hacer un recuento de palabras
Teniendo en cuenta que una variable de cadena en Excel VBA puede tener hasta 2Gb de longitud, puedes utilizar la función de división para hacer el recuento de palabras en un trozo de texto. Obviamente, Microsoft Word lo hace automáticamente, pero esto podría ser útil para un simple archivo de texto o un texto copiado desde otra aplicación.
Sub Ejemplo_Numero_De_Palabras()
'Crear variables
Dim MyArray() As String, MyString As String
'Ejemplo de cadena con delimitadores de espacio
MyString = "Uno Dos Tres Cuatro Cinco Seis"
'Eliminar los espacios dobles
MyString = Replace(MyString, " ", " ")
'Elimine los espacios iniciales o finales
MyString = Trim(MyString)
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString)
'Mostrar el número de palabras utilizando la función UBound
MsgBox "Número de Palabras " & UBound(MyArray) + 1
End Sub
Uno de los peligros de este código de conteo de palabras es que será lanzado por los espacios dobles y los espacios iniciales y finales. Si estos están presentes, serán contados como palabras extra, y el conteo de palabras terminará siendo inexacto.
El código utiliza las funciones Replace y Trim para eliminar estos espacios extra.
La última línea de código muestra el número de palabras encontradas utilizando la función UBound para obtener el número máximo de elementos del array y luego incrementándolo en 1. Esto es porque el primer elemento del array comienza en cero.
Cómo dividir una dirección en Celdas de la Hoja de Cálculo
Las direcciones suelen ser largas cadenas de texto con delimitadores de comas. Es muy posible que quiera dividir cada parte de la dirección en una celda separada.
Sub Ejemplo_Dividir_Direccion()
'Crear variables
Dim MyArray() As String, MyString As String, N As Integer
'Configurar la cadena con la dirección de Microsoft Corporation
MyString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA"
'Utilice la función de división para dividir la cadena utilizando un delimitador de comas
MyArray = Split(MyString, ",")
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'iterar a través del array
For N = 0 To UBound(MyArray)
'Coloque cada división en la primera columna de la hoja de cálculo
Range("A" & N + 1).Value = MyArray(N)
Next N
End Sub
La ejecución de este código utilizará el delimitador de comas para poner cada línea de la dirección en una celda separada:
Si sólo quisiera devolver el código postal (último elemento del array), entonces podría utilizar el código
Sub Dividir_Codigo_Postal()
'Crear variables
Dim MyArray() As String, MyString As String, N As Integer, Temp As String
'Configurar la cadena con la dirección de Microsoft Corporation
MyString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA"
'Utilice la función de división para dividir la cadena utilizando un delimitador de comas
MyArray = Split(MyString, ",")
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'Ponga el código postal en la celda A1
Range("A1").Value = MyArray(UBound(MyArray))
End Sub
Esto sólo utilizará el último elemento del array, que se encuentra utilizando la función UBound.
Por otro lado, puede desear ver todas las líneas en una celda para poder imprimirlas en una etiqueta de dirección:
Sub Ejemplo_Direccion()
'Crear variables
Dim MyArray() As String, MyString As String, N As Integer, Temp As String
'Configurar la cadena con la dirección de Microsoft Corporation
MyString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 USA"
'Utilice la función de división para dividir la cadena utilizando un delimitador de comas
MyArray = Split(MyString, ",")
'Borrar la hoja de trabajo
ActiveSheet.UsedRange.Clear
'iterar a través del array
For N = 0 To UBound(MyArray)
'colocar cada elemento del array más un carácter de avance de línea en una cadena
Temp = Temp & MyArray(N) & vbLf
Next N
'Poner la cadena en la hoja de trabajo
Range("A1") = Temp
End Sub
Este ejemplo funciona igual que el anterior, excepto que crea una cadena temporal con todos los elementos del array, pero insertando un carácter de avance de línea después de cada elemento. La hoja de trabajo tendrá este aspecto después de ejecutar el código:
Cómo Dividir una Cadena en Celdas de una Hoja de Cálculo
Puedes copiar el array Split en las celdas de la hoja de trabajo con un solo comando:
Sub CopiarARango()
'Crear variables
Dim MyArray() As String, MyString As String
'Ejemplo de cadena con delimitadores de coma
MyString = "Uno,Dos,Tres,Cuatro,Cinco,Seis"
'Utilice la función Split para dividir las partes que componen la cadena
MyArray = Split(MyString, ",")
'Copiar el Array en la hoja de cálculo
Range("A1:A" & UBound(MyArray) + 1).Value = WorksheetFunction.Transpose(MyArray)
End Sub
Cuando este código se haya ejecutado, tu hoja de trabajo tendrá el siguiente aspecto:
Creación de una nueva función para permitir la división desde un punto dado
El parámetro Límite de la función Dividir sólo le permite especificar un límite superior donde quiere que se detenga la división. Siempre comienza desde el principio de la cadena.
Sería muy útil tener una función similar en la que se pudiera especificar el punto de inicio de la división dentro de la cadena, y el número de divisiones que se desea ver a partir de ese punto. Además, sólo extraerá las divisiones que hayas especificado en el array, en lugar de tener un valor de cadena enorme como último elemento del array.
Puedes construir fácilmente una función (llamada SplitSlicer) en VBA para hacer esto:
Function SplitSlicer(Target As String, Del As String, Start As Integer, N As Integer)
'Crear array variable
Dim MyArray() As String
'Capturar la división mediante la variable de inicio utilizando el carácter delimitador
MyArray = Split(Target, Del, Start)
'Compruebe si el parámetro de inicio es mayor que el número de divisiones - esto puede causar problemas
If Start > UBound(MyArray) + 1 Then
'Mostrar error y salir de la función
MsgBox "El parámetro de inicio es mayor que el número de divisiones disponibles"
SplitSlicer = MyArray
Exit Function
End If
'Poner el último elemento del array en la cadena
Target = MyArray(UBound(MyArray))
'Dividir la cadena usando N como límite
MyArray = Split(Target, Del, N)
'Comprueba que el límite superior es mayor que cero ya que el código elimina el último elemento
If UBound(MyArray) > 0 Then
'Utilice ReDim para eliminar el último elemento del Array
ReDim Preserve MyArray(UBound(MyArray) - 1)
End If
'Devolver el nuevo array
SplitSlicer = MyArray
End Function
Esta función se construye con cuatro parámetros:
- Target – cadena – es la cadena de entrada que desea dividir
- Del – cadena o carácter no imprimible – este es el carácter delimitador que se utiliza, por ejemplo, coma, dos puntos
- Start – número – es el inicio de la división para su corte
- N – número – es el número de divisiones que quiere hacer dentro de su segmento
Ninguno de estos parámetros es opcional o tiene valores por defecto, pero puede incluirlo en el código de la función si desea ampliarlo.
La función utiliza la función Split para crear un array utilizando el parámetro Start como límite. Esto significa que los elementos del array contendrán las divisiones hasta el parámetro de inicio, pero el resto de la cadena será el último elemento, y no se dividirá.
El último elemento del array se transfiere de nuevo a una cadena utilizando la función UBound para determinar de qué elemento se trata.
La cadena se divide entonces de nuevo en el array, utilizando N como variable límite. Esto significa que las divisiones se harán para la cadena hasta la posición N, después de la cual el resto de la cadena formará el último elemento del array.
La sentencia ReDim se utiliza para eliminar el último elemento, ya que sólo queremos que queden los elementos específicos en el array. Tenga en cuenta que se utiliza el parámetro Preserve, de lo contrario se perderán todos los datos del array.
El nuevo array se devuelve al código desde el que fue llamado.
Tenga en cuenta que el código está «a prueba de errores». Los usuarios a menudo harán cosas extrañas que usted no consideró. Por ejemplo, si intentan usar la función con el parámetro Inicio o N mayor que el número disponible de divisiones en la cadena, es probable que esto haga que la función falle.
Se incluye código para comprobar el valor de Inicio, y también para asegurarse de que hay un elemento que puede ser eliminado cuando se utiliza la sentencia ReDim en el array.
Aquí está el código para probar la función:
Sub PruebaSplitSlicer()
'Crear variables
Dim MyArray() As String, MyString As String
'Definir cadena de ejemplo con delimitadores de comas
MyString = "Uno,Dos,Tres,Cuatro,Cinco,Seis,Siete,Ocho,Nueve,Diez"
'Utilice la función SplitSlicer para definir un nuevo Array
MyArray = SplitSlicer(MyString, ",", 4, 3)
'Borrar la hoja activa
ActiveSheet.UsedRange.Clear
'Copiar el Array en la hoja de cálculo
Range("A1:A" & UBound(MyArray) + 1).Value = WorksheetFunction.Transpose(MyArray)
End Sub
Ejecute este código y su hoja de trabajo tendrá el siguiente aspecto: