Liste sans doublon récupérée dans un autre dossier excel [Résolu/Fermé]

Signaler
Messages postés
37
Date d'inscription
mercredi 9 octobre 2013
Statut
Membre
Dernière intervention
5 avril 2018
-
Messages postés
1411
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
18 décembre 2020
-
Bonjour à tous,

J'aurai un besoin un peu particulier concernant les listes sans doublon.

Pour simplifer mon explication:
je souhaiterai inclure dans document "book1.xlm" une liste extraire d'un document "book2.xlm sachant que celui-ci n'est pas ouvert mais que je connais son chemin d'accès.

cette liste devra être incluse dans le document "book1.xlm" puis tranformée pour qu'il n'y ait plus de doublon et trié par ordre alphabètique.
Autre soucis dans la liste d'origine: j'ai des cases vides dans ma colonne.

Merci

1 réponse

Messages postés
1411
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
18 décembre 2020
148
Bonsoir Anakin, bonsoir le forum,

Comme tu ne donnes que très peu d'explications sur où se trouvent les données et où il faut les renvoyer tu verras souvent (à adapter à ton cas)... Copie ces deux macros ci-dessous dans un module standard du classeur book2.xlsm. D'ailleurs tu parles d'extention xlm ce qui prête à confusion entre xls / xlsm et xml... Là aussi tu adapteras...
Les macros :

Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OD (Onglet Source)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim TC As Variant 'déclare la variable TC (Tableau de Cellules)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)

Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Sheets("Feuil1") 'définit l'onglet destination OD (à adapter à ton cas)
CH = "C:\Users\Anakin\Documents\VBA" 'chemin à adapter à ton cas évidemment...
'si il se trouve dans le même dossier que "book2.xlsm" tu peux utiliser :
'CH = CD.Path & "\"
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set CS = Workbooks("book1.xlsm") 'définit le classeur source CS (génère une erreur si ce classeur n'est pas ouvert)
If Err <> 0 Then 'si une erreur a été générée
    Err = 0 'annule l'erreur
    Workbooks.Open (CH & "\book1.xlsm") 'ouvre le classeur
    Set CS = ActiveWorkbook 'définit le classeur source CS
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Set OS = CS.Sheets("Feuil1") 'définit l'onglet source (à adapter à ton cas)
'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onget source OS (colonne à adapter à ton cas)
DL = OS.Cells(Application.Rows.Count, 1).End(xlUp).Row
TC = OS.Range("A1:A" & DL) 'définit le tableau de cellules TC (tu adapteras aussi la colonne à ton cas)
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TC, 1) 'boucle sur toutes les lignes I du tableau de cellules TC en partant de la première (à adapter à ton cas)
    D(TC(I, 1)) = "" 'alimente le dictionnaire D
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
Call tri(TMP, LBound(TMP, 1), UBound(TMP, 1)) 'lance la procédure de tri alphabétique
For I = 0 To UBound(TMP) 'boucle sur tous les éléments du tableau temporaire TMP (sans doublon et trié)
    OD.Cells(I + 1, 1).Value = TMP(I) 'renvoie la valeur de TMP(I) dans la cellule ligne I+1 colonne 1 de l'onglet OD (à adapter à ton cas)
Next I 'prochaine élément de la boucle
CS.Close SaveChanges:=False 'ferme le classeur source CS sans enregister les changements
End Sub

et

Sub tri(a As Variant, gauc As Integer, droi As Integer) ' Quick sort tiré du site de Jacques BOISGONTIER : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm
Dim ref As String
Dim g As Integer
Dim D As Integer

ref = a((gauc + droi) \ 2)
g = gauc: D = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(D): D = D - 1: Loop
    If g <= D Then
        temp = a(g): a(g) = a(D): a(D) = temp
        g = g + 1: D = D - 1
    End If
Loop While g <= D
If g < droi Then Call tri(a, g, droi)
If gauc < D Then Call tri(a, gauc, D)
End Sub

Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575 >
Messages postés
37
Date d'inscription
mercredi 9 octobre 2013
Statut
Membre
Dernière intervention
5 avril 2018

Bonjour,

Pour être tout à fait complet, le Dim temps As String n'a pas été ajouté par Boisgontier car il a cherché à "universaliser" sa macro dans le sens ou l'on peut trier tout type de données.
Toi, en ajoutant cela ça marche parce que tu tries des string. Mais quelqu'un d'autre peut très bien vouloir trier des Double...

De même, je remplacerai :
Dim g As Integer
Dim D As Integer

par des long :
Dim g As Long
Dim D As Long
Messages postés
1411
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
18 décembre 2020
148
Bonjour Anakin, Pikaju, le forum,

Rendons à César ce qui appartient à César !
Comme le dit Pikaju, la déclaration des variables n'a pas été ajoutée par Jacques BOISGONTIER mais par moi même. Je le fais car j'utilise l'Option Explicit et j'avais oublié de déclarer TEMP. Pour l'éthique j'essaie de ne pas oublier de dire que le code vient de son site, car il est vrai que je n'arrive pas à le retenir et donc à pouvoir le restituer sans faire un copier/coller. Quant à le commenter... Il faudrait que je le comprenne et ce n'est pas le cas...
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575 >
Messages postés
1411
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
18 décembre 2020

Salut ThauTheme, le forum,

Cette procédure de tri rapide de Boisgontier doit s'affranchir, justement, de l'Option Explicit, pour pouvoir être utilisée dans tous les cas de figure.
Au "pire", si l'on veut déclarer toutes les variables, les nombres (indices des tableaux) doivent être déclarés As Long et temp, pour accepter tout et n'importe quoi comme valeur, As Variant.
Donc, avec déclaration de variables, je préfères cette utilisation :
Sub tri(a As Variant, gauc As Long, droi As Long) 
' Quick sort tiré du site de Jacques BOISGONTIER : 
'http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm
Dim ref, temp
Dim g As Long, D As Long

ref = a((gauc + droi) \ 2)
g = gauc: D = droi
Do
    Do While a(g) < ref: g = g + 1: Loop
    Do While ref < a(D): D = D - 1: Loop
    If g <= D Then
        temp = a(g): a(g) = a(D): a(D) = temp
        g = g + 1: D = D - 1
    End If
Loop While g <= D
If g < droi Then Call tri(a, g, droi)
If gauc < D Then Call tri(a, gauc, D)
End Sub


Ensuite, la citation des sources devrait être obligatoire et, pour le moins, systématique. C'est une règle que chacun devrait respecter et, là dessus, tu as entièrement raison.

Enfin, pour t'aider à comprendre cette procédure, je t'invite à consulter ce lien wikipédia relatif à l'algo de tri rapide Quick Sort.

A++
Franck
Messages postés
1411
Date d'inscription
mardi 21 octobre 2014
Statut
Membre
Dernière intervention
18 décembre 2020
148 >
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021

Merci pour l'info Pijaku !
Messages postés
37
Date d'inscription
mercredi 9 octobre 2013
Statut
Membre
Dernière intervention
5 avril 2018

Franchement vous êtes bon !!!
Et en plus je comprends tout.

Merci