[Réglé par DRANREB] Tri sur deux colonnes

Webperegrino

XLDnaute Impliqué
Supporter XLD
Bonjour Le Forum,

En feuille 1 j’ai collé le tableau JK en colonne A avant d’activer la macro1 qui me pose souci en sa partie finale.

Deux colonnes sont à ordonner, sans doublons, en ordre croissant, à partir des valeurs de la colonne A.
J’arrive bien à ordonner sans doublons cette colonne.
J’ai essayé de faire un tableau des valeurs en VB dans la macro mais je m'y perds...
Je bloque dans la constitution de la dernière partie :
- comment avoir les valeurs voisines en colonne B, fidèles à celles du tableau de départ de droite.
- Pouvez-vous m’aider en y mettant les indications pour que la programmation me soit compréhensible ?
(Je me suis inspiré de la macro qui est en feuille 2.)
Merci,
Rien d'urgent pour votre réponse,
Webperegrino
 

Pièces jointes

  • TRI sur deux colonnes.xls
    58.5 KB · Affichages: 39
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Tri sur deux colonnes

Bonsoir.

Au lieu de faire :
For Each c In A: d(c) = "": Next c
Pourquoi ne feriez vous pas :
VB:
For Each c In A: d(c.Value) = c.Offset(, 1).Value: Next c
Et récupérer d.Items dans la colonne d'à coté comme vous récupérez d.Keys dans la 1ère.

Mais quitte à faire des tris en plus après ça, vous vous casseriez bien moins la tête avec ma fonction GroupOrg !
La Macro2, par exemple, s'écrirait comme ça :
VB:
Sub Macro2()
Dim Plg As Range, T(), Src As SsGroup, L As Long
Set Plg = ColUti(Feuil2.[A3:B3])
ReDim T(1 To Plg.Rows.Count, 1 To 2)
For Each Src In GroupOrg(Plg, 1)
   L = L + 1: T(L, 1) = Src.Id: T(L, 2) = Src.Contenu(1)(2)
   Next Src
Feuil2.[A3:B3].Resize(UBound(T)).Value = T
End Sub
 

Pièces jointes

  • GrpOrgWebperegrino.xls
    168.5 KB · Affichages: 46
Dernière édition:

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Tri sur deux colonnes

Bonjour Le Forum,
Bonjour Dranreb,
Cette fonction est en effet miraculeuse pour moi.
Cette solution est très efficace, je vais appliquer mais tout d'abord l'étudier dans le détail.

Je vais aussi essayer de développer l'autre approche avec votre proposition (plus lourde) du "For Each".
C'est pour réussir à utiliser la mise en 'Tablo', traiter, récupérer le résultat et le placer car je veux aussi me perfectionner dans l'usage des tableaux à variables sous VBA.
Merci
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Tri sur deux colonnes

Le Forum,
Dranreb,
Votre fonction "GroupOrg" peut-elle être aussi adaptée pour le même travail :
- mais en se limitant, en macro 3, par exemple M à un pavé M3:N26,
- au lieu de travailler sur toute la verticale de ces deux colonnes ?
Ce sera ma dernière question sur cette discussion.
Merci.
Webperegrino
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Tri sur deux colonnes

Dranreb, c'est génial !
VB:
Sub Macro3()
Dim Plg As Range, T(), Src As SsGroup, L As Long
Set Plg = ColUti(Feuil2.[M3:N3])
ReDim T(1 To 26, 1 To 2)
For Each Src In GroupOrg(Plg, 1)
   L = L + 1: T(L, 1) = Src.Id: T(L, 2) = Src.Contenu(1)(2)
   Next Src
ValPlgAju(Plg, L) = T
'ou Feuil2.[M3:N3].Resize(UBound(T)).Value = T
End Sub
Webperegrino
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Tri sur deux colonnes

Bonjour Le Forum,
Depuis ce matin j'essaie de transférer de façon identique (même endroit, même dénomination ) les nouveaux modules dans mon vrai fichier de plus de 10 Mo, mais à chaque fois j'ai ceci :

'Erreur de compilation Type défini par l'utilisateur non défini
avec arrêt sur la ligne
VB:
Function DicInvent(ByVal PlageOuTableau, Optional ByVal ColOrd As Long = 1, Optional ByVal ColDép As Long = 1) As Dictionary

J'ai pourtant bien placé Mclassement et Utilit dans Modules, ainsi que GsGroup et Table Index dans Modules de classe
Je persévère au cours de la semaine (je veux trouver moi-même ce qui coince) et reviens vers vous.
Bon week-end
Webperegrino
 

Dranreb

XLDnaute Barbatruc
Re : Tri sur deux colonnes

Un indice quand même: observez les références cochées dans la liste Références disponibles, menu Outils, Références des deux classeurs.
Mais je vais quand même ajouter désormais ces deux lignes de commentaires derrière ceux qui décrivent cette fonction DicInvent :
' Attention: cette procédure exige que "Microsoft Scripting Runtime" soit coché dans la liste Références disponibles,
' menus Outils, Références…
sauf que la référence en question n'y sera pas masquée bien entendue. Là c'est pour ne pas vous gâcher le plaisir de trouver vous même.
 

Lone-wolf

XLDnaute Barbatruc
Re : Tri sur deux colonnes

Bonjour Webperegrino, Dranreb

@ Webperegrino: Un autre façon de faire suite au 1er message.


Code:
Option Explicit

