Liste sans doublon récupérée dans un autre dossier excel

Résolu/Fermé
anakin_74 Messages postés 41 Date d'inscription mercredi 9 octobre 2013 Statut Membre Dernière intervention 17 novembre 2022 - 13 mars 2015 à 16:26
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 - 17 mars 2015 à 16:28
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
A voir également:

1 réponse

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
14 mars 2015 à 23:30
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

0
anakin_74 Messages postés 41 Date d'inscription mercredi 9 octobre 2013 Statut Membre Dernière intervention 17 novembre 2022
16 mars 2015 à 10:11
Désolé pour l'erreur de syntaxe: c'est bien "xlsm".
Je te dit merci et bravo pour ce code: très claire et bien expliqué.
J'ai installé les 2 macros et ça marche parfaitement.
Ya vraiment des gens doués

Petite remarque pour le sub tri de Boisgontier:
Si on applique le debug (compile VBA project) il manque un
Dim temp As String, pour être "propre"
A bientôt
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > anakin_74 Messages postés 41 Date d'inscription mercredi 9 octobre 2013 Statut Membre Dernière intervention 17 novembre 2022
16 mars 2015 à 11:08
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
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
16 mars 2015 à 17:32
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...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
17 mars 2015 à 07:40
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
0
anakin_74 Messages postés 41 Date d'inscription mercredi 9 octobre 2013 Statut Membre Dernière intervention 17 novembre 2022
17 mars 2015 à 10:22
Franchement vous êtes bon !!!
Et en plus je comprends tout.

Merci
0