Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 09/06/2026
En bref — Split prend une chaîne, la coupe à chaque occurrence d'un délimiteur et vous rend les morceaux sous forme de tableau indexé à partir de 0. C'est l'exact inverse de l'assemblage de chaînes :
Sub SplitDemo()
Dim parts() As String
parts = Split("Jones,Sarah,Finance", ",") ' couper à chaque virgule
Debug.Print parts(0) ' Jones <- le premier morceau est l'indice 0, pas 1
Debug.Print parts(2) ' Finance
Debug.Print UBound(parts) ' 2 <- dernier indice : 3 éléments = 0,1,2
End Sub
La signature complète, avec les deux arguments que presque personne n'utilise :
Split(expression, [delimiter], [limit], [compare])
' la chaîne défaut " " max. morceaux vbTextCompare = ignore la casse
Le modèle mental : Split est l'inverse de la concaténation
Si "a" & "," & "b" colle des morceaux en une seule chaîne, Split est l'outil qui les redécolle. Vous lui passez une chaîne qui porte déjà une structure — une ligne CSV, un chemin de fichier, un Nom,Prénom, une ligne de log séparée par des barres verticales — et il vous rend les champs sous forme de tableau parcourable.
Ce cadrage compte, car il indique quand employer Split plutôt que ses voisines : utilisez Split lorsqu'un seul caractère délimiteur marque chaque frontière. S'il vous faut plutôt un morceau à une position fixe (caractères 3 à 5), c'est l'affaire de Mid/Left/Right. S'il faut trouver où se situe un repère avant de couper, c'est InStr. Split, c'est pour « cette chaîne est une liste, donne-moi la liste ».
La règle d'or : le tableau est toujours indexé à partir de 0 — même avec Option Base 1
Voici la règle qui sépare le code qui marche d'un bug silencieux :
Quel que soit l'
Option Baseen tête de module, le tableau que renvoieSplitcommence à l'indice 0. Le premier champ estparts(0). Le dernier estparts(UBound(parts)).
Voici le bug qui coûte une après-midi. On connaît les tableaux et on écrit une boucle qui part de 1 :
' ⚠ FAUX — laisse tomber silencieusement le premier champ
For i = 1 To UBound(parts)
Debug.Print parts(i)
Next i
Cette boucle s'exécute sans erreur. Elle ne touche simplement jamais parts(0) — donc « Jones » disparaît, et personne ne le remarque jusqu'à ce qu'un rapport sorte sans le prénom de chaque enregistrement. Le correctif : toujours itérer à partir de 0 :
For i = 0 To UBound(parts) ' 0 To UBound — couvre chaque morceau
Debug.Print parts(i)
Next i
UBound renvoie le dernier indice, pas le nombre d'éléments. Trois éléments donnent UBound = 2. S'il vous faut le décompte, c'est UBound(parts) + 1. Gravez-le : Split est indexé à 0, UBound est l'indice le plus haut, les boucles vont de 0 To UBound.
Le deuxième piège : Split est littéral, pas malin
Split compare le délimiteur exactement tel qu'il est écrit — il ne rogne pas, ne comprend pas les guillemets, n'est pas une expression régulière. Deux conséquences mordent en permanence.
Il garde les espaces. Découper "a, b, c" sur une virgule donne "a", " b", " c" — les morceaux après le premier portent un espace initial. Si vous les comparez à "b", ça ne correspond pas. Rognez chaque morceau, ou découpez sur ", " en acceptant qu'un seul format différent casse tout :
parts = Split("a, b, c", ",")
For i = 0 To UBound(parts)
parts(i) = Trim(parts(i)) ' nettoyer chaque champ — voir vba-mid / Trim
Next i
L'absence de correspondance n'est pas une erreur. Découper une chaîne qui ne contient pas le délimiteur renvoie un tableau à un seul élément — l'indice 0 contient toute la chaîne d'origine. Protégez-vous donc toujours avant de supposer plusieurs champs :
parts = Split(userInput, ",")
If UBound(parts) < 1 Then
MsgBox "Une valeur séparée par des virgules est attendue."
Exit Sub
End If
Et le tranchant : Split("") sur une chaîne vide renvoie un tableau dont UBound vaut −1. Une boucle 0 To UBound ne fait rien sans risque, mais accéder à parts(0) plante avec « L'indice n'appartient pas à la sélection ». Vérifiez l'entrée, ou UBound(parts) >= 0, avant d'indexer.
Deux arguments qui valent le coup : limit et compare
limit plafonne le nombre de morceaux obtenus — le dernier élément garde tout le reste, non découpé. Parfait pour « détacher la clé, laisser la valeur tranquille » :
parts = Split("error: file not found: budget.xlsx", ":", 2)
' parts(0) = "error"
' parts(1) = " file not found: budget.xlsx" <- le reste intact, deux-points compris
compare:=vbTextCompare rend un délimiteur alphabétique insensible à la casse — découper "1xRED2Xblue" sur "x" ne trouve les deux x que si vous demandez une comparaison de texte. De niche, mais c'est la réponse quand un découpage sur une lettre rate la moitié de ses frontières.
L'avis : Split n'est pas un parseur CSV — arrêtez d'y greffer des regex
Dès que quelqu'un a un fichier CSV, le réflexe est Split(line, ","). Ça marche — jusqu'au jour où un champ contient une virgule entre guillemets — "Smith, Jr.",Sales — et Split coupe joyeusement « Smith » et « Jr. » en deux champs, décalant chaque colonne suivante. Les données sont désormais fausses, en silence.
Ma règle : Split, c'est pour des données délimitées que vous maîtrisez, pas pour parser le format CSV. Des logs internes séparés par des barres, une cellule Nom,Prénom que vous avez construite, un chemin découpé sur \ — parfait. Mais dès que la source est un vrai export CSV du système de quelqu'un d'autre, Split est le mauvais outil, et la réponse n'est pas un rustine regex de 40 lignes par-dessus Split. C'est un vrai parseur (Power Query, une routine CSV sérieuse ou une bibliothèque) qui comprend les guillemets. Savoir où Split s'arrête, c'est la différence entre un import robuste et un bug de décalage de colonnes que vous découvrez en production.
Quand utiliser quoi
| Vous avez… | Utilisez | Pourquoi |
|---|---|---|
| Une chaîne, un délimiteur d'un caractère propre à chaque frontière | Split |
Renvoie les champs en tableau |
| Un morceau à position fixe (caractères 1 à 3) | Left / Mid / Right | Coupe par position, sans délimiteur |
| Trouver d'abord où est un repère | InStr | Renvoie la position où couper |
| Un vrai CSV avec champs entre guillemets | Power Query / parseur CSV | Split ne respecte pas les guillemets |
| Recoller un tableau en une chaîne | Join(arr, ",") |
L'inverse exact de Split |
Erreurs fréquentes avec Split (et la solution)
| Symptôme | Cause | Solution |
|---|---|---|
| Le premier champ manque dans les résultats | Boucle démarrée à 1, pas à 0 |
For i = 0 To UBound(parts) |
« L'indice n'appartient pas à la sélection » sur parts(0) |
Entrée vide → UBound = −1 |
Protéger d'abord avec If UBound(parts) >= 0 |
| Les champs ont des espaces initiaux | Découpé sur "," et non ", ", sans Trim |
Trim() chaque morceau après le découpage |
Toute la chaîne dans parts(0), plusieurs attendus |
Le délimiteur n'apparaissait pas dans l'entrée | Protéger avec If UBound(parts) < 1 |
| Colonnes CSV décalées d'une unité | Un champ contenait une virgule entre guillemets | Utiliser un vrai parseur CSV, pas Split |
Type mismatch à l'affectation du résultat |
Cible déclarée As String, pas un tableau |
Déclarer Dim parts() As String |
Quand la gymnastique de chaînes l'emporte sur le but — décrivez la tâche
Découper est rarement le but. Le but, c'est « importer cet export brouillon, nettoyer les noms, les rapprocher de ma liste de référence ». Le temps d'armer le split, de rogner chaque champ, de protéger le cas vide et de gérer la ligne qui a cassé le format, la plomberie de parsing écrase la seule chose que vous vouliez vraiment. ExcelMaster Agent vous laisse énoncer ce but en langage courant — « découpe la colonne Nom en Prénom et Nom, rogne-les, signale les lignes qui ne collent pas » — et génère du Python qui gère les cas limites et sauvegarde d'abord votre fichier. Essayez gratuitement →
Guides associés
- VBA Mid, Left & Right — Extraire une sous-chaîne par position
- VBA Replace — Remplacer du texte & les pièges de ses arguments
- VBA InStr — Trouver du texte dans une chaîne
- Boucle For en VBA — 8 exemples concrets
FAQ
Que fait Split en VBA ?
Split divise une chaîne en un tableau de sous-chaînes, en coupant à chaque occurrence d'un délimiteur (un espace par défaut). Split("a,b,c", ",") renvoie un tableau de trois éléments : "a", "b", "c". Le tableau est indexé à partir de 0, donc le premier élément est l'indice 0.
Pourquoi le premier élément manque-t-il dans mon tableau Split ?
Presque toujours parce que votre boucle démarre à 1. Split renvoie un tableau indexé à 0 quel que soit Option Base 1, donc le premier champ est l'indice 0. Itérez For i = 0 To UBound(arr) pour l'inclure.
Comment obtenir le nombre d'éléments depuis Split ?
Utilisez UBound(arr) + 1. UBound renvoie l'indice le plus haut, pas le décompte — trois éléments donnent UBound = 2. Pour une chaîne d'entrée vide, UBound vaut −1 ; protégez-vous donc avant d'indexer l'élément 0.
VBA Split peut-il utiliser plusieurs délimiteurs ?
Pas directement — Split prend un seul délimiteur. L'astuce courante : Replace d'abord les autres délimiteurs par votre délimiteur principal, puis faire un seul Split. Pour plus complexe, utilisez une regex ou un parseur plutôt que d'enchaîner les remplacements.
VBA Split est-il sensible à la casse ?
Cela ne compte que si votre délimiteur est une lettre. Par défaut, Split compare le délimiteur exactement (binaire). Passez compare:=vbTextCompare en quatrième argument pour comparer un délimiteur alphabétique sans tenir compte de la casse.
