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
mais je vois que l'on continu a m'asticoter insidueusement
ben je garde pour moi
Qu'est-ce tu dis-là ? C'est pas parce qu'on demande un fichier que tu dois te sentir stigmatisé.
Ça sert à rien les posts à rallonge avec des tas d'images, de bouts de codes et de longues explications qu'on n'a ni le temps ni l'envie de lire. Tu le sais.
 

Dudu2

XLDnaute Barbatruc
Si il y a quelque chose de très particulier oui, c'est utile.
Par exemple la vidéo du montage du KAOKO sur ma 800 SE, c'est utile.
Ou tes vidéos sur le ruban, c'est utile.
Mais pour afficher du code et te voir l'éditer, je préfère le fichier.
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir
1733770772194.png


a voté
 

Pièces jointes

  • test dudu2-mapomme-patricktoulon benchmark.xlsm
    112 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Pour comparer, il faudrait que les transpose fassent la même chose. Par exemple mon transpose "norme" la matrice retour donc introduit des calculs d'indices supplémentaires 🙃. Je le répète, la mesure stricte d'un transpose pur par une double boucle ne doit en rien changer la durée selon les méthodes (excepté les interruptions liées au système d'exploitation, aux autres programmes qui tournent y compris ceux en arrière plan).
Donc ce qui est intéressant, c'est de comparer des méthodes différentes qui aboutissent à des durées significativement différentes sinon c'est un peu de la masturbation intellectuelle. Quoiqu'il n'y a pas de mal à se faire du bien (au cerveau), non ? 🤭
 

Dudu2

XLDnaute Barbatruc
Bonjour @mapomme,

Les 3 méthodes VBA comparées sont très similaires et les résultats peuvent varier d'une exécution à une autre de quelques millisecondes.

1733800181629.png


Si ta méthode utilise quelques millisecondes supplémentaires, du négligeable en fait, c'est parce qu'en rendant toujours un tableau avec des LBound = 1 tu utilises des indices calculés qui consomment ces millisecondes.:
VB:
ni = UBound(t, 1) - LBound(t, 1) + 1: nj = UBound(t, 2) - LBound(t, 2) + 1: ReDim r(1 To nj, 1 To ni)
For i = 1 To ni: For j = 1 To nj: r(j, i) = t(LBound(t, 1) + i - 1, LBound(t, 2) + j - 1): Next j, i

Or dans ces indices, les parties LBound(t, 1) - 1 et LBound(t, 2) - 1 sont fixes et en les remplaçant par des variables préalablement valorisées, tu retombes exactement dans les mêmes chiffres ce qui est normal puisque tout le monde fait quasi la même chose.
Code:
Dim k As Long, p As Long
k = LBound(t, 1) - 1
p = LBound(t, 2) - 1
         For i = 1 To ni: For j = 1 To nj: r(j, i) = t(k + i, p + j): Next j, i
1733804432437.png

Comme quoi la masturbation intellectuelle à laquelle tu fais référence peut aboutir à des améliorations, fussent-elles symboliques dans notre affaire.

J'ai aussi ce problème puisque mon code permet de changer les LBound à n'importe quelle valeur passée en paramètres. Pour éviter les calculs, je fais progresser un indice de + 1 à chaque tour de boucle et c'est quasi-indolore (désolé pour le nombre de lignes, je ne sais pas faire de ZIP-code).
Code:
ReDim tt(LB1 To UB1, LB2 To UB2)

jtt = LB2
For it = LBound(t, 1) To UBound(t, 1)
    itt = LB1
    For jt = LBound(t, 2) To UBound(t, 2)
        tt(itt, jtt) = t(it, jt)
        itt = itt + 1
     Next jt
     jtt = jtt + 1
Next it

Le code de @patricktoulon est le plus simple puisque qu'il rend toujours un tableau aux dimensions exactement transposées du tableau source et que les indices qu'il manipule sont directs et sans calculs. En moyenne, il devrait arriver en tête du benchmark de quelques millisecondes.
Code:
ReDim t2(LBound(t, 2) To UBound(t, 2), LBound(t) To UBound(t))
For C = LBound(t, 2) To UBound(t, 2): t2(C, i) = t(i, C): Next
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
non @Dudu2 c'est faux comme quoi tu ne regarde pas
chez moi ce n'est pas ca
VB:
ReDim t2(LBound(t, 2) To UBound(t, 2), LBound(t) To UBound(t))
For C = LBound(t, 2) To UBound(t, 2): t2(C, i) = t(i, C): Next

c'est ça

Code:
If lBase > -1 Then LB1 = Sgn(lBase - LBound(T))
    If y = 0 Then
        ReDim T2(LBound(T) + LB1 To UBound(T) + b1, LBound(T) + LB1 To LBound(T) + LB1)
    Else
        If lBase > -1 Then LB2 = Sgn(lBase - LBound(T, 2))
        ReDim T2(LBound(T, 2) + LB2 To UBound(T, 2) + LB2, LBound(T) + LB1 To UBound(T) + LB1)
    End If

les indices sont calculé si base demandé par l'argument lBase
maintenant j'en suis sur tu ne regarde pas mes codes même si il n'y a pas de vidéos ;)

