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:

patricktoulon

XLDnaute Barbatruc
allez comme je vais partir pour un moment je vous donne du grain a moudre
voici ma fonction transpose original avec les test benchmark étape par étape
en faisant ça vous pouvez déjà savoir ou améliorer
je trouve sincèrement que c'est bien pratique
le module classe benchmark est fourni avec dans le fichier
sinon visiter cette page
bon après midi à tous ;)
 

Pièces jointes

  • test benchmark.xlsm
    49.7 KB · Affichages: 1

patricktoulon

XLDnaute Barbatruc
par exemple avec l'exemple de dimension de @job75
avec transpose de vba
les résultats se lisent dans la console je ne l'ai pas dis pardonnez moi
VB:
Sub test2()
    Dim t(1 To 10000, 1 To 1000)
    Set bench2 = New cBenchmark
    bench2.TrackByName "debut de transposition"
    t2 = Application.Transpose(t)
    bench2.TrackByName "fin de transposition "
End Sub
Code:
IDnr  Name                    Count  Sum of tics  Percentage  Time sum
0     debut de transposition      1        2 116       0,02%    212 us
1     fin de transposition        1   11 351 051      99,98%    1,14 s
      TOTAL                       2   11 353 167     100,00%    1,14 s

Total time recorded:             1,14 s
 

Dudu2

XLDnaute Barbatruc
J'essaierais bien avec le BenchMark mais ce foutu code refuse de m'imprimer le rapport sur la feuille.
When you're code finishes, the report is printed automatically
ET ben non ! Ça s'exécute mais n'imprime rien.

Edit: ah purée de purée de pois, il faut aller dans la fenêtre Execution !
Et pourquoi tu le dis pas github ?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Edit: ah purée de purée de pois, il faut aller dans la fenêtre Execution !
Et pourquoi tu le dis pas github ?
1733656558196.png

;)
 

Dudu2

XLDnaute Barbatruc
Alors je sais pas comment tu as eu ou interprété les chiffres mais voilà ce que ça donne chez moi avec la Classe cBenchmark. Les résultats sont conformes au test avec le Timer.

Petites dimensions (VBA 20% mieux en moyenne)
Dimension 1Dimension 2EXCEL (ms)VBA (ms)%DIFF
10000​
5​
18​
14​
-22,22%​
20000​
5​
37​
28​
-24,32%​
30000​
5​
60​
49​
-18,33%​
40000​
5​
79​
64​
-18,99%​
50000​
5​
106​
85​
-19,81%​

Grandes dimensions ("grandes" pour le Application.Transpose) (VBA 35% mieux en moyenne)
Dimension 1Dimension 2EXCEL (ms)VBA (ms)%DIFF
10000​
100​
454​
299​
-34,14%​
20000​
100​
980​
606​
-38,16%​
30000​
100​
1380​
910​
-34,06%​
40000​
100​
1950​
1260​
-35,38%​
50000​
100​
2470​
1580​
-36,03%​
 

Pièces jointes

  • TransposeNaturel - Test Compare Benchmark.xlsm
    82.8 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
re voila ton fichier testé ubound(50000,100) tel que tu l'a donné
soit patient + de 9 secondes 🤣 🤣 🤪
demo1.gif




et voila ma version VBA originale
La c'est bon pas besoins de patience
demo1.gif


Les résultats parlent d'eux même
je récapitule
1° plus de 9 secondes pour toi avec 50000 sur 100 pour tester les deux méthodes
ce qui est cohérent avec tes tableaux(mon pc doit être légèrement moins puissant que le tiens )


2° et 1.1 seconde pour moi avec 50000 sur 100 pour tester les deux versions
et les tests ont été réalisés sur le même pc
indiscutable

après sur 65535 sur 100 chez moi ca bug je suis en EXCEL 32 bits
mais dans tout les case avec moins de puissance je sui 9 fois plus rapide
donc ta TransposeNaturel à revoir
 

Dudu2

XLDnaute Barbatruc
soit patient + de 9 secondes
Tu as acheté ton ordi des années 80 au marché aux puces ? 🤣 🤣 🤪
Chez moi 1sec 41 avec un
1733662312747.png

Et avec Application.Transpose c'est 2sec 26... Alors soit encore plus patient !

Il est où ton code 10 fois plus rapide que je le benchmark ?
Parce que les GIF animés ça ne démontre rien.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
ben c'est tout simplement mon ancienne version
va y benchmark
VB:
Sub test2()
    Dim t(1 To 50000, 1 To 100) 'même dimension que dudu2 avec application transpose
    Set bench2 = New cBenchmark
    bench2.TrackByName "debut de transposition avec application transpose"
    t2 = Application.Transpose(t)
    bench2.TrackByName "fin de transposition avec application transpose"

    Dim tx(1 To 50000, 1 To 100) 'même dimension que dudu2 avec vba transpose version patricktoulon
     bench2.TrackByName "debut de transposition avec vba transpose version patricktoulon"
    t2 = TransposeXV1(tx)
    bench2.TrackByName "fin de transposition avec vba transpose version patricktoulon"
End Sub

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
 

Dudu2

XLDnaute Barbatruc
Je sais pas comment tu testes et tu mesures...
Le benchmark de ton code donne les mêmes résultats que le mien.
Est-ce étonnant ? Non car les algorithmes de recopie de tables sont identiques à la présentation près.
Comment veux-tu que des codes similaires aient un rapport de performance de 1 à 10 ?
 

Pièces jointes

  • @patricktoulon - Test Compare Benchmark.xlsm
    80.5 KB · Affichages: 0

Dudu2

XLDnaute Barbatruc
@jurassic pork ,
Ouais, ben pas terrible.
Perso je n'aime pas du tout, mais alors pas du tout ces Option Base.
Ça n'est valable que dans le Module ou Classe ou UserForm dans lequel c'est déclaré et on est à peu près sûr d'en oublier quelque part.
Alors les Split et les Array renvoient un LBound = 0. Qu'à cela ne tienne, on utilise les LBound et les UBound.
 

Dudu2

XLDnaute Barbatruc
Cher @patricktoulon, la vidéo de 33 minutes, désolé, je peux pas, c'est bien trop long.
Rien ne vaut un bon fichier de test.

Et justement, pour que voies bien les choses, j'ai passé un peu (trop) de temps à faire un comparatif on ne peut plus clair entre:
  1. Application.Transpose
  2. Mon code
  3. Ton code
  4. [Il serait facile de rajouter un autre code]
Donc, STP, pour une fois, exécute ce fichier et regarde ce que ça donne.
 

Pièces jointes

  • @patricktoulon - Test Compare Benchmark.xlsm
    152.9 KB · Affichages: 3

Discussions similaires

Statistiques des forums

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