Sub SupprDoubEtTri()                                  'Exemple de Jacques Boisgontier
Dim Mondico As Object, Wks As Worksheet
Dim PlageJ As Variant, x As Long, Lig As Long
Dim c, cel, ColA, Plage As Range, 

  Set Wks = Sheets(1)
  Set Mondico = CreateObject("Scripting.Dictionary")
  PlageJ = Range(Wks.[j3], Wks.[j65000].End(xlUp)).Value
  For Each c In PlageJ
  Mondico(c) = ""
  Next c
  Set ColA = Wks.Range("a3")
  ColA.Resize(Mondico.Count, 1) = Application.Transpose(Mondico.Keys)
  ColA.Resize(Mondico.Count, 1).Sort Key1:=ColA, Order1:=xlAscending
    Set Mondico = Nothing
    
    
    With Wks                                                         'Et j'ai rajouté ceci
    Lig = .Range("a" & Rows.Count).End(xlUp).Row
    If .Range("a" & Lig).Value <> "" Then
Set plage = .Range("j3:k" & Lig)
For x = 3 To Lig
Set cel = plage.Find(.Cells(x, 1).Value, , xlValues, xlWhole)
  If Not cel Is Nothing Then
  .Cells(x, 2).Value = cel.Offset(0, 1).Value
  End If
Next x
  End If
End With
End Sub

Voir fichier joint testé (EXCEL 2010)



A+:cool:
 

Pièces jointes

  • Classeur2x.xls
    32.5 KB · Affichages: 57
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Tri sur deux colonnes

En fait il n'y a absolument aucun avantage, que des inconvénients (dont il est vrai que le principal est microscopique) à se priver de la bibliothèque Scripting. Surtout qu'elle est minuscule: environ 150ko, contre 1Mo pour la MSForms, 2,5Mo pour la VBA et pas loin de 10Mo pour la Excel ! Alors cessez une bonne fois pour toutes d'utiliser les Dictionary à travers des variables déclarées As Object et initialisées par CreateObject, tout le monde le fait mais c'est une grosse ânerie !
Pour moi un Dictionary c'est fait pour retrouver des informations, pas les adresses de méthodes et propriétés de l'objet Dictionary dont les noms sont cherchés dans des tables au moment de l'exécution ! À bas les liaisons tardives, vive les liaisons anticipées !
Pareil pour le FileSystemObject et les objets et collections Drive, Drives, Folder, Folders, File, Files et TextStream. Tout ceux là sont dans cette même biblothèque Scripting et n'ont jamais besoin de CreateObject pour être créés.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Tri sur deux colonnes

Bonjour à tous

[aparté]
Merci Dranreb pour ce petit rappel qui m'a fait relire ma Bible
Ce lien n'existe plus
Et mea culpa car souvent dans mes réponses sur XLD, je commets le péché avec la Créature Objet ;)

NB: Dans mon cas, c'était souvent pour ne pas se soucier si l'utilisateur à cocher ou pas les références idoines
[/aparté]
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Tri sur deux colonnes

Bonjour Le Forum,
Bonjour Dranreb,
Dranreb,
Dans mon fichier réel de près de 10 Mo j’ai correctement placé vos derniers codes Vba.
J'ai bien pris soin de cocher aux bons endroits les particularités dans Outils-Références.
Vos codes y demeurent malheureusement récalcitrants.
"La béchamel » de cette belle codification est encore très complexe pour moi et je ne vois pas où ça ne "prend pas".
Puis-je vous l'adresser directement sur votre mail, exceptionnellement en dehors du Forum qui ne peut accepter sa compression en fichier .rar de 1 200 ko ou.zip de 700 ko (à votre convenance) par un lien placé sur le site CIJOINT.COM en privé pour vous ?
Vous me seriez d’un grand secours car je ne sais plus comment faire.
Vos codes seraient en effet plus efficaces que mon simple =NB.SI($F$2:$F$40;F2)>1 placé en cellule F2 …
Cordialement,
Webperegrino
 

Dranreb

XLDnaute Barbatruc
Re : Tri sur deux colonnes

Bonjour.

Essayons d'abord de faire autrement, voulez vous ?
Si à présent le type Dictionary est bien défini par la bibliothèque Scripting, mise en ligne grâce à la coche de la référence "Microsoft Scripting Runtime", qu'est ce qui coince encore exactement à présent. Problème de compilation, ou d'exécution ?
 

Webperegrino

XLDnaute Impliqué
Supporter XLD
Re : Tri sur deux colonnes

Le Forum, Dranreb,
Merci de me répondre,

MSRuntime avait déjà été coché (voir image ci-jointe).
Ensuite, annonce d'un problème de compilation.

Si je ne rajoute pas ceci dans mon Sub TRIA() placé dans Feuil18 :

'Je suis obligé de placer ceci : 1 + 2 + 3 :
Dim ValPlgAju '1
Dim ColUti '2
Dim GroupOrg '3

... j'ai alors 3 errreurs de compilation "nom ambigu détecté, en Feuil18 (Code) :
ColUti sur ligne Set Plg=ColUti(Feuil18.[F2:G2]
et
ValPlgAju(Plg,L)=T

et dans MClassement, dans Function GroupOrg(Byval...)
nom ambigu détecté :
TDon=PlgUti(PlageouTableau).Value

Enfin, avec les 3 Dim ajoutés, la macro semble vouloir fonctionner du début jusqu'à la fin (j'ai placé un MsgBox d'annonce de début de macro, un msgbox d'arrivée en fin de macro).
Toutefois, le tri atttendu par vos codes ne se fait pas.
En effet les doublons restent dans les colonnes F:G, I:J et T:U où vos commandes devaient œuvrer.

Cordialement,
Webperegrino
 

Pièces jointes

  • MSRuntime déjà cochée.jpg
    MSRuntime déjà cochée.jpg
    13.9 KB · Affichages: 32

Discussions similaires

Réponses
6
Affichages
217

Statistiques des forums

Discussions
312 023
Messages
2 084 715
Membres
102 637
dernier inscrit
TOTO33000