Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · verificado por última vez el 09-06-2026
En resumen — Split toma una cadena, la corta en cada aparición de un delimitador y te devuelve los trozos como un array de base cero. Es exactamente la operación inversa a unir cadenas:
Sub SplitDemo()
Dim parts() As String
parts = Split("Jones,Sarah,Finance", ",") ' cortar en cada coma
Debug.Print parts(0) ' Jones <- el primer trozo es el índice 0, no 1
Debug.Print parts(2) ' Finance
Debug.Print UBound(parts) ' 2 <- último índice: 3 elementos = 0,1,2
End Sub
La firma completa, con los dos argumentos que casi nadie usa:
Split(expression, [delimiter], [limit], [compare])
' la cadena por defecto " " máx. trozos vbTextCompare = ignora mayúsculas
El modelo mental: Split es lo contrario de concatenar
Si "a" & "," & "b" pega trozos en una sola cadena, Split es la herramienta que los vuelve a separar. Le pasas una cadena que ya trae estructura incorporada — una línea CSV, una ruta de archivo, un Apellido,Nombre, una línea de log separada por barras verticales — y te devuelve los campos como un array que puedes recorrer.
Ese enfoque importa porque te dice cuándo usar Split frente a sus vecinas: usa Split cuando un único carácter delimitador marca todas las fronteras. Si en cambio necesitas un trozo por su posición (caracteres 3–5), eso es trabajo de Mid/Left/Right. Si necesitas encontrar dónde está una marca antes de cortar, eso es InStr. Split es para "esta cadena es una lista, dame la lista".
La regla de oro: el array es siempre de base cero — incluso con Option Base 1
Esta es la regla que separa el código que funciona de un bug silencioso:
No importa qué
Option Basepongas arriba del módulo: el array que devuelveSplitempieza en el índice 0. El primer campo esparts(0). El último esparts(UBound(parts)).
Aquí el bug que le cuesta una tarde a la gente. Conocen los arrays y escriben un bucle que empieza en 1:
' ⚠ MAL — descarta en silencio el primer campo
For i = 1 To UBound(parts)
Debug.Print parts(i)
Next i
Ese bucle corre sin error. Solo que nunca toca parts(0) — así que "Jones" desaparece y nadie lo nota hasta que un informe sale sin el nombre de cada registro. La solución es iterar siempre desde 0:
For i = 0 To UBound(parts) ' 0 To UBound — cubre todos los trozos
Debug.Print parts(i)
Next i
UBound devuelve el último índice, no la cantidad. Tres elementos significan UBound = 2. Si necesitas la cantidad, es UBound(parts) + 1. Grábatelo: Split es de base cero, UBound es el índice más alto, los bucles van de 0 To UBound.
La segunda trampa: Split es literal, no listo
Split compara el delimitador exactamente como lo escribiste — no recorta, no entiende comillas, no es una expresión regular. Dos consecuencias muerden constantemente.
Conserva los espacios. Dividir "a, b, c" por una coma te da "a", " b", " c" — los trozos a partir del primero llevan un espacio inicial. Si los comparas con "b" no coinciden. Recorta cada trozo, o divide por ", " y acepta que un solo formato distinto lo rompe:
parts = Split("a, b, c", ",")
For i = 0 To UBound(parts)
parts(i) = Trim(parts(i)) ' limpiar cada campo — ver vba-mid / Trim
Next i
Que no haya coincidencia no es un error. Dividir una cadena que no contiene el delimitador devuelve un array de un solo elemento — el índice 0 contiene la cadena original entera. Así que protégete siempre antes de suponer que obtuviste varios campos:
parts = Split(userInput, ",")
If UBound(parts) < 1 Then
MsgBox "Se esperaba un valor separado por comas."
Exit Sub
End If
Y el filo afilado: Split("") sobre una cadena vacía devuelve un array cuyo UBound es −1. Un bucle 0 To UBound no hace nada sin riesgo, pero acceder a parts(0) revienta con "subíndice fuera del intervalo". Comprueba la entrada, o UBound(parts) >= 0, antes de indexar.
Dos argumentos que vale la pena conocer: limit y compare
limit limita cuántos trozos obtienes — el último elemento se queda con todo lo que sobra, sin dividir. Perfecto para "separa la clave, deja el valor en paz":
parts = Split("error: file not found: budget.xlsx", ":", 2)
' parts(0) = "error"
' parts(1) = " file not found: budget.xlsx" <- el resto intacto, con dos puntos y todo
compare:=vbTextCompare hace que un delimitador alfabético ignore mayúsculas — dividir "1xRED2Xblue" por "x" encuentra ambas x solo si pides comparación de texto. De nicho, pero es la respuesta cuando una división por una letra se salta la mitad de sus fronteras.
La opinión: Split no es un parser de CSV — deja de pegarle expresiones regulares
En cuanto alguien tiene un archivo CSV, el instinto es Split(line, ","). Funciona hasta el día en que un campo contiene una coma entre comillas — "Smith, Jr.",Sales — y Split parte alegremente "Smith" y " Jr." en dos campos, desplazando cada columna posterior. Los datos ahora están mal en silencio.
Mi regla: Split es para datos delimitados que tú controlas, no para parsear el formato CSV. Logs internos separados por barras, una celda Apellido,Nombre que construiste tú, una ruta que divides por \ — perfecto. Pero en cuanto la fuente es un CSV exportado de verdad desde el sistema de otra persona, Split es la herramienta equivocada, y la respuesta no es un parche de 40 líneas de expresiones regulares encima de Split. Es un parser de verdad (Power Query, una rutina CSV seria o una librería) que entiende el entrecomillado. Saber dónde se detiene Split es la diferencia entre una importación robusta y un bug de columnas desplazadas que descubres en producción.
Cuándo usar cuál
| Tienes… | Usa | Por qué |
|---|---|---|
| Una cadena, un delimitador limpio de un carácter en cada frontera | Split |
Devuelve los campos como array |
| Un trozo en posición fija (caracteres 1–3) | Left / Mid / Right | Corta por posición, sin delimitador |
| Encontrar primero dónde está una marca | InStr | Devuelve la posición donde cortar |
| Un CSV real con campos entre comillas | Power Query / parser CSV | Split no respeta las comillas |
| Reunir un array de vuelta en una cadena | Join(arr, ",") |
El inverso exacto de Split |
Errores comunes con Split (y su solución)
| Síntoma | Causa | Solución |
|---|---|---|
| Falta el primer campo en los resultados | Bucle empezado en 1, no en 0 |
For i = 0 To UBound(parts) |
"Subíndice fuera del intervalo" en parts(0) |
La entrada estaba vacía → UBound = −1 |
Protege antes con If UBound(parts) >= 0 |
| Los campos tienen espacios iniciales | Dividiste por "," y no ", ", sin Trim |
Trim() cada trozo tras dividir |
Cadena entera en parts(0), esperabas varios |
El delimitador nunca apareció en la entrada | Protege con If UBound(parts) < 1 |
| Columnas del CSV desplazadas en uno | Un campo contenía una coma entre comillas | Usa un parser CSV real, no Split |
Type mismatch al asignar el resultado |
Destino declarado As String, no array |
Declara Dim parts() As String |
Cuando el malabarismo de cadenas supera el objetivo — describe la tarea
Dividir rara vez es la meta. La meta es "importar esta exportación caótica, limpiar los nombres, cruzarlos con mi lista maestra". Para cuando armaste el split, recortaste cada campo, protegiste el caso vacío y manejaste la fila que rompió el formato, la fontanería de parseo eclipsa lo único que de verdad querías. ExcelMaster Agent te deja enunciar esa meta en lenguaje normal — "divide la columna Nombre en Nombre y Apellido, recórtalos, marca las filas que no encajen" — y genera Python que maneja los casos límite y respalda tu archivo primero. Pruébalo gratis →
Guías relacionadas
- VBA Mid, Left y Right — Extraer una subcadena por posición
- VBA Replace — Sustituir texto y las trampas de sus argumentos
- VBA InStr — Encontrar texto dentro de una cadena
- Bucle For en VBA — 8 ejemplos del mundo real
Preguntas frecuentes
¿Qué hace Split en VBA?
Split divide una cadena en un array de subcadenas, cortando en cada aparición de un delimitador (un espacio por defecto). Split("a,b,c", ",") devuelve un array de tres elementos: "a", "b", "c". El array es de base cero, así que el primer elemento es el índice 0.
¿Por qué a mi array de Split le falta el primer elemento?
Casi siempre porque tu bucle empieza en 1. Split devuelve un array de base cero sin importar Option Base 1, así que el primer campo es el índice 0. Itera For i = 0 To UBound(arr) para incluirlo.
¿Cómo obtengo el número de elementos de Split?
Usa UBound(arr) + 1. UBound devuelve el índice más alto, no la cantidad — tres elementos tienen UBound = 2. Con una cadena de entrada vacía, UBound es −1, así que protégete antes de indexar el elemento 0.
¿Puede VBA Split usar varios delimitadores?
No directamente — Split toma un delimitador. El truco habitual es Replace los otros delimitadores por tu delimitador principal primero, y luego hacer un solo Split. Para algo más complejo, usa una expresión regular o un parser en vez de encadenar reemplazos.
¿Split distingue mayúsculas y minúsculas en VBA?
Solo importa cuando tu delimitador es una letra. Por defecto Split compara el delimitador de forma exacta (binaria). Pasa compare:=vbTextCompare como cuarto argumento para comparar un delimitador alfabético sin distinguir mayúsculas.
