Icône de la ressource

TABLEAUX: FONCTION TRANSPOSE SANS LIMITE V1.0.0

p'tit vieux

XLDnaute Occasionnel
p'tit vieux a soumis une nouvelle ressource:

TABLEAUX: FONCTION TRANSPOSE SANS LIMITE - Une fonction TRANSPOSE sans limite

Bonjour à tous,
J'ai le plaisir de mettre à votre disposition une fonction permettant de transposer un tableau à 1 ou 2 dimensions.
Mais ça existe ?
Oui, il existe la fonction Excel WorksheetFunction.Transpose.
Mais celle-ci a les limites suivantes:
- 65000 lignes.
- Ne connait que l'indice de départ 1. Base 1 -> (1 to a) ou (1 to a, 1 to b)
- Ne sait pas convertir une chaine ou valeur simple en tableau (1 ,1) ou (0,0)

Revenons à ma fonction
Transpose() permet...

En savoir plus sur cette ressource...
 

patricktoulon

XLDnaute Barbatruc
Bonjour @p'tit vieux
ton article est enfin sorti
et je l'ai lu
a la fin on tombe sur ça
DIFFERENCE WorksheetFunction.Transpose et Transpose:
Quand on transmet un tableau T(1 to a) :
La fonction d'Excel retourne T(1 to A, 1 to 1) alors que ma fonction Transpose retourne T(1 to 1, 1 to A)
alors ce n'est pas une transposition mais une conversion 1 dim to 2 dim

un array simple transposé ne peut a voir qu'une colonne(si je puis m'exprimer ainsi )
je vais maintenant voir le fichier voir un peu ce que tu a fait
 

p'tit vieux

XLDnaute Occasionnel
Bonjour @p'tit vieux
ton article est enfin sorti
et je l'ai lu
a la fin on tombe sur ça

alors ce n'est pas une transposition mais une conversion 1 dim to 2 dim

un array simple transposé ne peut a voir qu'une colonne(si je puis m'exprimer ainsi )
je vais maintenant voir le fichier voir un peu ce que tu a fait
Bonjour Patrick
OK
Oui pour le 1D vers le 2D. Mais là tu chipotes 😊
Et puis ... C’est du bonus qui m’est souvent utile.
J’attends la sanction 😁
 

p'tit vieux

XLDnaute Occasionnel
(Copier/coller de ma réponse sur le forum)

Re,
Merci de t'attarder sur mon code.

…. alors je ne sais pas trop pourquoi tout ça dans une classe (tu nous le diras) ...
Simplement parce que j'ai mis tous mes "outils" dans une boite (à outils) UDF à part (xlam).
Cela me permet d'utiliser mes fonctions à l'envie sans avoir à faire des copier/coller dans les autres applications.
De plus lorsque je fais des corrections celles-ci sont appliquées dans toutes les applications utilisant la boite à outils. Plus pratique, logique non?
Bon mais ça c'est un détail.. C'est vrai que ce serait plus clair pour un lecteur Lambda de déplacer le code dans le module. Tu as raison, je vais faire çà dans la nouvelle version.

une fonction transpose transpose et c'est tout elle n'est pas à pour faire la vaisselle et la lessive
chacun son rôle
En résumé tu me déconseilles de décomposer en plusieurs "mini" fonctions.
A savoir:
1° Une fonction 'basique" qui fait Transpose()
2° Une fonction pour changer de base
etc.

Ok pourquoi pas. Ca se défend niveau facilité de maintenance et compréhension du code des fonctions.
Mais sur ce principe on peut vite arriver à du code "Spaghetti" avec des bouts de fonctions dans tout les sens.
Par contre, pour l'utilisateur (développeur) … Hum!
Suivant les besoins cela obligera le développeur à appeler moulte fonctions différentes pour avoir un résultat final voulu.
Alors je suis en parti d'accord avec toi. Le sujet (le souci) est de trouver l'équilibre entre la maintenance des fonctions et la facilité d'utilisation par les développeurs.

1D vers 2D
ben non justement je ne chipote pas ….
Oui dans un sens tu as raison (Mais dans un sens seulement)
Comment interprètes tu la demande d'une "transposition" d'un tableau 1D?
image_2024-12-06_150221897.png


Pour moi soit tu ne fais rien 😁 soit tu convertis le 1D en un tableau 2D. Logique n'est ce pas.
"WorkSheetFunctions.Transpose" fait ceci; (Trans_Excel(1 to n,1)
Moi je fais 1, 1 to n. Bon si ca gène je peux le modifier pour être à l'identique d'Excel.

2éme point: La "transposition" d'une simple chaine texte (ou nombre)?
image_2024-12-06_150254962.png

Excel ne fait rien. En me référant à la remarque de Dudu2, si tu demandes de transposer un texte, quelque soit la raison, c'est que tu veux un tableau en retour. Et je suis d'accord avec lui.
 

p'tit vieux

XLDnaute Occasionnel
Bonjour @Dudu2
j'ai un petit bug.

Avec LikeExcel = False
Ici c’est bon lorsque 2 dimensions : T(2,1) => T(1,2)
1734620177280.png


Lorsque 1 dimension :
Ci-dessous nous obtenons : T(2) => T(2,1). A mon avis logique.
1734620399771.png

Mais ce devrait être comme au-dessus: T(2) => T(1,2)
Logique non?

Je te joins le module (.bas) corrigé.
J'ai laissé le code original en commentaire.
Les corrections sont après le commentaire:
VB:
' Corrigé le 19/12/2024 15:30
Es-tu d'accord avec moi?
 

Dudu2

XLDnaute Barbatruc
Bonjour @p'tit vieux,
Je pense que cette question a été abordée dans Le sujet à rallonge.
J'ai choisi de faire comme Excel pour transposer une table à 1 dimension car d'un point de vue Range T(2) c'est pareil que T(1, 2). Ce sont des valeurs en ligne.
VB:
Sub a()
    ActiveSheet.Cells.ClearContents
   
    Dim t(1 To 2) As Variant
    t(1) = "A"
    t(2) = "B"
    [A1].Resize(, 2).Value = t
   
    Dim tt(1 To 1, 1 To 2) As Variant
    tt(1, 1) = "C"
    tt(1, 2) = "D"
    [A2].Resize(, 2).Value = tt
End Sub
1734626387933.png


La transposition de T(2) en T(2, 1) permet de passer de ligne à colonne ce qui constitue une transposition Range.
Code:
Sub a()
    ActiveSheet.Cells.ClearContents
   
    Dim t(1 To 2) As Variant
    t(1) = "A"
    t(2) = "B"
    [A1].Resize(, 2).Value = t
   
    Dim tt(1 To 2, 1 To 1) As Variant
    tt(1, 1) = "C"
    tt(2, 1) = "D"
    [A2].Resize(2).Value = tt
End Sub
1734626760955.png


Après tu peux faire comme tu veux dans ce cas.
 

p'tit vieux

XLDnaute Occasionnel
Re
D'accord avec toi pour Excel SI LikeExcel = True
Par contre je garde la modification si LikeExcel = False
… d'où l'utilité LikeExcel et faire la différence entre LikeExcel = True/False 😉

Sinon à quoi ça sert que Dudu il se décarcasse😁

Et puis Transpose2D ne sert pas que pour l'utilisation des Ranges and Co 😀

PS:
Et puis il fallait bien que je trouve quelque chose.😁
 

Discussions similaires

Statistiques des forums

Discussions
315 064
Messages
2 115 864
Membres
112 602
dernier inscrit
annouara