XL 2021 Vos avis SVP: Une fonction TRANSPOSE() à améliorer

p'tit vieux

XLDnaute Occasionnel
Bonjour à tous,
Pour mes codes VBA, j'ai écris une première version de ma fonction Transpose() que je vais mettre à votre disposition dans sa version 1.0.0.
Toutefois, je voudrais votre avis sur l'intérêt de rajouter des options complémentaires à celle-ci.

Dans un premier temps j'ai écris une fonction Transpose() afin de lever la limite des 65536 lignes de la fonction "WorkSheetFunctions.Transpose" d'Excel.
Pour mes besoins j'ai ajouté les possibilités suivantes:
- Choisir la base départ du tableau (Base 0 ou 1)
- Pouvoir convertir un texte/valeur simple dans un tableau 2D T(1,1)

Rien d'exceptionel, mais pratique.

Donc je vous propose de me soumettre vos idées.

Par exemple, j'ai pensé à:
- Si on transmet T(0 to 0, 0 to N) ou T(1 to N, 1 to 1) Transpose() renvoie un tableau 1D T(0 to N) ou T(1 to N) suivant la base choisie
- Transposer ET ne renvoyer que les n premieres lignes
- Transposer ET ne renvoyer de la ligne n° X à n° Y

Voilà pour ces quelques idées.
A votre avis laquelle ou lesquelles de celles-ci ont-elles un intérêt.

Et vous, vos autres idées qui vous paraitraient utiles?
Ensuite suivant vos propositions ….
Je nommerai un 1er Ministre du développement 🤣
Mais non! Je publierai une nouvelle version (Pas sérieux ces P'tit Vieux)

Merci pour vos avis et suggestions.

ATTENTION!
Ici il n'est pas question de faire des recherches de texte/valeur ou autre truc du genre.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour @mapomme,
C'est vrai que cette histoire de LBound ajustable n'a guère de valeur ajoutée dans une code "habituel".
Mais si un utilisateur a décidé d'utiliser des LBound spécifiques pour une raison X (ses indices démarrent à 10 ou -3 pour des raisons extérieurs aux tables proprement dites) je pense que c'est mieux de les respecter.
En tous cas c'est possible, sinon ça prend les LBounds de la source, en général 1 ou 0 pour Array ou Split.
 

p'tit vieux

XLDnaute Occasionnel
@Dudu2
Pour instant tout est OK.
Avec tableau rempli par des chaines la vitesse de traitement est bonne.
========== #212 ========
CHRONO Timer 1,941 s
Quantité: 6 553 500 Lignes = 65 535 Colonnes: 100
Base(1) / Base(2) Tableau: 0 / 0
Base(1) / Base(2) Résultats: 1 / 1

========== WorksheetFunction.Transpose ========
CHRONO Timer 3,371 s
Base(1) / Base(2) Résultats: 1 / 1
Question philosophique …
Penses tu qu'il serait plus "intelligent" pour l'utilisateur de mettre LikeExcel = TRUE par défaut.
Ton avis?
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Après reflexion je crois que garder LikeExcel = FALSE par défaut est mieux.
En effet si la fonction reproduit Excel sauf pour la quantité et la vitesse de traitement que j'ai pu mesurer il n'y a moins d'interet car on garde les "défauts / incohérences" d'Excel.
 

Dudu2

XLDnaute Barbatruc
Moi aussi je préfère LikeExcel = FALSE par défaut car on obtient toujours une table transposée à 2 dimensions, et comme c'est indiqué dans les commentaires, ça permet de toujours l'indicer avec 2 indices t(x, y) sans se poser la question de savoir si la 2ème dimension a disparu ou pas.

En plus j'aime assez l'idée, avec des paramètres non précisés BaseOut1 et BaseOut2 (valeurs par défaut) de retrouver les LBound et UBound initiaux transposés, car là aussi, un code peut se fier aux valeurs initiales dans des boucles par exemple sans se poser de question.

Ça me parait plus "naturel", d'où le nom de la fonction TransposeNaturel(). ;)
 

patricktoulon

XLDnaute Barbatruc
bonsoir
bien que je sais que vous êtes partis dans un duo et je fait chier dudu mais je m'en fou
je me sent investi de corriger une erreur monumentale
affirmer des choses comme ca après des années d'expérience
@Dudu2 dit
'- Si on transmet T(0 to 0, 0 to N) ou T(1 to N, 1 to 1) Transpose() renvoie un tableau 1D T(0 to N) ou T(1 to N) suivant
c'est faux et archi faux et que ce soit en base 0 ou pas

permet moi de corriger
en fait app.transpose renvoie toujours un tableau à deux dimensions
il renvoie(0 to N,0 To 0)




démonstration
VB:
'- Si on transmet T(0 to 0, 0 to N) ou T(1 to N, 1 to 1) Transpose() renvoie un tableau 1D T(0 to N) ou T(1 to N) suivant
Sub test()
Dim N
N = 10
ReDim T(0 To 0, 0 To N)
T2 = Application.Transpose(T)

MsgBox "dim1=" & UBound(T2) & "   dim2=" & UBound(T2, 2)
End Sub
autrement dit en écriture ou lecture ce sera toujours t2(x,y) et pas t2(x) ou t2(y)

1734112421273.png


si vraiment transpose renvoyait un tableau 1D le msgbox ubound(t2,2) renverrait une erreur
on voit bien qu'il me renvoie les 10 qui étaient auparavant le ubound(t)
application transpose n'a jamais enlevé une dimension au contraire elle ajoute la 2d sil elle est inexistante
c'est le B A BA
on apprend ça quand on débute dans les premiers exercice en vba
maintenant si vos fonction change les dimensions (et je parle pas des base) c'est pas une transposition c'est une conversion

désolé de vous faire yeC

edit: dans l’empressement j'ai moi même fait une erreur j'ai édité
non seulement il garde les deux dimension mais il met tout en base 1
 
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Moi aussi je préfère LikeExcel = FALSE par défaut car on obtient toujours une table transposée à 2 dimensions, et comme c'est indiqué dans les commentaires, ça permet de toujours l'indicer avec 2 indices t(x, y) sans se poser la question de savoir si la 2ème dimension a disparu ou pas.

En plus j'aime assez l'idée, avec des paramètres non précisés BaseOut1 et BaseOut2 (valeurs par défaut) de retrouver les LBound et UBound initiaux transposés, car là aussi, un code peut se fier aux valeurs initiales dans des boucles par exemple sans se poser de question.

Ça me parait plus "naturel", d'où le nom de la fonction TransposeNaturel(). ;)
Bonne nouvelle, pas trouvé de bug … Pour l'instant (Quel optimiste ces vieux😁)

J'ai regardé pour faire le traitement de plusieurs Areas. Mais très lourd,, compliqué et ça pose pas mal de soucis quand aux résultats que l'on renvoie dans le tableau. Surtout avec des décalages dans les Areas.

De plus
1) je ne crois pas qu'il y ait un véritable intérêt.
2) Cela dépasse le but 1er de la fonction.

