Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
le raisonnement est celui ci
et la on test avec 2 bases différente qu'il faut rapprocher
VB:
Sub test()
    Dim LB1&, LB2&, DiM1&, DiM2&
    DiM1 = 0
    DiM2 = 1
    basedemandée = 1
    LB1 = Sgn(basedemandée - DiM1)
    LB2 = (basedemandée - DiM2)

    MsgBox "la nouvelle base du tableau sera" & vbCrLf & _
            "dim1 : " & DiM1 + LB1 & vbCrLf & _
            "dim2 : " & DiM2 + LB2


End Sub
je te jure sur tout ce que j'ai de plus cher dudu2 voila ce que me fait le fichier2/3 fois sur 4 quand tu me le renvoie


c'est un msgbox(pseudo) si pour avoir le benchmark il faut embarquer un autre module on s'en sort plus
le mien est dynamique et auto destructible en bref il n'exsiste qu’éphémèrement
 

jurassic pork

XLDnaute Occasionnel
Hello,
je crois que j'ai trouvé pourquoi les performances se dégradent au fur et à mesure des tests. Cela doit être la variable T2 qui est utilisée pour tous les tests. En utilisant une variable différente pour chaque test :
VB:
Sub test2()
    Dim T2, T3, T4, T5
    Dim tx
    Set bench2 = New cBenchmark
    bench2.Message = True
    tx = InitTable1
    bench2.SubName = "Test des fonction de transposition Patricktoulon / @mapomme / dudu2"
    bench2.Start
    ''texte = "Avant" & vbCrLf & "base dim 1 : " & LBound(tx) & vbCrLf & "base dim 2 : " & LBound(tx, 2) & vbCrLf
    ' MsgBox texte & "Après" & vbCrLf & "base dim 1 : " & LBound(T2) & vbCrLf & "base dim 2 : " & LBound(T2, 2)
    bench2.TrackByName "------ ma pomme ------"
    T2 = TransposeBaseUn(tx) '
    bench2.TrackByName "vba transpose version @mapomme"
    bench2.TrackByName "------ dudu2 -------"
    T3 = TransposeNaturel(tx) '
    bench2.TrackByName "vba transpose version @dudu2"
    bench2.TrackByName "------ job75 -------"
    T4 = TransposeX(tx) '
    bench2.TrackByName "vba transpose version @job75"
    bench2.TrackByName "------ patricktoulon ------"
    T5 = TransposeXV1(tx) 'possibilite de choisir la base en 2d argument
    bench2.TrackByName "vba transpose version patricktoulon"
End Sub
voilà ce que j'obtiens :



Ami calmant, J.P
 

patricktoulon

XLDnaute Barbatruc
serieux toi tu est vraiment de mauvaise fois
regarde dans les ressource mon msgbox perso comment il s'appelle
et tu verra que je l'ai posé facilement 2 ans avant toi et il s'appelle MSgboxX
comme mes fonctions show perso intra userform ShowX

je ne copie rien de toi pour la simple et bonne raison que je ne comprends rien a tes codes
je ne prends pas ce que je comprends pas
je ne regarde que les résultats
par contre toi moi je peux le dire qu'il y a du patricktoulon dans le dudu2 il suffit de regarder nos grande discussions et te voir critiquer ce que je fait et les voir ensuite dans tes ressources tarabiscotée a ta sauce
et pour tout te dire c'est quelqu'un d'autre qui s'en est rendu compte car si ce n'est nos discussions je ne vais même pas voir tes sources sauf si tu m'y invite comme c'est arrivé 2/3 fois

punaise tu es culotté toi vraiment
comme je veux rester poli je vais pas m'éterniser

travaillons plutôt a la résolution
@jurassic pork merci pour ce retour pour le moins étrange
a tu essayé un eraze avant de changer les variable ?
c'est peut être tout simplement une charge mémoire
en premier on part avec t2 vide
au 2d t2 est plein mais on le rechange
et pareil pour la 3 eme

je ne pense pas que ce soit une dégradation (ce serait inquiétant sinon )
 

jurassic pork

XLDnaute Occasionnel
c'est peut être tout simplement une charge mémoire
en premier on part avec t2 vide
au 2d t2 est plein mais on le rechange
et pareil pour la 3 eme

