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:

p'tit vieux

XLDnaute Occasionnel
Ouais, sauf qu'il n'y a pas en l'état de réelle symétrie.
Sans paramètre dédié:
t(5) -> t(1/5) => idem Excel
t(1/5) -> t(5/1) => pas idem Excel.

Faudrait-il que je fasse
LikeExcel = False
t(5) -> t(5/1) => pas idem Excel
t(1/5) -> t(5/1) => pas idem Excel.
LikeExcel = True
t(5) -> t(1/5) => idem Excel
t(1/5) -> t(5) => idem Excel.
Ou alors Keep2D = True/False
Si True toujours retourner un tableau 2D.
T(1/5) => T(5,1)
Si False T(1/5) => T(5)

Est ce plus clair/simple?

Ca facilite l’utilisateur de la fonction ...😉
Quid si je veux directement ?
T(5) => T(1/5)
Utile pour la disposition d’un Range.

PS
Désolé mais je suis sur mon téléphone donc très limité. En plus petit écran 😒
 

p'tit vieux

XLDnaute Occasionnel
Tu as raison.
Il faut voir le plus pratique ET logique pour l’utilisateur tout en gardant la possibilité d’y déroger si celui-ci en a besoin exceptionnellement.
Donc mettre les Optionals avec des valeurs par défaut pratique/ logique et aussi performantes que possible
C’est la difficulté de la définition des cahiers des charges applications/fonctions.
Beaucoup de réunions. d’aspirine et autres Doliprane 🤣
J’ai connu
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Finalement, je vais faire ça:
LikeExcel = False (retourne TOUJOURS 2 dimensions)
t(5) -> t(5/1) => pas idem Excel
t(1/5) -> t(5/1) => pas idem Excel.
LikeExcel = True
t(5) -> t(1/5) => idem Excel
t(1/5) -> t(5) => idem Excel.

Il faut voir que sur le principe Excel t(5) -> t(1/5) -> t(5) ne mène à rien, on ne peut pas s'en servir pour les Ranges car on reste en ligne. On ne peut pas passer de ligne en colonne et réciproquement. C'est pour ça qu'il faut des fonctions utilisateurs de Transpose.
 

jurassic pork

XLDnaute Occasionnel
Hello,
une petite parenthèse concernant le problème de mesure des temps d'exécution car j'ai pensé à un truc concernant ce problème. Dans les processeurs modernes l'horloge des cores des CPU n'est souvent pas fixe et il y a aussi des mémoires cache de plusieurs niveaux plus rapides que la mémoire normale :

CpuInfos.gif


CpuClock.gif


Ami calmant, J.P
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour jurrasic pork
bien sur
oui mais de là a repositionner l'ordre du plus rapide au plus lent
dans un ordre différent si on change l'ordre des tests avec une différence de (de 25% à 35%) il y a un blème
que le premier test bénéficie de la charge minimale je peux le comprendre mais quand on regarde entre 2 au milieu des test on vois bien que c'est incohérent
si c’était une différence de 1 à 5% je dis pas mais la c'est énorme à cette échelle
 

Dudu2

XLDnaute Barbatruc
Bonjour à tous,
Je me suis bien mélangé les pinceaux sur le comportement de WorksheetFunction.Transpose() par manque de vérification !
t(n) -> t(n, 1)
t(n, 1) -> t(n)
Ce qui est assez logique car t(n) et t(1, n) c'est la même chose en terme de Range, c'est 1 ligne.
Donc il ne fait jamais de t(1, n).
Faut donc que j'adapte.
 

Pièces jointes

  • Classeur1.xlsm
    20.3 KB · Affichages: 1
Dernière édition:

p'tit vieux

XLDnaute Occasionnel
Bonjour à tous,
Je me suis bien mélangé les pinceaux sur le comportement de WorksheetFunction.Transpose() par manque de vérification !
t(n) -> t(n, 1)
t(n, 1) -> t(n)
Ce qui est assez logique car t(n) et t(1, n) c'est la même chose en terme de Range, c'est 1 ligne.
Donc il ne fait jamais de t(1, n).
Faut donc que j'adapte.
Oui c'erst ce que j'ai posté Poste #8 ICI
Ici pour un tableau 1D:
image_2024-12-13_133228590.png


