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:

jurassic pork

XLDnaute Occasionnel
Envoie ta classe, ça m'intéresse.
Je suppose que tu en as fait une Table avant de le placer en feuille.
J'aimerais récupérer le résultat en variable String et Table si possible.
Hello Dudu2,
Ben non , la génération des résultats c'est un peu une usine à gaz , il faut décortiquer le code. Et en plus il sort en délimité longueur fixe.
En pièce jointe le classeur avec le module de classe modifié.
Ami calmant, J.P
 

Pièces jointes

  • TransposeNaturel - Test Compare Benchmark JP.xlsm
    77.7 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
j'oubliais
dans la fonction message il faut appeler la report avant pour compiler les données dans les dicos
et veiller a inscrire dans les dico dans leur fonction respectives (reportArg) avec if exists ou on error resume next avec des goto 0

le msgbox sera trop petit il te faudra alors utiliser un userform dynamico auto destructible
 

Dudu2

XLDnaute Barbatruc
Vous êtes les champions grâce à qui j'ai pu faire ce fichier.
  1. Dans la Classe cBenchmark j'ai taggé les modifs *jp* (qui vaut pour @jurassic pork et pour moi )

  2. Dans le Module_Test, j'ai fait une fonction ShowTrackByNameReport() pour gérer l'affichage du rapport en ayant bénéficié du code de @jurassic pork pour le traitement des colonnes.
 

Pièces jointes

  • Benchmark Compare Transpose Options.xlsm
    162.1 KB · Affichages: 4

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous ,

Je jette un coup d'œil en dilettante à ce post dont les passions suscitées restent pour moi un mystère surtout sur un sujet aussi classique. Comme la pression retombe un peu, j'y vais de ma p'tite version pour souffler sur les braises. Je plaisante bien sûr .

Ça n'a bien sûr rien d'original. D'ailleurs, je ne vois pas comment faire de l'original sur un tel sujet. Le socle de toutes les méthodes étant une double boucle (soit une à deux lignes d'instructions), il me semble que pour la transposition pure, la durée ne dépend que de la vitesse du processeur et des accès mémoire. Je laisse tomber le cas exotique d'un emploi de Application.Transpose dont je me fiche comme de ma première tétine en caoutchouc .

Le transpose que j'utilise renvoie toujours une matrice à deux dimensions de base 1 (directement transférable sur une feuille de calcul) sauf pour les matrices à dimension 3 ou plus pour lesquelles on retourne FALSE.

Pour une matrice 5 000 x 6 000 (soir 30 millions d'éléments), la transposition dure env. 2,5 s si la matrice est vide et 2,7 s si la matrice est remplie d'entiers. Pour la durée, j'ai fait dans le simple. Le code de la fonction Transpose qui n'a rien du tout d'original :
VB:
Function TransposeBaseUn(t, Optional VideParString As Boolean = False)
Dim NbrDim&, x, ni&, i&, nj&, j&

   If TypeName(t) = "Range" Then t = t.Value
   On Error Resume Next
   For i = 1 To Rows.Count: x = LBound(t, i): Next
   NbrDim = i - 1
   On Error GoTo 0

   Select Case NbrDim
      Case 0      ' une valeur pas un tableau
         ReDim r(1 To 1, 1 To 1): r(1, 1) = t: TransposeBaseUn = r: Exit Function
      Case 1      ' tableau à une dimension
         ni = UBound(t, 1) - LBound(t, 1) + 1: ReDim r(1 To ni, 1 To 1)
         For i = 1 To ni: r(i, 1) = t(LBound(t, 1) + i - 1): Next
         TransposeBaseUn = r: Exit Function
      Case 2      ' matrice à 2 dimensions
         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
         TransposeBaseUn = r: Exit Function
      Case Else   ' 3 dimensions ou plus
         TransposeBaseUn = False: Exit Function
   End Select
End Function
 

Pièces jointes

  • mapomme-Transpose-v1.xlsm
    29 KB · Affichages: 4
Dernière édition:

Dudu2

XLDnaute Barbatruc
@mapomme,

Y a un truc qui me sidère dans ton code. Et c'est ça:
VB:
If TypeName(t) = "Range" Then t = t.Value

Comment un argument passé ByRef qui est de type Range peut se transformer en Table ?
Je me suis dit, ça va exploser en vol. Et ben non sur un test !

Je ne sais pas comment Excel traite ça.
Edit: Évidement il génère une table interne. Mais c'est quand même étonnant et malin de sa part.
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
@p'tit vieux,
J'ai fait une micro-modif dans la fonction TransposeNaturel() pour récupérer les dimensions de la table passée en argument, sur le modèle du code de @mapomme que j'avais aussi dans mes vieux cartons. C'est un chouia plus lisible et plus court.

De plus, riche de l'enseignement du code surprenant de @mapomme qui transforme tout de go et par magie un Range en Table, la fonction supporte aussi maintenant un Range en entrée par la même magie.

@mapomme,
Ça ne m'a pas vraiment fait bosser car pour le Benchmark c'était du copier/coller de 4 instructions.
Par contre, en le regardant, j'ai appris quelque chose !
 

Pièces jointes

  • TransposeNaturel.xlsm
    37.4 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
et moi j'ai pris l'option d'un pseudo msgbox dans un userform dynamique auto destructible
j'ai quand même garder la possibilité du debug.print


demonstration
si vous le mettez pas ça ira dans la console sinon vous aurez le message


regardez bien a droite dans l'editeur vba


alors vous préférez quoi ?
 

Pièces jointes

  • 1733755348474.png
    27.3 KB · Affichages: 7
  • 1733755217087.png
    37.1 KB · Affichages: 7
Dernière édition:

patricktoulon

XLDnaute Barbatruc
a ben si ma pomme s'y met alors
je voulais vous la donner vous voyez mais je vois que l'on continu a m'asticoter insidueusement
ben je garde pour moi
j'avais juste changé celle de jurassic pork pour ma version du module cBenchmark
 

Discussions similaires

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