je ne pense pas que ce soit une dégradation (ce serait inquiétant sinon )
Ben non pour la charge mémoire car au contraire on va charger plus la mémoire puisqu'on utilise plus de variables.
Et pour le Erase de la variable comment tu fais ? (pour un objet c'est Set myVar = Nothing mais pour un tableau ? )
 

patricktoulon

XLDnaute Barbatruc
@jurassic pork
non au début avant le premier test, t2 est un simple variant vide
après le premier test t2 est un tableau donc avant de lancer le 2test tu faire un erase t2 et pareil entre le 2 et 3
VB:
Dim bench As cBenchmark

Sub test2()
    Dim tx(1 To 50000, 1 To 100)
    Set bench2 = New cBenchmark
    bench2.Message = True


    bench2.SubName = "Test des fonction de transposition Patrictoulon / @mapomme / dudu2"
    bench2.TrackByName "debut de transposition avec vba transpose version patricktoulon"
    T2 = TransposeXV1(tx) 'possibilite de choisir la base en 2d argument
    bench2.TrackByName "fin de transposition avec vba transpose version patricktoulon"
    ''texte = "Avant" & vbCrLf & "base dim 1 : " & LBound(tx) & vbCrLf & "base dim 2 : " & LBound(tx, 2) & vbCrLf
    ' MsgBox texte & "Après" & vbCrLf & "base dim 1 : " & LBound(T2) & vbCrLf & "base dim 2 : " & LBound(T2, 2)

    Erase T2
    bench2.TrackByName "------------"
    bench2.TrackByName "------------"

    bench2.TrackByName "debut de transposition avec vba transpose version @dudu2"
    T2 = TransposeNaturel(tx) '
    bench2.TrackByName "fin de transposition avec vba transpose version @dudu2"

    bench2.TrackByName "-------------"
    bench2.TrackByName "-------------"
    Erase T2

    bench2.TrackByName "debut de transposition avec vba transpose version @mapomme"
    T2 = TransposeBaseUn(tx) '
    bench2.TrackByName "fin de transposition avec vba transpose version @mapomme"



End Sub
 

Dudu2

XLDnaute Barbatruc
regarde dans les ressource mon msgbox perso comment il s'appelle
et tu verra que je l'ai posé facilement 2 ans avant toi et il s'appelle MSgboxX
Ah oui, tu l'as fait avant moi. OK. Est-que avant ça veut dire meilleur ?

Ton MsgBoboxX est un truc éphémère (où est le bénéfice ?) qui nécessite le droit d'écrire dans le VBE ce que la plupart des gens n'ont pas.

J'ai trouvé un lien de ta "ressource" dans le code https://excel-downloads.com/members/patricktoulon.167882/.
Encore des vidéos. Ouvre un video-club.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Pour info mon dernier fichier de Benchmark. Les tables sont effacées et ré-initialisées avant chaque Benchmark. Les codes sont de la version la plus récente.

Les résultats varient quand même d'exécution en exécution.
La première exécution voit les valeurs diminuer étrangement, puis les suivantes semblent plus représentatives.
 

Pièces jointes

  • Benchmark Compare Transpose Options.xlsm
    170 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
je n'ai pas dis meilleur j'ai dis avant !!! et quoi que
j'ai dis simplement que si il y a copieur ce dont tu m'a accusé le copieur ici c'est toi c'est tout
après je m'en fou comme je te l'ai déjà dit mais ne va pas dire que c'est toi qui a eu l'idée
comme l'idée et réalisation du troti trota dont tu prétends que ce n'est pas suffisant par ce que tu n'a rien compris a la manœuvre et son utilisation et que tu en sort une version abracadabrantesque en disant vous avez vu j'ai corrigé par ce que tu n'a toujours pas compris que avec pointstoscreenpixels la seule donnée juste qu'il donne zoom compris c'est les points 0 a un millième de pixel près si tant est qu'un jour dudu2 heinstein nous sorte une théorie que le pixel est divisible
et cela mêmes si ils sont en négatifs

et la on verra combien de temps tu va la pomper celle la j'archive la discussion(comme toute les autres d'ailleurs) afin que tu ne puisse prétendre le contraire

Ton MsgBoboxX est un truc éphémère (où est le bénéfice ?) qui nécessite le droit d'écrire dans le VBE ce que la plupart des gens n'ont pas.
c'était vrai il y a quelque années ça maintenant fait un sondage tu verra la réponse
de plus pour faire un test benchmark il faut j'enquille un userform et un module c'est pas la peine
avec mon truc tu glisse le benchmark et picé'too
d'autant plus que c'est toi qui me dis ça alors que tu utilise un bataillons d'apis clipboard
les plus dangereuse en VBA faut pas se mentir que tu déplace les allocations etc...
des fois je me demande si tu picole pas un peu
@jurassic pork nous donne un lien vers un truc génial et toi tu lui ajoute un module bardé d'api
et un userform bardé de code
le truc il fait 1 mega ou je ne sais combien alors qu'il n'y a pas une cellule remplie et tu es persuadé que c'est mieux
au moins le très vieux cochon a fait ça sur une plage même si je n'adhère pas mais au moins c'est propre sa sub fait moins de 15 lignes on comprend ce qu'il a fait


