Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Comment trier Aphlanumériquement un Scripting.Dictionary

8 réponses
Avatar
Emile63
Bonjour =E0 tous,

La macro ci-dessous me g=E9n=E8re sur une feuille s=E9par=E9e du classeur 5=
listes r=E9capitulatives et sans doublons, puis=E9es sur une grande base d=
e de donn=E9e (Feuil1) tr=E8s r=E9p=E9titives (Certaines colonnes sont num=
=E9riques, d'autres alphab=E9tiques, et d'autres alphanum=E9riques). Je sou=
haiterais les trier avant de les afficher mais je bute avec =E7a.
Si quelqu'un pouvait me donner un coup de main. :-)
De plus, je vois bien que mon code est plut=F4t chaotique, et pourrait sans=
doute =EAtre affin=E9. L=E0 encore, je suis ouvert =E0 toutes propositions=
permettant de gagner en efficacit=E9.

'-------------------------------------
Sub Lister()
' Insertion des diff=E9rents enregistrements, et tri alphanum=E9rique
Dim MyArray(0 To 5) As String, Col$, x%, y%, i%, Z%

'On Error Resume Next
MyArray(0) =3D "C"
MyArray(1) =3D "D"
MyArray(2) =3D "E"
MyArray(3) =3D "F"
MyArray(4) =3D "G"

i =3D 1 'Boucle sur les 5 colonnes C,D,E,F
x =3D 0 'Item de la colonne
y =3D 1 'Colonne cible de la Feuil6 (Avec une col. vide entre-deux)
Z =3D 3 'N=B0 de la colonne ou il faut compter le NB d'items

For i =3D 1 To 5
Feuil1.Activate
Col =3D MyArray(x)
Liste =3D Feuil1.Range(Col & "5").Address(RowAbsolute:=3DFalse, ColumnA=
bsolute:=3DFalse)
Set a =3D Feuil1.Range(Liste, Cells(Rows.Count, Z).End(xlUp))
Set MonDico =3D CreateObject("Scripting.Dictionary")
For Each C In a
If Not MonDico.Exists(C.Value) Then MonDico.Add C.Value, C.Va=
lue
Next C
Feuil6.Activate
With ActiveSheet
.Cells(1, y).Select
.Cells(1, y).Resize(MonDico.Count, 1) =3D Applicati=
on.Transpose(MonDico.keys)
End With
Nom_Ent=EAte =3D ActiveCell.Value
Set MaSelection =3D ActiveCell.CurrentRegion
MaSelection.Offset(1, 0).Resize(MaSelection.Rows.Count - 1,=
MaSelection.Columns.Count).Select
Set MaSelection =3D Selection
MaSelection.Name =3D Nom_Ent=EAte
MonDico.RemoveAll
Set MonDico =3D Nothing
x =3D x + 1
y =3D y + 2
Z =3D Z + 1
Next
End Sub

'-------------------------------------

Je vous remercie d'avance pour votre aide et conseils. :-)
Cordialement,
Emile

8 réponses

Avatar
MichD
Bonjour,

Adapte le nom des feuilles.

P.S. Décrire ton problème au complet sans tenir compte
de la procédure que tu soumets est une excellente habitude
à prendre.

'---------------------------------------------
Sub MichD()
Dim A As Long, B As Long, DerLig As Long
Dim FD As Worksheet, FS As Worksheet, Rg As Range

Set FD = Worksheets("Feuil1") 'Feuille des données
Set FS = Worksheets("Feuil2") 'Feuille résultat

Application.ScreenUpdating = False
Application.ScreenUpdating = False

'Vide la feuille de résultat
FS.Cells.Clear

With FD
With .Range("C:G")
DerLig = .Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
For A = 3 To 7 'Colonne C à E
Set Rg = FD.Range(FD.Cells(5, A), FD.Cells(DerLig, A))
Rg.AdvancedFilter xlFilterCopy, , FS.Range("A1").Offset(,
B), True
With FS.Range("A1").Offset(, B).EntireColumn
.Sort Key1:=FS.Range("A1").Offset(, B),
order1:=xlDescending, Header:=xlNo
End With
B = B + 1
Next
End With
End With
Application.ScreenUpdating = True
Application.ScreenUpdating = True