Là pour une simple chaine:
1734093459913.png
 

Pièces jointes

  • image_2024-12-13_133643502.png
    image_2024-12-13_133643502.png
    20.3 KB · Affichages: 0

Dudu2

XLDnaute Barbatruc
Le WorksheetFunction.Transpose() a 2 spécificités:
- t(n, 1) -> t(n)
- Les LBounds de la table transposée sont toujours à 1: t(0-2, 0-3) -> t(1-4, 1-3)

Après moult essais infructueux, voici la fonction de Transposition qui possède un paramètres LikeExcel qui doit respecter ces 2 spécificités.
VB:
'----------------------------------------------------------------------------------
'Transpose qui lève la limite de 65535 items de Excel WorksheetFunction.Transpose()
'
'2 options de transposition sont possibles grâce au paramètre LikeExcel (voir ci-dessous)
'- Transposer selon les mêmes règles que Excel WorksheetFunction.Transpose()
'- Transposer pour toujours obtenir une table transposée à 2 dimensions et ajuster les LBounds de la table transposée
'  Dans le code VBA, cela permet de ne pas se poser de question sur le nombre d'indices toujours à 2 t(x, y) de la table transposée
'
'- t            : Range ou Table à 1 ou 2 dimensions ou une valeur
'
'- BaseOut1     : Optionnel - 0 ou 1 ou autre valeur selon le LBound souhaitée de la 1ère dimension de la table transposée
'                 Par défaut: xlNone pour utiliser le LBound de la 2ème dimension de la table t
'                 Si LikeExcel = True, ce paramètre est ignoré, le LBound sera toujours 1
'
'- BaseOut2     : Optionnel - 0 ou 1 ou autre valeur selon le LBound souhaitée de la 2ème dimension de la table transposée
'                 Par défaut: xlNone pour utiliser le LBound de la 1ère dimension de la table t
'                 Si LikeExcel = True, ce paramètre est ignoré, le LBound sera toujours 1
'
'- LikeExcel    : Optionel - True pour que la transposition applique les mêmes règles que Excel WorksheetFunction.Transpose()
'                 True:  t(n) -> t(n, 1) et t(n, 1) -> t(n)
'                        t(0-2, 0-3) -> t(1-4, 1-3)
'                 False: t(n) -> t(n, 1) et t(n, 1) -> t(1, n)
'                        t(0-2, 0-3) -> t(0-3, 0-2) sauf si BaseOut1 et/ou BaseOut2 ont été spécifiés pour définir les LBounds
'                 Par défaut: False
'
'- Return       : Table à 1 ou 2 dimensions transposée de t
'----------------------------------------------------------------------------------
 

Pièces jointes

  • TransposeNaturel.xlsm
    46.9 KB · Affichages: 1

p'tit vieux

XLDnaute Occasionnel
Bonjour @Dudu2
Je suis en train de voir ton fichier #189
Juste une ptite chose à rajouter:
VB:
'    On ne sait pas traiter plus d'une zone par plage (Areas.count)
      If t.Areas.Count < 0 Then
        'Si une erreur se produit sur cette instruction c'est qu'une cellule du Range est en erreur.
        'L'erreur #6 (Dépassement de capacité) est fréquente dans des cellules en format Date contenant un nombre non convertible en date.
        t = t.Value
      Else
        MsgBox "Transpose() can only process ONLY ONE AREA's RANGE"
        Exit Function
      End If
    End If

Je télécharge ton nouveau fichier et continue.
GOOD JOB
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

On peut noter que pour un tableau à deux dimensions devant être transféré sur une feuille excel, les indices sont quelconques et ne commencent pas forcément à 1 et donc on peut se passer de la modification des indices. Le code suivant marche très bien :
VB:
Sub test()
Dim t(-1 To 2, 0 To 3), i&, j&
   For i = -1 To 2: For j = 0 To 3: t(i, j) = i & ";" & j: Next j, i
   [a1].Resize(UBound(t) - LBound(t) + 1, UBound(t, 2) - LBound(t, 2) + 1) = t
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 062
Messages
2 115 845
Membres
112 595
dernier inscrit
Jav33