Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA - Transformer un tableau bidimensionnel en unidimensionnel

  • Initiateur de la discussion Initiateur de la discussion job75
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

job75

XLDnaute Barbatruc
Bonjour le forum,

En VBA la fonction Join(sourcearray[, delimiter]) est très performante.

Mais pour l'argument sourcearray il est bien précisé :

Tableau à une dimension contenant les sous-chaînes à joindre

Or une plage (colonne ou ligne) comme argument donne toujours un tableau bidimensionnel.

Dans le fichier joint, j'ai résolu le problème de 2 manières :

Code:
Function Joindre1(Plage)
If Plage.Rows.Count = 1 Then Plage = Application.Transpose(Plage)
Plage = Application.Transpose(Plage)
Joindre1 = Join(Plage, "-")
End Function

Function Joindre2(Plage)
Dim ub&, tablo(), p, n&
Plage = Plage 'crée un tableau à 2 dimensions
ub = Application.Max(UBound(Plage), UBound(Plage, 2))
ReDim tablo(ub - 1) 'tableau à une dimension
For Each p In Plage
  tablo(n) = p
  n = n + 1
Next
Joindre2 = Join(tablo, "-")
End Function
Ma préférence va bien sûr à la première solution.

Mais connaissez-vous une autre solution, plus simple ?

Merci d'avance.

Nota : c'est grâce à ce fil de Lone-wolf que je me suis posé ce problème :

https://www.excel-downloads.com/thr...nombres-avec-fonctions-personnalisees.163998/

A+
 

Pièces jointes

Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Re,

Mais si vous pourriez faire plus court, ça serait encore mieux 😱

Le client est roi :

Code:
Function JoindreMat$(Plage, Optional Separateur$)
Dim tablo(), n&
ReDim tablo(Plage.Count - 1) 'tableau à une dimension
For Each Plage In Plage.Value
  tablo(n) = Plage
  n = n + 1
Next
JoindreMat = Application.Trim(Join(tablo)) 'séparateur : espace
If Len(Separateur) Then JoindreMat = Replace(JoindreMat, " ", Separateur)
End Function
A+
 
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Voici un classeur exemple de ce que l'on peut faire avec la fonction JoindreMat$ (Post 16)
de notre ami job75.

Ici j'ai modifier le nom de la fonction par JOINDRE, suivant les fonctions excel(en MAJ).

Je viens de faire un test avec 5 colonnes et 2 lignes...No problem.


A+ 😎
 

Pièces jointes

Dernière édition:
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonjour Lone-wolf, le forum,

La fonction de mon post #16 présente 2 graves défauts :

- on ne peut pas utiliser le texte vide "" comme séparateur

- l'argument Plage doit obligatoirement être une plage de cellules, pas une matrice.

Cette fonction y remédie :

Code:
Function JOINDRE(Plage, Optional Separateur = " ")
Dim tablo(), n
Plage = Plage '=> matrice
For Each JOINDRE In Plage
  ReDim Preserve tablo(n) 'tableau à une dimension
  tablo(n) = JOINDRE
  n = n + 1
Next
JOINDRE = Replace(Application.Trim(Join(tablo)), " ", Separateur)
End Function
Fichier (3).

Edit : l'utilisation de JOINDRE dans la boucle économise une variable, mais c'est surtout pour le fun 😀

A+
 

Pièces jointes

Dernière édition:
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonjour le fil


Histoire de nourrir la variété "concaténatique" (venu d'outre-atlantique)

VB:
Function ConCatRange22(CellBlock As Range, _
            Optional Delim$ = "") _
            As String
'entered as =concatrange22(a1:a10,"|") desired delimiter between quotes
'or as =concatrange22((a1:a10,e1,f1,g1:g4)"|") for non-contiguous ranges.
Dim Cell As Range, sbuf$ ' à ma sauge
For Each Cell In CellBlock.Cells
If Not IsEmpty(Cell) Then 'à ma sauce aussi
sbuf = sbuf & Cell.Text & Delim
End If
Next Cell
ConCatRange22 = Left(sbuf, Len(sbuf) - Len(Delim))
End Function ''//-> Gord Dibben MS Excel MVP

Maintenant le client a le choix (mais on fait pas encore la carte de fidélité 😉 )

PS: je ne sais pas dire si cette dernière fonction a des limites dans son utilisation (notamment avec des grandes plages)

PS2: je laisse mon lapsus, car j'aime bien les infusion à la sauge 😉
 
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Re, salut Jean-Marie,

Je reviens sur ma 1ère méthode avec les Application.Transpose.

La fonction Joindre1 du post #1 n'acceptait que des plages de cellules (ligne ou colonne).

Celle-ci accepte aussi les matrices :

Code:
Function Joindre1(Plage, Separateur)
On Error Resume Next
1 Plage = Application.Transpose(Plage)
If IsError(UBound(Plage, 2)) Then Else GoTo 1
Joindre1 = Join(Plage, Separateur)
End Function
Nota : j'aime bien ce Then Else (pas très facile à comprendre, sorry).

Fichier (4).

Edit : attention, si vous entrez comme argument une plage comme A1:B5, préparez la touche <Echap> !!

Pour éviter ce problème, fichier (5) avec la fonction plus "classique" :

Code:
Function Joindre1(Plage, Separateur)
On Error Resume Next
Plage = Application.Transpose(Plage)
If IsError(UBound(Plage, 2)) Then Else Plage = Application.Transpose(Plage)
Joindre1 = Join(Plage, Separateur)
End Function
A+
 

Pièces jointes

Dernière édition:
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Wo, Wo, Wo, 😕

Bonjour job, Stapple.

@job: en chanson.

"Tu me fais tourner la tête, avec les codes que tu à lààààààààà"
"Mais où est-ce que je vais les mett'e, j'ai l'embarra du choix!" 😀😀😀😀


A+ 😎
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…