Icône de la ressource

TABLEAUX: FONCTION TRANSPOSE SANS LIMITE V2.1

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 !

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...
 
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
 
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 😁
 
(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.
 
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?
 
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.
 
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.😁
 
Bonjour à tous,
Suite à ma première version et à vos participations (que je remercie), sur le forum pour améliorer la fonction, je l'ai réécrite.
Je remercie aussi @Dudu2 à qui je dois le fichier de démonstration qui permet aux utilisateurs de jouer avec la fonction. Je n'oublie pas son importante contribution qui m'a fourni les bases de ces améliorations.
Pour vous donner une idée de se qu'apporte cette nouvelle version Transpose2D j'ai fait ce tableau comparatif: (non exhaustif)
1739198228552.png

Comme vous le verrez, AL7_Transpose2D propose 2 fonctions:
• Transpose2D (alias Trans2D) :
Principalement destinée à une utilisation dans VBA.
• TransRange (alias TransRng) :
Certains paramètres ne sont pas accessibles afin d'être utilisée plus facilement dans les cellules. Si besoin vous pouvez utiliser la fonction Transpose2D (Trans2D) dans les cellules.

Bien sûr les deux fonctions peuvent être utilisées dans les cellules ou dans VBA, La différence est que Transpose2D propose plus de fonctions que TransRange.
Tout en gardant les avantages de Transpose2D, vous pouvez demander à garder les mêmes caractéristiques/comportement de numérotation des transpositions que les fonctions Transpose d'Excel pour cela mettez l'option LikeExcel = True (-1).

De plus, j'ai aussi ajouté l'IntelliSense qui vous aidera lors de saisie des paramètres dans vos cellules ou vos codes VBA .

A vous de jouer … 😉
Par avance, merci pour vos retours.
 
- 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

Discussions similaires

Réponses
0
Affichages
459
Retour