pour info
sans changer la base ou en changeant la base donc recalculer les indices chez moi ca change rien ou alors on parle de µs c'est insignifiant
de même qu'avec re calcul des bases si je lance 10 fois le moulin il peut arriver qu'avec changement de base ça soit plus rapide qu'avec les bases originales

ca veux dire quoi
et bien que ma méthode avec SGN(base demandée-base actuelle) n'est pas pénalisante

et chez moi avec mon petit pc acheté au marché aux puces
je suis toujours en terme de temps entre 60/90% de vos temps

sans changement de base
Code:
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version patricktoulon      1        2 930       0,02%    293 us
1     fin de transposition avec vba transpose version patricktoulon        1    3 974 583      29,02%    397 ms
2     ------------                                                         2          134       0,00%     13 us
3     debut de transposition avec vba transpose version @mapomme           1           59       0,00%   5900 ns
4     fin de transposition avec vba transpose version @mapomme             1    5 247 349      38,31%    525 ms
5     -------------                                                        2          118       0,00%     12 us
6     debut de transposition avec vba transpose version @dudu2             1           51       0,00%   5100 ns
7     fin de transposition avec vba transpose version @dudu2               1    4 472 757      32,65%    447 ms
      TOTAL                                                               10   13 697 981     100,00%    1,37 s

Total time recorded: 1,37 s
'------------------------------------------------------------------------'
2d lancement
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version patricktoulon      1        2 241       0,02%    224 us
1     fin de transposition avec vba transpose version patricktoulon        1    3 955 552      28,53%    396 ms
2     ------------                                                         2          141       0,00%     14 us
3     debut de transposition avec vba transpose version @mapomme           1           80       0,00%   8000 ns
4     fin de transposition avec vba transpose version @mapomme             1    5 315 728      38,34%    532 ms
5     -------------                                                        2          125       0,00%     12 us
6     debut de transposition avec vba transpose version @dudu2             1           61       0,00%   6100 ns
7     fin de transposition avec vba transpose version @dudu2               1    4 589 406      33,10%    459 ms
      TOTAL                                                               10   13 863 334     100,00%    1,39 s

Total time recorded: 1,39 s
'----------------------------------------------------------------------'
3eme lancement
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version patricktoulon      1        2 937       0,02%    294 us
1     fin de transposition avec vba transpose version patricktoulon        1    4 038 327      29,26%    404 ms
2     ------------                                                         2          120       0,00%     12 us
3     debut de transposition avec vba transpose version @mapomme           1           51       0,00%   5100 ns
4     fin de transposition avec vba transpose version @mapomme             1    5 288 677      38,32%    529 ms
5     -------------                                                        2          155       0,00%     16 us
6     debut de transposition avec vba transpose version @dudu2             1           53       0,00%   5300 ns
7     fin de transposition avec vba transpose version @dudu2               1    4 470 110      32,39%    447 ms
      TOTAL                                                               10   13 800 430     100,00%    1,38 s

Total time recorded: 1,38 s

