IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Recherche des doublon + tri alphabétique


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    Par défaut Recherche des doublon + tri alphabétique
    Bonjour à tous,

    Voilà, j'ai un petit bout de code à faire pour trier par ordre alphabétique puis supprimer les doublons d'un tableau...

    Je m'explique, je lis dans un fichier TXT la liste de tous les départements de France (sauf la Corse) organisé comme-ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    03;Allier;Auvergne;
    04;Alpes de Haute-Provence;Provence-Alpes-Côte d'Azur;
    05;Hautes-Alpes;Provence-Alpes-Côte d'Azur;
    06;Alpes-Maritimes;Provence-Alpes-Côte d'Azur;
    ...
    Je fini par avoir un tableau dans lequel j'ai toutes les régions déclaré comme-ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Region(100) As String
    J'ai donc, dans ce tableau Region, plein de doublons non triés par ordre alphabétique.

    Ma question et de savoir comment alimenter ma ComboBox (ComBoxRegion) pour afficher toutes les régions dans l'ordre alphabétique et sans doublon...

    J'ai pensé au tri à bulles et j'aimerais savoir s'il y a d'autres méthodes et surtout, si c'est possible de faire ces deux opération (recherche de doublons et tri alphabétique) en même temps...

    Si quelqu'un a une astuce...

    Merci pour votre aide...

    Denis...

  2. #2
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut
    Bonjour,

    C'est tout à fait possible via un objet dictionnaire (quoique pour le tri, faut que je me renseigne).

    En revanche, une première question ... Pourquoi la Corse ? C'est du racisme, enfin !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Adic As Object
    Dim I As Single
     
    Set Adic = CreateObject("Scripting.dictionary")
    For I = Lbound(Region, 1) to Ubound(Region, 1)
        If Not Adic.Exists(Region(I)) Then Adic.Add Region(I), Region(I)
    Next I
    Avec ça tu récupère un objet dictionnaire contenant toutes les régions non triés (mais pas en double !)
    Le principe est simple, tu ne peux pas avoir deux clefs identique dans un dictionnaire, donc on ajoute toute les régions, et quand il y a un conflit de clef, on jette la valeur qui pose problème !

    Je reviens vers toi pour le tri plus tard !

    EDIT : Pour le tri, j'ai trouver ce post là !

  3. #3
    Membre éclairé Avatar de DenisHen
    Homme Profil pro
    Dessinateur / projeteur
    Inscrit en
    Novembre 2013
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Dessinateur / projeteur
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 415
    Par défaut
    Bonjour Nico Chg et merci de ton aide...

    1. pour ce qui est de la Corse, c'est tout simple, on n'a pas de dossier sur l'île de beauté...

    2. Pour le tri, j'ai peut-être trouvé un truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        'tri croissant du tableau "Region"
        For i = 1 To UBound(Region)
            x = i
            For k = x + 1 To UBound(Region)
                If Region(k) <= Region(x) Then x = k
            Next k
            If i <> x Then
                ValTemp = Region(x): Region(x) = Region(i): Region(i) = ValTemp
            End If
        Next i
    3. pour ce qui est des doublons, je les gère quand j'alimente mon ComboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        For Lign = 1 To 95
            ComBoxRegion = Region(Lign)
            If ComBoxRegion.ListIndex = -1 Then ComBoxRegion.AddItem Region(Lign)
        Next
    Mais pour ton "Scripting.dictionary", je suis très intéressé car je ne connais absolument pas...

    Merci encore,

    Denis...

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Pour la gestion des doublons, un remove duplicate fait l'affaire, soit sous Excel ou en VBA (attention, pas de retour d'information en VBA)
    Après, sauf si j'ai mal compris, le classement se fait par un simple autofilter + tri
    Quelques exemples si ça peut aider ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    'Exemple d'utilisation
    ' Sort and Filter by production site to speed-up the process
        Call Remove_Autofilter(ActiveWorkbook, DataRng.Worksheet.Name)
     
        Set DataRng = DataRng.CurrentRegion
     
        ' Filter by prodsite and not-affected lots
        With DataRng
     
            .AutoFilter     'Set the autofilter On
            .AutoFilter Field:=ColF, Criteria1:=ProdSite
            .AutoFilter Field:=ColFlag, Criteria1:="="
     
        End With
     
        'Sort
        With DataRng
     
            .Sort _
                key1:=DataRng.Cells(ColFlag), Order1:=xlAscending, _
                key2:=DataRng.Cells(6), Order2:=xlAscending, _
                key3:=DataRng.Cells(1), Order3:=xlAscending, _
            Header:=xlYes, Orientation:=xlSortColumns
                    '
        End With
     
    ' Exemple remove duplicate
    InpRng.RemoveDuplicates Columns:=(RngColAR), Header:=RngAsHeader
     
    Sub Remove_Autofilter(Wbk As Workbook, WshN As String)
     
    Dim Wsh As Worksheet
     
    If IsMissing(Wbk) Then Set Wbk = ActiveWorkbook
     
    Set Wsh = Wbk.Worksheets(WshN)
     
    If Wsh.AutoFilterMode = True Then Wsh.AutoFilterMode = False
     
    End Sub
    Sub Set_Autofilter(Wbk As Workbook, WshN As String, RngAd As String)
    Dim Wsh As Worksheet
    Dim AFiltRng As Range
     
    If IsMissing(Wbk) Then Set Wbk = ActiveWorkbook
     
    Set Wsh = Wbk.Worksheets(WshN)
    Set AFiltRng = Wsh.Range(RngAd).CurrentRegion
     
    If Is_Rng_Defined(Rng:=AFiltRng) = True Then AFiltRng.AutoFilter
     
    End Sub

  5. #5
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut
    @DenHen

    J'aime beaucoup ta méthode pour gérer les doublons, simple et efficaces !
    Lorsque tu déclare un dictionnaire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim monDico as object
    Set monDico = CreateObject("scripting.dictionary")
    , pas besoin d'activer des références Microsoft. En revanche, si tu veux le déclarer comme il suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim monDico as scripting.dictionary
    Set monDico as new scripting.dictionary
    Là tu dois activer les références. Le dictionnaire est déclaré en late bindings (première méthode).

    Pour le tri d'une listbox, voir la FAQ : Tri d'une combobox par ordre alphabétique

    Le tri en passant par une worksheet et donc les fonctions d'Excel de base est tout aussi efficace, à voir selon ce que tu veux faire.

Discussions similaires

  1. [AC-2003] Rechercher des doublons à partir du résultat d'une requête
    Par oplaut dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/07/2010, 08h34
  2. Rechercher des doublons dans ACCESS(quasi doublons)
    Par ingal30 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/03/2010, 13h57
  3. Rechercher des doublons dans un fichier de type csv
    Par phoenixatareva dans le forum C++
    Réponses: 6
    Dernier message: 12/08/2008, 20h02
  4. Réponses: 0
    Dernier message: 02/10/2007, 13h44
  5. recherche des doublons dans une hash
    Par Jasmine80 dans le forum Langage
    Réponses: 4
    Dernier message: 29/01/2007, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo