🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Split dans Excel — Découper une chaîne en tableau, correctement

|

VBA Split dans Excel — Découper une chaîne en tableau, correctement

Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 09/06/2026

En brefSplit 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 Base en tête de module, le tableau que renvoie Split commence à l'indice 0. Le premier champ est parts(0). Le dernier est parts(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

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.