maintenant en changeant la base
Code:
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version patricktoulon      1        2 576       0,02%    258 us
1     fin de transposition avec vba transpose version patricktoulon        1    4 035 570      29,15%    404 ms
2     ------------                                                         2          123       0,00%     12 us
3     debut de transposition avec vba transpose version @mapomme           1           53       0,00%   5300 ns
4     fin de transposition avec vba transpose version @mapomme             1    5 318 637      38,42%    532 ms
5     -------------                                                        2          171       0,00%     17 us
6     debut de transposition avec vba transpose version @dudu2             1           58       0,00%   5800 ns
7     fin de transposition avec vba transpose version @dudu2               1    4 486 159      32,41%    449 ms
      TOTAL                                                               10   13 843 347     100,00%    1,38 s

Total time recorded: 1,38 s
''-------------------------------------------------
2d lancement
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version patricktoulon      1        2 539       0,02%    254 us
1     fin de transposition avec vba transpose version patricktoulon        1    3 975 625      28,80%    398 ms
2     ------------                                                         2          142       0,00%     14 us
3     debut de transposition avec vba transpose version @mapomme           1           58       0,00%   5800 ns
4     fin de transposition avec vba transpose version @mapomme             1    5 377 669      38,95%    538 ms
5     -------------                                                        2          117       0,00%     12 us
6     debut de transposition avec vba transpose version @dudu2             1           50       0,00%   5000 ns
7     fin de transposition avec vba transpose version @dudu2               1    4 449 763      32,23%    445 ms
      TOTAL                                                               10   13 805 963     100,00%    1,38 s

Total time recorded: 1,38 s
'--------------------------------------------------------------------

3eme lancement
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version patricktoulon      1        2 988       0,02%    299 us
1     fin de transposition avec vba transpose version patricktoulon        1    3 942 481      28,82%    394 ms
2     ------------                                                         2          120       0,00%     12 us
3     debut de transposition avec vba transpose version @mapomme           1           54       0,00%   5400 ns
4     fin de transposition avec vba transpose version @mapomme             1    5 260 522      38,45%    526 ms
5     -------------                                                        2          131       0,00%     13 us
6     debut de transposition avec vba transpose version @dudu2             1           56       0,00%   5600 ns
7     fin de transposition avec vba transpose version @dudu2               1    4 473 779      32,70%    447 ms
      TOTAL                                                               10   13 680 131     100,00%    1,37 s

Total time recorded: 1,37 s
somme toute tous les trois somme assez constants dans les résultats

le meilleur de nos versions
on constate par exemple que chez @mapomme il consomme très peu au départ un 50 aines de tics
toi aussi d'ailleurs
tandis que chez moi je suis a plus de 2000
ça veux dire que au départ de vos fonctions vous faites pas grand chose ou alors mieux que moi
c'est après que ça se complique chez vous

j'attire ton attention sur la restitution des résultats dans une fenêtre userform
c'est quand même mieux que d'aller chercher toutes les api clipboard et des sendkeys dans la console non ?

fait moi plaisir @Dudu2 regarde mes codes avant de prétendre des choses qui sont fausses
 

Dudu2

XLDnaute Barbatruc
non @Dudu2 c'est faux comme quoi tu ne regarde pas
chez moi ce n'est pas ca

Voilà le code que j'ai récupéré de toi dans je ne sais plus quel post de ce sujet et c'est celui-là qui est benchmarké dans mon code.
VB:
Function TransposeXV1(t)
    'patricktoulon    V 1.2 -- 08/07/2021
    Dim Y&, i&, C&, t2
    On Error Resume Next
    Y = UBound(t, 2)
    On Error GoTo 0
    If Y = 0 Then
        On Error GoTo 0
        ReDim t2(LBound(t) To UBound(t), LBound(t) To LBound(t))
    Else
        ReDim t2(LBound(t, 2) To UBound(t, 2), LBound(t) To UBound(t))
    End If
    For i = LBound(t) To UBound(t)
        If Y = 0 Then
            t2(i, 1) = t(i)
        Else
            For C = LBound(t, 2) To UBound(t, 2): t2(C, i) = t(i, C): Next
        End If
    Next

    TransposeXV1 = t2
End Function

Alors si entre-temps t'as changé fallait le dire.
 

patricktoulon