End Sub
'---------------------------------------------




MichD
---------------------------------------------------------------
"Emile63" a écrit dans le message de groupe de discussion :


Bonjour à tous,

La macro ci-dessous me génère sur une feuille séparée du classeur 5 listes
récapitulatives et sans doublons, puisées sur une grande base de de donnée
(Feuil1) très répétitives (Certaines colonnes sont numériques, d'autres
alphabétiques, et d'autres alphanumériques). Je souhaiterais les trier avant
de les afficher mais je bute avec ça.
Si quelqu'un pouvait me donner un coup de main. :-)
De plus, je vois bien que mon code est plutôt chaotique, et pourrait sans
doute être affiné. Là encore, je suis ouvert à toutes propositions
permettant de gagner en efficacité.

'-------------------------------------
Sub Lister()
' Insertion des différents enregistrements, et tri alphanumérique
Dim MyArray(0 To 5) As String, Col$, x%, y%, i%, Z%

'On Error Resume Next
MyArray(0) = "C"
MyArray(1) = "D"
MyArray(2) = "E"
MyArray(3) = "F"
MyArray(4) = "G"

i = 1 'Boucle sur les 5 colonnes C,D,E,F
x = 0 'Item de la colonne
y = 1 'Colonne cible de la Feuil6 (Avec une col. vide entre-deux)
Z = 3 'N° de la colonne ou il faut compter le NB d'items

For i = 1 To 5
Feuil1.Activate
Col = MyArray(x)
Liste = Feuil1.Range(Col & "5").Address(RowAbsolute:úlse,
ColumnAbsolute:úlse)
Set a = Feuil1.Range(Liste, Cells(Rows.Count, Z).End(xlUp))
Set MonDico = CreateObject("Scripting.Dictionary")
For Each C In a
If Not MonDico.Exists(C.Value) Then MonDico.Add C.Value,
C.Value
Next C
Feuil6.Activate
With ActiveSheet
.Cells(1, y).Select
.Cells(1, y).Resize(MonDico.Count, 1) =
Application.Transpose(MonDico.keys)
End With
Nom_Entête = ActiveCell.Value
Set MaSelection = ActiveCell.CurrentRegion
MaSelection.Offset(1, 0).Resize(MaSelection.Rows.Count - 1,
MaSelection.Columns.Count).Select
Set MaSelection = Selection
MaSelection.Name = Nom_Entête
MonDico.RemoveAll
Set MonDico = Nothing
x = x + 1
y = y + 2
Z = Z + 1
Next
End Sub

'-------------------------------------

Je vous remercie d'avance pour votre aide et conseils. :-)
Cordialement,
Emile
Avatar
Emile63
Bonjour à tous,
Et merci MichD pour ton aide et ta solution.
C'est bien plus simple que le tortueux code que j'avais entrepris :-)
Dans ton exemple, j'ai un petit soucis avec le titre de colonne, qui se m élange avec les données (tri), et d'autre part, je souhaite nommer les plages du même nom que le titre de leur colonne respectives.
D'autre part, est-ce qu'il y a une raison pour que les lignes:
Application.ScreenUpdating
soient doublées?
Encore merci pour ton support, en te souhaitant une très bonne journée.
Emile
Avatar
Emile63
MichD, Je souhaitais encore te demander s'il est possible de ne copier que les valeurs et pas les formats.
Merci pour ta sollicitude,
Cordialement,
Emile
Avatar
Fredo P.
Bonjour Emile

D'autre part, est-ce qu'il y a une raison pour que les lignes:
Application.ScreenUpdating
soient doublées?
§§Oui cela m'intéresse aussi
Avatar
MichD
'-------------------------------------------------
Sub MichD()
Dim A As Long, B As Long, DerLig As Long
Dim FD As Worksheet, FS As Worksheet, Rg As Range

Set FD = Worksheets("Feuil1") 'Feuille des données
Set FS = Worksheets("Feuil2") 'Feuille résultat

Application.ScreenUpdating = False
Application.ScreenUpdating = False

'Vide la feuille de résultat
FS.Cells.Clear

