VBA – Función Split – Dividir una Cadena de Texto en un Array

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

Dennis Madrid

Last updated on abril 5, 2022

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:

Funcion split

 

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:

Funcion split limit

 

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í:

Funcion split comparacion binaria

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:

Funcion split comparacion texto

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:

Funcion split retorno de carro

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:

Funcion join

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:

Dividir direccion

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:

Direccion en una celda

 

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:

Copiar rango

 

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:

SplitSlicer

vba-free-addin

Complemento de Ejemplos de Código de VBA

Acceda fácilmente a todos los ejemplos de código que se encuentran en nuestro sitio.

Simplemente navegue al menú, haga clic y el código se insertará directamente en su módulo. Complemento .xlam.

(¡No se requiere instalación!)

Descarga gratuita

Return to VBA Code Examples