Application.Transpose recopie des valeurs erronées
Bonjour,
en réponse au fil suivant https://forum.excel-pratique.com/excel/dedoublonner-par-ligne-t39774.html, j'utilise le dictionnaire pour trier les valeurs uniques (enregistrées en keys) et souhaite les recopier par la fonction Application.Transpose.
Application.Transpose recopie le nombre exact de valeurs uniques dans ma ligne mais la valeur recopiée est toujours la même !
il faut que je passe par une boucle pour avoir les résultats corrects.
Afin de mieux comprendre le problème, désactivez tour à tour les lignes (celle que je souhaite utiliser mais qui me donne un résultat faux)
Cells(a, 2).Resize(1, Dico.Count) = Application.Transpose(Dico.Keys)et (dont le résultat est correct)
.Cells(a, i + 2) = m(i)pour constater la différence.
Merci d'avance
Salut Game Over
Tu mets l'instruction
Set Dico = CreateObject("scripting.dictionary")dans ta boucle, ce qui fait que le dico est réinitialisé à zéro à chaque passage
Ensuite tu n'ajoutes pas tes valeurs au Dico
Dico.Add Clé, ElementA verifier
Salut Bruno, et merci pour ta contribution
BrunoM45 a écrit :dans ta boucle, ce qui fait que le dico est réinitialisé à zéro à chaque passage
Oui, on a besoin de cette réinitialisation à chaque passage, autrement, une valeur déjà utilisée dans une ligne supérieure ne serait plus reconnue dans les lignes suivantes... et cette réinitialisation rend "Set Dico = Nothing" inutile, du coup.
BrunoM45 a écrit :Ensuite tu n'ajoutes pas tes valeurs au Dico
Dico.Add Clé, Element
Si, je les rajoute (sinon, ma boucle ne me permettrait pas d'avoir les valeurs exactes), j'utilise simplement une version contractée de la syntaxe que tu cites.
Le problème ne se situe pas au niveau du dictionnaire mais d'Application.Transpose... je ne vois vraiment pas où je me plante !
Bonjour
Bonjour BrunoM45
A voir
Je crée une seule fois l'objet "Dictionary" que j'efface à chaque passage Dico.RemoveAll
Ensuite pour écrire le résultat en ligne pas de Transpose
Re,
Sinon Game Over, sans ton code il suffit d'enlever le "1" du resize
Cells(a, 2).Resize(, Dico.Count) = Dico.KeysA+
@Banzai, bonjour et merci...
grace à ta proposition, je confirme que c'est bien application.transpose qui pose problème... paradoxalement, la fonction donne les bons résultats lorsqu'on demande un affichage vertical... mystère ! où est ce juste parce que transpose est censé recopier dans le sens inverse dans lequel il enregistre les informations ?! j'en suis pas convaincu.
@Bruno, tu as absolument raison, on peut contracter l'écriture du resize... disons que l'écriture que j'utilise est plus parlante pour moi.
Merci à tous les deux.
Bonjour
Transpose ne fait que ce l'on lui demande
Game Over a écrit :où est ce juste parce que transpose est censé recopier dans le sens inverse dans lequel il enregistre les informations ?!
Je dirais que Tanspose permute les dimensions et les données (les lignes deviennent colonnes et vice et versa) du tableau
Comme fait le collage spécial ---> Transpose
Supposition gratuite (mais me convient) Le tableau crée par l'objet "Dictionary" est un tableau à 1 ligne et à x colonnes
Re,
Game Over a écrit :@Bruno, tu as absolument raison, on peut contracter l'écriture du resize... disons que l'écriture que j'utilise est plus parlante pour moi.
Ce n'est pas une contraction souhaitée de ma part, c'est une obligation VBA pour que transpose fonctionne comme souhaitée
Comme ton Dico ne fait qu'une ligne, tu n'as pas à la redimensionner
Voili, voilà
BrunoM45 a écrit :Ce n'est pas une contraction souhaitée de ma part, c'est une obligation VBA pour que transpose fonctionne comme souhaitée
Comme ton Dico ne fait qu'une ligne, tu n'as pas à la redimensionner
Pour info, je viens de vérifier ta syntaxe; et cela ne fait aucune différence... la transposition se fait toujours de façon erronée.
Je retiens donc qu'il faut supprimer application.transpose et ne garder que dico.keys pour obtenir le résultat souahaité.
Re,
Je persiste et signe, voici le résultat avec le code
With Sheets("Supp Doublons")
derLig = .Range("A" & Rows.Count).End(xlUp).Row
For a = 2 To derLig
Set Dico = CreateObject("scripting.dictionary")
derCol = .Cells(a, Columns.Count).End(xlToLeft).Column
For b = 2 To derCol
aa = .Cells(a, b).Value
If Not Dico.Exists(aa) And aa <> "" Then
Dico.Add aa, aa
End If
Next b
.Range(.Cells(a, 2), .Cells(a, derCol)).ClearContents
Cells(a, 2).Resize(, Dico.Count) = Dico.Keys
'écrit la première valeur le nombre de fois qu'il y a de valeurs différentes
Set Dico = Nothing
'********************************************
Next a
.Shapes("Button 1").Delete
End WithIl ne me semble pas que ce résultat soit éronné !?
A+
certes, mais cela marche aussi comme cela
Cells(a, 2).Resize(1, Dico.Count) = Dico.Keysor l'objectif était d'avoir le code suivant valide
Cells(a, 2).Resize(, Dico.Count) = Application.Transpose(Dico.Keys)et là, tu constateras que le code ne produit pas le résultat espéré... vois-tu où je veux en venir ?
Pour ceux que ça intéresse, Application.Transpose semble ne fonctionner que dans le sens inverse du sens dans lequel l'information à retranscrire est récupérée.
Autrement dit, si je demande à transposer une ligne, alors, la transposition n'affichera de résultat correct si elle se fait dans verticalement dans une colonne et vice versa.
exemple
Sub pb_Transpose()
aa = Range("A1:D1") 'récupération horizontale
Z = Application.CountA(aa)
Cells(1, 8).Resize(Z, 1) = Application.Transpose(aa) 'affichage vertical => correct
Cells(1, 8).Resize(1, Z) = Application.Transpose(aa) 'affichage horizontal => faux
aa = Range("A1:A5")
Z = Application.CountA(aa) 'récupération verticale
Cells(16, 8).Resize(Z, 1) = Application.Transpose(aa) 'affichage vertical => Faux
Cells(16, 8).Resize(1, Z) = Application.Transpose(aa) 'affichage horizontal => correct
End Sub
Re,
Game Over a écrit :Pour ceux que ça intéresse, Application.Transpose semble ne fonctionner que dans le sens inverse du sens dans lequel l'information à retranscrire est récupérée.
Et d'après toi pourquoi ça s'appelle transpose
Je comprends mieux maintenant, nous n'étions pas sur la même voie