mais bon bref j'ai répondu au phénomène qu'a soulevé @jurassic pork j'ai donc fait les tests avec erase (t2) et des variables différentes
les différences entre un lancement et un autre semblent constantes
a ton vraiment les moyen de chopper ces différences de la qualité de T2 des le premier essai je sais pas
qui sait dudu2 heinstein va nous pondre un benchmark2
je vais être honnête j'ai mis plus de 5 heures à le comprendre ce benchmark et encore je ne suis pas sur d'avoir tout compris


ce que je constate dans cet exercice
c'est la version de @mapomme finalement qui est la plus stable même si ce n'est pas la plus rapide il est toujours entre 50 et 100 ms de nos version mais tout le temps sans exception variables fatiguées ou pas
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2 @TooFatBoy @mapomme @p'tit vieux
maintenant changez l'ordre des tests avec dans le message le début et la fin de chaque tests
vous allez comprendre ou le benchmarck fait erreur en regardant uniquement les tics
chez moi ça donne ça
je commence par mes deux versions ensuite @mapomme et on fini par @Dudu2



maintenant je vais commencer par @Dudu2 @mapomme et je finirais avec mes deux versions


maintenant je commence avec @mapomme @mes deux versions et je fini avec @Dudu2
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @jurassic pork , @patricktoulon ,
je crois que j'ai trouvé pourquoi les performances se dégradent au fur et à mesure des tests. Cela doit être la variable T2 qui est utilisée pour tous les tests. En utilisant une variable différente pour chaque test :

maintenant changez l'ordre des tests avec dans le message le début et la fin de chaque tests

C'est rigolo !

Ce qui m'amènerait à la conclusion que pour une mesure de durée, l'incertitude relative est relativement élevée quand on a des temps de l'ordre de la ms et que les sources de cette incertitude relative sont multiples, aléatoires et inconnues de notre point de vue macroscopique.

Et si en source, on prenait une matrice à 50 millions de cellules pour avoir des durées de l'ordre de la seconde ?
En fait, ça ne changerait peut-être pas grand chose car la durée augmentant des phénomènes extérieurs à l'exécution de la macro seraient sans doute plus susceptibles de se produire et influencer le comptage de la durée.
 

patricktoulon

XLDnaute Barbatruc
@mapomme
oui deja ca
mais au départ il démarre pas a zero il compte le gettickcount freg comme point de départ
et comme il fait dans le reportArg les calcul nécessaire (soustraction ) par des fonction intermédiaire ben -0 ca fait zero donc il démarre avec le ticcount cest pour ca que j'ai ajouté un tst avant car la soustraction se fait a partir de l'item 2

maintenant ce matin au calme j'ai regarde le fichier de @Dudu2 et là je vous dit cherchez l'erreur
sa sub test tel quel
VB:
Sub Test()
    Dim Tbl1 As ListObject
    Dim Tbl2 As ListObject
    Dim UBound1 As Long
    Dim UBound2 As Long
    '
    Dim t() As Variant
    Dim tt() As Variant
    Dim iSelectedNames As Integer
    Dim i As Long
    Dim j As Long
    Dim bm As New cBenchmark
   
    'Initializations
    Erase TabSelectedNames
   
    Set Tbl1 = ActiveSheet.ListObjects("Tableau1")
    UBound1 = Tbl1.ListColumns("Valeur").DataBodyRange(1)
    UBound2 = Tbl1.ListColumns("Valeur").DataBodyRange(2)
    '
    Set Tbl2 = ActiveSheet.ListObjects("Tableau2")
   
    GoSub InitTable
   
    GoSub DébutTrackByName
    tt = Application.Transpose(t)
    GoSub FinTrackByName
   
    GoSub InitTable
   
    GoSub DébutTrackByName
    tt = TransposeNaturel(t)
    GoSub FinTrackByName
   
    GoSub InitTable
   
    GoSub DébutTrackByName
    tt = TransposeNaturel(t)
    GoSub FinTrackByName
   
    GoSub InitTable
   
    GoSub DébutTrackByName
    tt = TransposeBaseUn(t)
    GoSub FinTrackByName
 
    Exit Sub
   
InitTable:
    Erase t
    Erase tt
   
    ReDim t(1 To UBound1, 1 To UBound2)
   
    For i = 1 To UBound1
        For j = 1 To UBound2
            t(i, j) = Chr(64 + j) & CStr(i)
        Next j
    Next i
    Return
   
DébutTrackByName:
    iSelectedNames = iSelectedNames + 1
    bm.TrackByName "Début " & Tbl2.ListColumns(1).DataBodyRange(iSelectedNames).Value
    Return
   
FinTrackByName:
    bm.TrackByName "Fin " & Tbl2.ListColumns(1).DataBodyRange(iSelectedNames)
    Call AddToSelectedNames("Fin " & Tbl2.ListColumns(1).DataBodyRange(iSelectedNames).Value)
    Return
End Sub
pour vous aider a trouver l'erreur

si vous trouvez pas je vous dirais
c'est formidable
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…