With FD
With .Range("C:G")
DerLig = .Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
For A = 3 To 7 'Colonne C à E
Set Rg = FD.Range(FD.Cells(5, A), FD.Cells(DerLig, A))
Rg.AdvancedFilter xlFilterCopy, , FS.Range("A1").Offset(,
B), True
With FS.Range("A1")
With .Offset(, B).EntireColumn
.Sort Key1:=FS.Range("A1").Offset(, B), _
order1:=xlAscending, Header:=xlYes
.ClearFormats
End With
.Offset(, B).Resize(DerLig).Name = .Offset(, B).Value
B = B + 1
End With
Next
End With
End With
Application.ScreenUpdating = True
Application.ScreenUpdating = True

End Sub
'------------------------------------------------

MichD
---------------------------------------------------------------
Avatar
MichD
Dans la procédure, corrige cette ligne de code :

.Offset(, B).Resize(DerLig).Name = .Offset(, B).Value

Par

.Offset(, B).Resize(.CurrentRegion.Rows.Count).Name = .Offset(, B).Value

MichD
---------------------------------------------------------------
Avatar
MichD
Dans le cas où dans la plage de la feuille résultat, le nombre de
lignes de chacune des colonnes est différentes...

'---------------------------------------------------------------------
Sub MichD()
Dim A As Long, B As Long, DerLig As Long, Ligne As Long
Dim FD As Worksheet, FS As Worksheet, Rg As Range


Set FD = Worksheets("Feuil1") 'Feuille des données
Set FS = Worksheets("Feuil2") 'Feuille résultat

Application.ScreenUpdating = False
Application.ScreenUpdating = False

'Vide la feuille de résultat
FS.Cells.Clear

With FD
With .Range("C:G")
DerLig = .Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
For A = 3 To 7 'Colonne C à E
Set Rg = FD.Range(FD.Cells(5, A), FD.Cells(DerLig, A))
Rg.AdvancedFilter xlFilterCopy, , FS.Range("A1").Offset(,
B), True
With FS.Range("A1")
With .Offset(, B)
Ligne = .Cells(Rows.Count, 1).End(xlUp).Row
End With
With .Offset(, B).EntireColumn
.Sort Key1:=FS.Range("A1").Offset(, B), _
order1:=xlAscending, Header:=xlYes
.ClearFormats
End With
.Offset(, B).Resize(Ligne).Name = .Offset(, B).Value
B = B + 1
End With
Next
End With
End With
Application.ScreenUpdating = True
Application.ScreenUpdating = True

End Sub
'---------------------------------------------------------------------




MichD
---------------------------------------------------------------
"MichD" a écrit dans le message de groupe de discussion :
n2kadj$428$


'-------------------------------------------------
Sub MichD()
Dim A As Long, B As Long, DerLig As Long
Dim FD As Worksheet, FS As Worksheet, Rg As Range

Set FD = Worksheets("Feuil1") 'Feuille des données
Set FS = Worksheets("Feuil2") 'Feuille résultat

Application.ScreenUpdating = False
Application.ScreenUpdating = False

'Vide la feuille de résultat
FS.Cells.Clear

With FD
With .Range("C:G")
DerLig = .Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
For A = 3 To 7 'Colonne C à E
Set Rg = FD.Range(FD.Cells(5, A), FD.Cells(DerLig, A))
Rg.AdvancedFilter xlFilterCopy, , FS.Range("A1").Offset(,
B), True
With FS.Range("A1")
With .Offset(, B).EntireColumn
.Sort Key1:=FS.Range("A1").Offset(, B), _
order1:=xlAscending, Header:=xlYes
.ClearFormats
End With
.Offset(, B).Resize(DerLig).Name = .Offset(, B).Value
B = B + 1
End With
Next
End With
End With
Application.ScreenUpdating = True
Application.ScreenUpdating = True

End Sub
'------------------------------------------------

MichD
---------------------------------------------------------------
Avatar
Emile63
Bonsoir à tous,

Merci MichD pour ton aide et pour ta proposition.
Après un petite adaptation, elle fonctionne pile-poils
encore merci et bonne soirée.

Cordialement,
Emile