Donc en charge à l'utilisateur de boucler sur chacune de ses Areas et de gérer les tableaux reçus.
 

Dudu2

XLDnaute Barbatruc
Bonne nouvelle, pas trouvé de bug … Pour l'instant
Le "Pour l'instant" est de trop
1734112498303.gif

En multi-Areas c'est pas gérable, tout simplement parce que les Areas peuvent avoir des dimensions différentes.
[A1:A3, C1:C4] ce n'est pas transposable car quelle est la 1ère dimension transposée ? 3 ou 4 ?
Et si tu choisis 4 parce que c'est le plus grand, ça n'a pas plus de sens car il va falloir trouver le transposé de A4 qui n'a ps lieu d'y figurer.
 

Dudu2

XLDnaute Barbatruc
Bonsoir @patricktoulon,
je sais que vous êtes partis dans un duo
Je te réponds pour ne pas que tu te sentes exclu, d'ailleurs tu ne l'es pas, mais je dois dire qu'un duo avec @p'tit vieux possède cet aspect positif et valorisant qu'il est toujours difficile de trouver dans tes posts.

@Dudu2 dit
'- Si on transmet T(0 to 0, 0 to N) ou T(1 to N, 1 to 1) Transpose() renvoie un tableau 1D T(0 to N) ou T(1 to N) suivant
c'est faux et archi faux et que ce soit en base 0 ou pas
Je ne comprends pas ce que tu racontes, à savoir si tu n'as pas compris ou si tu le fais exprès en déformant pour poster un message pour faire "chier dudu" (je te cite)
1734113552647.gif
.

Voilà ce que disent les commentaires dans la fonction à propos de WorksheetFunction.Transpose():
t(n) -> t(n, 1) et t(n, 1) -> t(n)
t(0-2, 0-3) -> t(1-4, 1-3)


Et la démonstration par le fichier du Post #212 que Ducros s'est décarcassé à faire pour justement éviter les polémiques inutiles.

1734113485737.png
 

patricktoulon

XLDnaute Barbatruc
application transpose ne travaille qu'avec deux dimensions
donc
[A1:A3, C1:C4] qui est un area de range
si l'on devait le transposer dans la logique de transposition
ça deviendrait
[ C1:C4,A1:A3]
et c'est tout
soit TB( t(1 to 3,1 to 1),t2(1 to 4,1 to 1)) deviendrait TF(t2(1 to 4,1 to 1),t1(1 to 3,1 to 1))
et c'est tout
 

patricktoulon

XLDnaute Barbatruc
Bonsoir @Dudu2
je ne sais pas ou tu est allé chercher tes informations , mais pour t'en assurer toi même
fait le test avec la petite sub tu verra que j'ai raison

si un jour application transpose sort un array(1 dim) je mange mon clavier

et comme il n'ont pa jugé nécessaire de corriger la limite avec les versions excel récentes (qui est vous êtyes d'accords avec bien plus importante )ça m’étonnerais qu'ils fassent une modification aussi importante que celle ci donc je suis pas près de goutter au plastic
 

p'tit vieux

XLDnaute Occasionnel
Bonsoir @patricktoulon
C'est ce que j'ai écrit dans le post #8
J'ai refait le test voici le résultat
1734113313337.png

En résumé avec Excel:
T(0 to 0, 0 to N) => T(1 to 1, 1 to N) OU T(1 to 1, 1 to N) => T(1 to N, 1 to 1)
T(0 to N, 0 to 0) => T(1 to N) OU T(1 to N, 1 to 1) => T(1 to N)
T(0 to N) => T(1 to N, 1 to 1) OU T(1 to N) => T(1 to N,1 to 1)
Un simple texte/valeur n'est pas transposé.
1734113700663.png


Et oui tu as raison en jouant sur les mots une transposition c'est aussi une conversion 😆
Maintenant peut importe comment on appelle cela le but est que la fonction fasse le boulot qu'on lui demande 🤣
Ton post #222
si un jour application transpose sort un array(1 dim) je mange mon clavier
Bon appétit !!! Regarde l'exemple T2 et T4 sur la capture 🤣
J'attends le film avec toi mangeant ton clavier
 
Dernière édition:

Discussions similaires