TL;DR —
Application.Transposeéchange les lignes et les colonnes d'un tableau, comme la fonction de feuille TRANSPOSE. Son effet secondaire le plus utile en VBA, c'est l'aplatissement : transposez une plage à une seule colonne et Excel supprime la dimension superflue, vous rendant un tableau 1D — exactement ce que Join et Filter exigent. Deux limites strictes : c'estApplication.Transpose(une fonction de feuille), jamais unTransposenu, et il plafonne silencieusement à 65 536 éléments, donc c'est une commodité de remodelage, pas un moteur pour gros volumes.
Sub TransposeDemo()
Dim col As Variant, flat As Variant
col = Range("A1:A5").Value ' tableau 2D : 5 lignes x 1 colonne
Debug.Print UBound(col, 1) ' 5 <- premiere dimension
Debug.Print UBound(col, 2) ' 1 <- deuxieme dimension (l'unitaire)
flat = Application.Transpose(col) ' effondre la colonne -> tableau 1D
Debug.Print UBound(flat) ' 5 <- une seule dimension, prete pour Join
Debug.Print Join(flat, ", ") ' toute la colonne en une chaine, sans boucle
End Sub
Ce que vous allez apprendre
- Le modèle mental — Transpose remodèle, et son usage phare est d'aplatir une colonne en 1D
- Pourquoi c'est
Application.Transpose, pas unTransposenu que vous pouvez appeler directement - Aplatir une colonne vs une ligne (et la double transposition pour une ligne unique)
- Le plafond silencieux de 65 536 éléments qui corrompt les gros volumes
- Les autres échecs discrets : les chaînes de plus de 255 caractères et les tableaux contenant des erreurs
Le modèle mental : remodeler — et le super-pouvoir d'aplatissement
À première vue, Application.Transpose fait une seule chose : il inverse lignes et colonnes, de sorte
qu'un bloc 3 x 2 devienne 2 x 3, exactement comme un collage avec Transpose ou la fonction de feuille
=TRANSPOSE(). C'est parfois ce que vous voulez — transformer une ligne d'en-tête horizontale en liste
verticale, par exemple.
Mais sa vraie valeur au quotidien en VBA est un effet secondaire de cette inversion. Quand vous lisez une
plage à une seule colonne, Range("A1:A10").Value revient sous forme de tableau bidimensionnel
10 x 1 — agaçant, car les outils que vous voulez utiliser ensuite (Join,
Filter) n'acceptent qu'un tableau 1D. Transposez un tableau 10 x 1 et Excel
effondre la dimension de largeur 1, vous rendant un tableau 1D propre. Ce seul geste — des cellules au
tableau 1D — est la raison pour laquelle Transpose appartient à la même boîte à outils que Join et
Filter :
Dim names As Variant
names = Application.Transpose(Range("A2:A100").Value) ' colonne -> tableau 1D
names = Filter(names, "Ltd") ' maintenant Filter l'accepte
C'est Application.Transpose, pas un Transpose nu
Transpose est une fonction de feuille, pas un mot-clé du langage VBA, donc vous ne pouvez pas
l'appeler seul — x = Transpose(arr) est une erreur de compilation, « Sub ou fonction non définie ».
Vous devez l'atteindre via l'objet Application (ou, de façon équivalente,
Application.WorksheetFunction) :
flat = Application.Transpose(arr) ' la forme habituelle
flat = Application.WorksheetFunction.Transpose(arr) ' resultat identique ici
Les deux formes ne diffèrent que par la manière dont elles signalent l'échec :
WorksheetFunction.Transpose déclenche une erreur d'exécution rattrapable quand l'entrée est mauvaise,
tandis que le simple Application.Transpose tend à renvoyer une valeur d'erreur à l'intérieur du
résultat. Pour remodeler des tableaux, Application.Transpose est le choix conventionnel — souvenez-vous
simplement que le préfixe Application. est obligatoire.
Aplatir une colonne vs une ligne
Une seule colonne s'aplatit avec une transposition, parce que le résultat de la transposition de
n x 1 est un vrai tableau 1D. Une seule ligne (1 x n) est le problème inverse — lire
Range("A1:E1").Value donne aussi un tableau 2D, et une transposition la change en colonne n x 1,
toujours 2D. Pour obtenir un tableau 1D à partir d'une ligne, transposez deux fois :
Dim rowVals As Variant
rowVals = Application.Transpose(Application.Transpose(Range("A1:E1").Value)) ' ligne -> 1D
Ça paraît étrange, mais c'est l'idiome standard : la première transposition en fait une colonne, la seconde effondre cette colonne en 1D. Gravez l'asymétrie — une colonne demande une transposition, une ligne en demande deux.
Le piège qui frappe en production : le plafond de 65 536 éléments
Application.Transpose porte une limite héritée de l'ancienne grille de feuille : il ne peut pas gérer
plus de 65 536 éléments dans une dimension. Transposez une colonne de 100 000 lignes et il ne vous
prévient pas — sur les anciennes versions il tronque à 65 536 ; sur les actuelles il déclenche une erreur
d'exécution. Dans les deux cas, c'est une mine silencieuse, car votre code fonctionne parfaitement à
chaque test sur quelques centaines de lignes, puis échoue le jour où quelqu'un le lance sur un export
complet :
' ATTENTION - marche sur petites donnees, casse au-dela de 65536 lignes
flat = Application.Transpose(Range("A2:A200000").Value) ' tronque ou erreur
Quand les données peuvent être volumineuses, ne vous appuyez pas sur Transpose. Bouclez le tableau 2D dans un tableau 1D que vous dimensionnez vous-même — une douzaine de lignes sans aucun plafond — et réservez Transpose au remodelage à taille humaine pour lequel il est bon :
Dim src As Variant, flat() As String, i As Long
src = Range("A2:A200000").Value
ReDim flat(1 To UBound(src, 1))
For i = 1 To UBound(src, 1)
flat(i) = CStr(src(i, 1))
Next i
Les autres échecs discrets : chaînes longues et valeurs d'erreur
Deux autres tranchants attrapent les gens. D'abord, Application.Transpose ne supporte pas un élément
texte de plus de 255 caractères — il le tronque ou déclenche un type mismatch, selon la version. Si
vos cellules contiennent de longues notes, transpose n'est pas sûr ; bouclez plutôt. Ensuite, si le
tableau source contient une valeur d'erreur de cellule (#N/A, #REF!), Transpose la propage ou s'y
étrangle, et l'échec surgit loin de la cause. Nettoyez ou prémunissez les valeurs d'erreur avant de
remodeler. Ce ne sont pas des recoins obscurs — un #N/A égaré dans une colonne de données est
exactement le genre de chose qui transforme une macro qui marche en macro intermittente.
L'avis : le remodelage est une commodité, pas un pipeline de données
Application.Transpose gagne sa place pour deux tâches honnêtes : retourner un petit bloc et — bien plus
souvent — aplatir une colonne unique en ce tableau 1D que Join et Filter réclament. Cet aplatissement est
la raison pour laquelle les trois fonctions de ce trio s'emboîtent : Transpose transforme des cellules en
tableau, Filter en extrait un sous-ensemble, Join le recolle en chaîne, le tout sans boucler.
Mais respectez le plafond. Dès que vos données peuvent dépasser ~65 000 lignes, contenir du texte long ou
porter une valeur d'erreur, Transpose cesse d'être un outil fiable et devient un bug intermittent. Là,
l'ennuyeuse boucle For vers un tableau auto-dimensionné est le choix professionnel — elle n'a pas de
limite cachée et dit exactement ce qu'elle fait. Utilisez Transpose pour remodeler des données à taille
humaine, jamais comme l'étape porteuse d'une routine sur gros volumes.
Comment ExcelMaster vous aide
Remodeler n'est jamais le but — c'est un frottement sur le chemin de « transformer cette colonne en liste séparée par des virgules » ou « pivoter ces en-têtes en table de correspondance ». Le temps d'aplatir la colonne, d'esquiver le plafond de 65 536 et de prémunir les valeurs d'erreur, la plomberie a enseveli la seule chose que vous vouliez. ExcelMaster vous laisse énoncer cette tâche en langage courant — « fais une liste séparée par des virgules des SKU actifs de la colonne B » — et génère du Python qui lit la plage à n'importe quelle taille, gère les valeurs délicates et sauvegarde votre fichier avant d'écrire — vous décrivez la sortie, et il gère la taille, le texte long et les valeurs d'erreur qui cassent le remodelage.
Foire aux questions
Que fait Application.Transpose en VBA ?
Il inverse les lignes et les colonnes d'un tableau, comme la fonction de feuille TRANSPOSE. En VBA
courant, son effet le plus utile est l'aplatissement : transposer une plage à une seule colonne effondre
la dimension superflue et renvoie un tableau unidimensionnel, ce dont Join et Filter ont besoin.
Pourquoi ne puis-je pas appeler Transpose directement en VBA ?
Parce que Transpose est une fonction de feuille, pas un mot-clé VBA. Appeler Transpose(arr) seul est
une erreur de compilation. Atteignez-la via l'objet Application : Application.Transpose(arr), ou
Application.WorksheetFunction.Transpose(arr).
Comment transformer une colonne en tableau 1D en VBA ?
Lisez la colonne et transposez-la une fois : Application.Transpose(Range("A1:A10").Value). Un tableau 2D
à colonne unique se transpose en un véritable tableau unidimensionnel. Pour une ligne unique, transposez
deux fois, car une seule transposition ne fait que changer la ligne en colonne.
Pourquoi VBA Transpose échoue-t-il sur les grandes plages ?
Application.Transpose ne peut pas gérer plus de 65 536 éléments dans une dimension — une limite héritée
de l'ancienne grille de feuille. Sur les grandes plages, il tronque sur les anciennes versions ou
déclenche une erreur d'exécution sur les actuelles. Pour de gros volumes, bouclez plutôt le tableau dans
un tableau 1D que vous dimensionnez vous-même.
VBA Transpose fonctionne-t-il avec le texte et les valeurs d'erreur ?
Pas de façon fiable. Application.Transpose gère mal les chaînes de plus de 255 caractères et propage ou
s'étrangle sur les valeurs d'erreur de cellule comme #N/A. Nettoyez ces valeurs ou utilisez une boucle
explicite quand les données peuvent contenir du texte long ou des erreurs.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 03/09/2026.
Guides associés : VBA Join · VBA Filter · VBA Split · VBA Array · VBA Range
