VBA - Transformer un tableau bidimensionnel en unidimensionnel

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

  • Joindre(1).xls
    28.5 KB · Affichages: 135

Staple1600

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonsoir job75

Pas plus simple, mais avec IIF

VB:
Function Joindre3(Plage)
Plage = IIf(Plage.Rows.Count = 1, Application.Transpose(Application.Transpose(Plage)), Application.Transpose(Plage))
Joindre3 = Join(Plage, "-")
End Function

Et celle-là , c'est pour le plaisir de te croiser dans un fil ;)
VB:
Function Joindre4(Plage, Optional Delim As String = "-")
With Application
    Plage = _
        IIf(Plage.Rows.Count = 1, _
        .Transpose(.Transpose(Plage)), _
        .Transpose(Plage))
    Joindre4 = _
        Join(Plage, Delim)
End With
End Function
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonsoir Job, Stapple

Je viens de faire un excercice avec cette fonction.

Dans mon exercice j'ai enlever le tiret et créer une petite phrase dans la première colonne (Joindre1).
en la coupant dans chaque celulle et pour chaque mot, un espace.

C'est la même chose que la fonction CONCATENER? Ou elle est différente???

Maintenant, En A1 j'inscrit VBA: En B1 à B10 la définition, en C1 le résultat.
C'est possible de modifier le code pour l'avoir aussi sur une ligne?

Une fois la phrase créée, comment la recoupée; c'est à dire, chaque mot dans des celulles différentes?


A+
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonsoir Loup Solitaire


Si ce n'est Join, c'est Split

Voila de quoi t'expliquer
VB:
Sub ex_Split()
Dim i As Byte, m$, a
m = "Bonsoir Loup Solitaire"
'uno
a = Split(m)
'deuxio
MsgBox a(0): MsgBox a(1): MsgBox a(2)
'tercio
[A1].Resize(UBound(a) + 1) = Application.Transpose(a)
[B1] = Joindre4(Range("A1:A3"), Chr(32))
'quatro
[A5:C5] = Split([B1].Text)
End Sub
VB:
Function Joindre4(Plage, Optional Delim As String = "-")
With Application
    Plage = _
        IIf(Plage.Rows.Count = 1, _
        .Transpose(.Transpose(Plage)), _
        .Transpose(Plage))
    Joindre4 = _
        Join(Plage, Delim)
End With
End Function
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonjour Stapple,

le code donné est pas mal! ;)
Ce n'est pas ça que je cherchais, mais plutôt ça.
 

Pièces jointes

  • test.xls
    26 KB · Affichages: 102
  • test.xls
    26 KB · Affichages: 107
  • test.xls
    26 KB · Affichages: 103

job75

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonjour Lone-wolf,

Staple n'est pas encore prêt sinon oooooouuuuuu...

A votre avis laquelle est la meilleure en D1 :

Code:
=A1&" "&B1&" "&B2&" "&B3&" "&B4&" "&B5
ou

Code:
=CONCATENER(A1;" ";B1;" ";B2;" ";B3;" ";B4;" ";B5)
Réponse : CONCATENER utilise des ; (1 octet) au lieu de l'opérateur & (2 octets). Donc inutile si moins de 5 éléments...

A+
 

Staple1600

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonjour le fil

EDITION: voici un autre exemple
Code:
Sub Re_Exemple()
Dim i As Byte, RESULT$, tArray
tArray = Split("est ça ce traduit comment en VBA?")
For i = 1 To UBound(tArray)
MsgBox "Split " & i & ": =" & tArray(i)
Next i
RESULT = Join(tArray)
MsgBox RESULT
End Sub

Job75 (salutations ;) )
Avec l'aide de la touche F1, je serai peut-être plus explicite ;)
Join, fonction

Description
Renvoie une chaîne créée par la jonction de plusieurs sous-chaînes contenues dans un tableau.
Syntaxe
Join(sourcearray[, delimiter])
La syntaxe de la fonction Join comprend les arguments nommés suivants :
Élément Description sourcearray Tableau à une dimension contenant les sous-chaînes à joindre. delimiter Facultatif. Caractère de chaîne utilisé pour séparer les sous-chaînes dans la chaîne renvoyée. S'il est omis, le caractère espace (" ") est employé. Si l'argument delimiter est une chaîne de longueur nulle (""), tous les éléments de la liste sont concaténés sans séparateur.
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Hello Stapple, Job

Cerait-il possible d'avoir le code sans MsgBox et sans phrase dans celui-ci?

Merci beaucoup.


@Job: j'ai testé le code, mais si j'y applique mon exemple, celà ne donne rien.
La phrase fournie au départ s'affiche sur une colonne et non sur deux.
Ensuite viens le découpage.

Code:
[A1].Resize(UBound(a) + 1) = Application.Transpose(a)
[B1] = Joindre4(Range("A1:A3"), Chr(32)) ' ici une colonne
'quatro
[A5:C5] = Split([B1].Text)   ' ici découpage en 1ligne et 3 colonnes.

Mon exemple: [A1] Salut! [B1:B7]Tout le blonde. :D [E1]Salut! Tout le blonde.
Comme tu le vois, j'ai donc 2 colonnes et 3 lignes.


A+ :cool:


A+
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Bonjour à tous
je trouve cette discussion très intéressante:).
connaissez-vous une autre solution, plus simple ?
Pas plus simple je pense qu'en utilisant Transpose, mais un peu plus concis :
Code:
Function Joindre3(Plage)
If Plage.Rows.Count = 1 Then Plage = Application.Transpose(Plage)
Joindre3 = Join(Application.Transpose(Plage), "-")
End Function
A+
 

job75

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Re, salut David :)

Avec l'exemple de votre fichier Lone-Wolf, je pense qu'il faut utiliser la 2ème méthode de mon post #1.

C'est à dire utiliser un tableau auxiliaire à une dimension :

Code:
Function JoindreMat(Plage, Optional Separateur$)
Dim ub&, tablo(), p, n&
Plage = Plage 'crée un tableau à 2 dimensions
ub = UBound(Plage) * UBound(Plage, 2) - 1
ReDim tablo(ub) 'tableau à une dimension
For Each p In Plage
  tablo(n) = p
  n = n + 1
Next
JoindreMat = Join(tablo) 'séparateur : espace
JoindreMat = Application.Trim(JoindreMat) 'fonction SUPPRESPACE
If Separateur <> "" Then JoindreMat = Replace(JoindreMat, " ", Separateur)
End Function
Fonction en D1 et D2 dans le fichier joint.

A+
 

Pièces jointes

  • test(1).xls
    33 KB · Affichages: 70
  • test(1).xls
    33 KB · Affichages: 68
  • test(1).xls
    33 KB · Affichages: 58

job75

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

Re,

La fonction JoindreMat de mon post #13 est générale et permet de concatener n'importe quelle matrice.

Mais dans le cas de votre fichier, il est aussi simple d'utiliser ma 1ère méthode, avec par exemple la Joindre4 de Staple.

Fichier (2).

A+
 

Pièces jointes

  • test(2).xls
    32.5 KB · Affichages: 99
  • test(2).xls
    32.5 KB · Affichages: 102
  • test(2).xls
    32.5 KB · Affichages: 112

Lone-wolf

XLDnaute Barbatruc
Re : VBA - Transformer un tableau bidimensionnel en unidimensionnel

re Job,

La fonction JoindreMat donne avec une très grande satisfaction
le résultat voulu. :D :D :D

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



A+ :cool:
 

Discussions similaires

Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
312 495
Messages
2 088 964
Membres
103 992
dernier inscrit
Christine 974