XLDnaute Barbatruc
on pourrait parler des effet de bord de la memoire aussi
je viens de faire le test en mettant ma méthode en dernier
et là c'est dudu2 qui est plus rapide
VB:
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version @mapomme           1        2 965       0,02%    296 us
1     fin de transposition avec vba transpose version @mapomme             1    4 831 596      34,83%    483 ms
2     -------------                                                        2          125       0,00%     12 us
3     debut de transposition avec vba transpose version @dudu2             1           53       0,00%   5300 ns
4     fin de transposition avec vba transpose version @dudu2               1    4 521 212      32,59%    452 ms
5     ------------                                                         2          169       0,00%     17 us
6     debut de transposition avec vba transpose version patricktoulon      1           60       0,00%   6000 ns
7     fin de transposition avec vba transpose version patricktoulon        1    4 516 619      32,56%    452 ms
      TOTAL                                                               10   13 872 799     100,00%    1,39 s

Total time recorded: 1,39 s

j'ai testé avec mapomme en dernier
Code:
Test(s) dans la sub ou fonction : Test des fonction de transposition Patrictoulon / @mapomme / dudu2
IDnr  Name                                                             Count  Sum of tics  Percentage  Time sum
0     debut de transposition avec vba transpose version @dudu2             1        2 272       0,02%    227 us
1     fin de transposition avec vba transpose version @dudu2               1    3 906 263      28,55%    391 ms
2     ------------                                                         2          115       0,00%     12 us
3     debut de transposition avec vba transpose version patricktoulon      1           53       0,00%   5300 ns
4     fin de transposition avec vba transpose version patricktoulon        1    4 525 128      33,08%    453 ms
5     -------------                                                        2          120       0,00%     12 us
6     debut de transposition avec vba transpose version @mapomme           1           56       0,00%   5600 ns
7     fin de transposition avec vba transpose version @mapomme             1    5 246 195      38,35%    525 ms
      TOTAL                                                               10   13 680 202     100,00%    1,37 s

Total time recorded: 1,37 s

et j'ai testé chacun tout seul
@Dudu2 et moi on est a coude a coude a quelques µs
et @mapomme lui est constant
ca donne des indications assez précise sur les concéquences des méthode
@Dudu2 et moi jouons avec la mémoire tandis que @mapomme joue avec le proc visiblement
d'ailleurs dans le raport le sum of tics parle de lui même

n'y aurait il pas un moyen de prendre ce qui est mieux chez l'un en terme de mémoire et ce qui est de mieux chez l'autre en terme de proc

très intéressant ce truc j’apprends beaucoup de chose
il est fichtrement bien foutu ce benchmark il peux donner des axes d'amélioration pour nos développements
 

patricktoulon

XLDnaute Barbatruc
fallait le dire !!????????
post#84 et 79 en page 6 et même avant!!!! Et nous somme en page 8
et surtout que ta réponse vient après le post #113 avec ma proposition avec la fenêtre de reporting dans userform dynamique(avec fichier) et qui contient le même code sauf que j'ai changé le nom des variables b1->LB1 et b2 ->LB2 (LB our lbound)
quand je dis que tu regarde pas les codes ou que tu fait semblant
après tu t'étonne que ça m'énerve

va y prends moi pour un citron et dis moi que tu n'a pas essayé le post#113 je vais te croire 🤪
 

Dudu2

XLDnaute Barbatruc
fait moi plaisir @Dudu2 regarde mes codes avant de prétendre des choses qui sont fausses
T'inquiète, je regarde tous les codes.
En l'occurrence ton dernier c'était pour afficher le rapport de cBenchmark et c'est là-dessus que je me suis concentré. Je n'ai pas regardé ton Transpose car mon code de benchmark était fait bien avant que tu changes. Mais peu importe.

J'ai tellement regardé, que j'y ai commis un crime de lèse-majesté !
J'ai mis du code à @Dudu2 dans du code à @patricktoulon :eek: , ce que @patricktoulon ne ferait jamais, ô grand jamais 😭 . Voir le Sub msgboxX(str) dans la Classe cBenchmark.
 

Pièces jointes

  • test dudu2-mapomme-patricktoulon benchmark.xlsm
    146.4 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
315 067
Messages
2 115 887
Membres
112 613
dernier inscrit
QUINTELA1969