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 :

Coloration de doublons via dico dans VBA [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut Coloration de doublons via dico dans VBA
    Bonjour a vous tous,


    J'ai un besoin de pouvoir colorer tous les élément dont la valeur se répète plus qu'une fois. J'ai trouvé en fouillant le web un code utilisant le dico que je trouve génial mais je voudrais être en mesure de l'améliorer afin qu'il puisse répondre a mes besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub couleur_sur_doublons()
      Dim m As Object, i As Long, z
      Set m = CreateObject("Scripting.Dictionary")
      For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
      z = Cells(i, 1)
      If Not m.Exists(z) Then m.Add z, z Else Cells(i, 1).Interior.ColorIndex = 3
      Next i
     End Sub
    Présentement le code utilise une selection, je voudrais pouvoir définir une plage précise, donc la transformer en fonction dont l'argument est un range.. Je regarde les variables mais je bloque a la boucle. Je croyais pouvoir remplacer certaine choses mais il me manque le concecpt de seulement prendre une partie du range pour la couleur. (Je pensais abolir la variable i ...)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function couleur_sur_doublons_test(colonne_voulu As Range)
      
      Dim m As Object, i As Long, z
      Set m = CreateObject("Scripting.Dictionary")
    '  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
      z = Range(colonne_voulu & 2, colonne_voulu & LastLignUsedInColumn(colonne_voulu))
      If Not m.Exists(z) Then m.Add z, z Else Cells(i, 1).Interior.ColorIndex = 3
    '  Next i
     End Function
    Autre chose que j'interprete le code c'est que lorsqu'il rencontre une cellule, il peuple le dico, ce qui empeche de colorier la premiere apparence du doublons. Étant donné que je suis novice en dico, Est-ce qu'il y a une facon de peupler en premier le dico et non au fur et a mesure ???



    merci de votre aide précieuse !!!
      0  0

  2. #2
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    J'ai trouvé quelquechose apres une heure sur le site de notre ami Jacques Boigontier


    hail to the king !!!
      0  1

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    couleur_sur_doublons_test Range(Range("A1"), Cells(Rows.Count, "A").End(xlUp))
    End Sub
    Sub couleur_sur_doublons_test(ByRef colonne_voulu As Range)
      With CreateObject("Scripting.Dictionary")
        For Each a In colonne_voulu
           If Not .Exists(a.Value) Then .Add a.Value, a.Value Else a.Interior.ColorIndex = 3
        Next
     End With
     End Sub
      1  1

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Merci dysorthographie

    Avec ta partie de code, je vais pouvoir analyser et comprendre !!!
      0  0

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Avec le code de Jacques Boigontier j'Arrive a



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function doublons_couleur_unique(lettre_colonne_voulue As String)
    Dim mondico As Object
    Dim c As Variant
     
       Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue)).Interior.ColorIndex = xlNone
       Set mondico = CreateObject("Scripting.Dictionary")
       For Each c In Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue))
         If c <> "" Then mondico.item(c.value) = mondico.item(c.value) + 1
       Next c
       For Each c In Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue))
         If mondico.item(c.value) > 1 Then c.Interior.ColorIndex = 4
       Next c
     End Function

    Ton code dysorthographie arrive avec le même probleme initale pour la première occurance d'un doublons (La premiere apparition du doublons n'est pas colorié). Également il considère les cellules vides comme doublons, ce qui est problématique dans mon cas.


    Mais je comprends mieux que le code initiale
      0  1

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    C'est la même solution qu'au poste #5 inspiré d'une source de Jacques Boigontier , pour qui j'ai beaucoup de respect.

    Je lui reprocher seulement de faire une double passe. Une pour enrichir le dictionnaire et une autre pour actualisé Excel.

    Si je j'utilise une requête Sql qui d'une certaine manière fait la même chose, c'est parce que ADO le fait en assembleur et donc plus rapide que VBA.

    Certains me dirons qu'ADO ne marche pas sur MAC et je répondrai que les dictionnaire, qui était bien le postulat de départ, non plus.
      2  1

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 38
    Par défaut
    merci beucoup pour ta reponse, en fait je ne pouvais pas activer le code de poste #5, j'ai taper le nom (doublons_couleur_unique) mais çammarche pas
    Citation Envoyé par dysorthographie Voir le message
    Bonjour,
    C'est la même solution qu'au poste #5 inspiré d'une source de Jacques Boigontier , pour qui j'ai beaucoup de respect.

    Je lui reprocher seulement de faire une double passe. Une pour enrichir le dictionnaire et une autre pour actualisé Excel.

    Si je j'utilise une requête Sql qui d'une certaine manière fait la même chose, c'est parce que ADO le fait en assembleur et donc plus rapide que VBA.

    Certains me dirons qu'ADO ne marche pas sur MAC et je répondrai que les dictionnaire, qui était bien le postulat de départ, non plus.
    Images attachées Images attachées  
      1  2

  8. #8
    Invité
    Invité(e)
    Par défaut
    Désolé mais je ne vois pas l'intérêt de ce code!
    Et si je veux le faire sur une autre feuille ou un autre classeur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    couleur_sur_doublons_test  "A",3
    couleur_sur_doublons_test  "B",4
    couleur_sur_doublons_test  "C",5
    End Sub
    Sub couleur_sur_doublons_test(ByVal col As string,coul as integer )
      With CreateObject("Scripting.Dictionary")
        For Each a In Range(cells(1,col),Cells(Rows.Count, col).End(xlUp))
           if cstr(a.value)<>"" then
                If Not .Exists(a.Value) Then .Add a.Value, a.Value Else a.Interior.ColorIndex = coul
            End If
        Next
     End With
     End Sub
    Dernière modification par Invité ; 07/09/2018 à 17h33.
      1  1

  9. #9
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Char ami,


    Dans ma vision et mon champs, ce code est précieux

    LE code permet de ne pas utiliser la mise en forme conditionnelle dont les copier / coller de cellules font varier la plage voulues. Dans mon champs d'activité, il se peut qu'un produit X est acheté chez un fournisseur Y, fournisseur Z, etc ... Dans certains cas il se peut que le produit n'est pas toute a fait identique, sois une caractéristique importantes qui est vitale pour une utilisation particulière. Donc il va falloir créé un nouveau produit dans la base de donné. L’autre situation c'Est que le produit est totalement identique peut importe l'endroit qu'il est acheté et les différences sont a peine minimale ou n'existe pas donc les produits est ramené sur le même code de produit.


    Donc en résumé le code est un aide a la prise de décisions. Ce que la machine ne peut décidé, il peut au moins aidé à discerner les cas auquel un humain doit absolument tranché.


    Dans mon cas je n'ai pas besoins que ce sois sur un autre feuille mais c'est une excellente idée. Je vais essayé de pondre quelquechose !!!


    Pour ton code, tu as corrigé le problème des cellules vides, mais étant donné que le dico est remplis encours de route, la première occurrence du doublons n'est toujours pas soulignés. Donc je crois qu'il faut absolument le remplir avant d'effectué la boucle.


    Un gros merci dysortho. !!! En espérant que j'ai pu t'éclairé sur l'utilité du code.
      0  0

  10. #10
    Invité
    Invité(e)
    Par défaut
    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
    Sub test()
    couleur_sur_doublons_test "A", 3
    couleur_sur_doublons_test "B", 4
    couleur_sur_doublons_test "C", 5
    End Sub
    Sub couleur_sur_doublons_test(ByVal col As String, coul As Integer)
    Dim cn As Object: Set cn = CreateObject("Adodb.connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=no;"""
    Set rs = cn.Execute("Select count([F1]),[F1] from [Feuil1$" & Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "") & "] where [F1]  is not null group by [F1] having count([F1])>1")
     
     
    '  With CreateObject("Scripting.Dictionary")
        For Each a In Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp))
           If CStr(a.Value) <> "" Then
           rs.Filter = "[F1]='" & Replace(a.Value, "'", "''") & "'"
                If Not rs.EOF Then a.Interior.ColorIndex = coul
            End If
        Next
    rs.Close
    cn.Close
     End Sub
    Fichiers attachés Fichiers attachés
      1  1

  11. #11
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Vraiment génial !!!

    Ça marche numéro uno !!!!
      0  0

  12. #12
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    J'aurais penser que le code suivant aurais foncitonner, mais je ne sais pas comment peupler la nouvelle feuille. Il y a t-il une façon simple rapide au lieu de copier des valeurs ???


    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
    Sub test_color()
     test_doublons_couleur_unique ("a")
     End Sub
     
     
     
     
    Function test_doublons_couleur_unique(lettre_colonne_voulue As String)
    Dim mondico As Object
    Dim c As Variant
    Dim nouvelle_feuil As String
     
    If sheetExists("nouvelle_feuil") = True Then
            Application.DisplayAlerts = False
            Sheets("nouvelle_feuil").Delete
            Application.DisplayAlerts = True
    Else
    End If
     
     
    Worksheets.Add.Name = "nouvelle_feuil"
     
     
       Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue)).Interior.ColorIndex = xlNone
       Set mondico = CreateObject("Scripting.Dictionary")
       For Each c In Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue))
         If c <> "" Then mondico.item(c.value) = mondico.item(c.value) + 1
       Next c
       For Each c In Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue))
         If mondico.item(c.value) > 1 Then Sheets("nouvelle_feuil").Cells(c, 1).value = mondico.item(c.value)
     
       Next c


    ou bien


    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
    Function test_doublons_couleur_unique(lettre_colonne_voulue As String)
    Dim mondico As Object
    Dim c As Variant
    Dim nouvelle_feuil As String
     
    If sheetExists("nouvelle_feuil") = True Then
            Application.DisplayAlerts = False
            Sheets("nouvelle_feuil").Delete
            Application.DisplayAlerts = True
    Else
    End If
     
     
    Worksheets.Add.Name = "nouvelle_feuil"
     
     
       Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue)).Interior.ColorIndex = xlNone
       Set mondico = CreateObject("Scripting.Dictionary")
       For Each c In Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue))
         If c <> "" Then mondico.item(c.value) = mondico.item(c.value) + 1
       Next c
       For Each c In Range(lettre_colonne_voulue & 2, lettre_colonne_voulue & LastLignUsedInColumn(lettre_colonne_voulue))
         If mondico.item(c.value) > 1 Then Sheets("nouvelle_feuil").Cells(c.Row.Count, 1).value = mondico.item(c.value)
     
       Next c
      0  0

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Adresse="$A$1:$A$10"
    "[feuille_voulu$" & replace(Adresse,"$","") & "]"
     
    Nom="feuille_voulu"
    Adresse = Replace(.Range(.Cells(1, col), .Cells(Rows.Count, col).End(xlUp)).Address, "$", "")
    Set rs = .Execute("Select count([F1]),[F1] from [" & Nom & "$" & Adresse & "] where [F1]  is not null group by [F1] having count([F1])>1")
    Dernière modification par Invité ; 18/09/2018 à 17h52.
      1  1

  14. #14
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Donc si j'applique la modification a ce que je veux j'arrive a ce résultats (je n'ai pas fixer l'adresse étant donné que je veux la totalité de la colonne et le nom est égale au paramètre feuille_voulu)



    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
    Sub feuille_sommaire_doublons_2(ByVal col As String, feuille_voulu As String)
    Dim Adresse As String: Adresse = Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "")
    Dim rs As Object
    Dim f As Object
    Dim wbk_creation As Workbook
     
    Set wbk_creation = ActiveWorkbook
     
    If sheetExists("sommaire_doublons") = True Then
            Application.DisplayAlerts = False
            Sheets("sommaire_doublons").Delete
            Application.DisplayAlerts = True
    End If
     
    If Not CBool(InStr(Adresse, ":")) Then Exit Sub
    wbk_creation.Sheets(feuille_voulu).Select
    With CreateObject("Adodb.connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & wbk_creation.FullName & ";Extended Properties=""Excel 12.0;HDR=no;"""
        Set rs = .Execute("Select count([F1]),[F1] from [" & feuille_voulu & "$" & Adresse & "] where [F1]  is not null group by [F1] having count([F1])>1")
     
    If Not rs.EOF Then
        Set f = wbk_creation.Sheets.Add: f.Cells(1, "A").CopyFromRecordset rs
        ActiveSheet.Name = "sommaire_doublons"
     
    End If
        rs.Close
        .Close
     
     End With
     
     
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
     
    feuille_sommaire_doublons_2 "A", "Feuil1"
     
    End Sub
    La première exécution tous va sur des roulettes !!! La seconde exécution, la feuille sommaire_doublons n'est plus présente (donc elle est détruite mais pas recréé). La 3eme exécution tous marche a merveille, ainsi de suite

    La Feuil1 a les données suivantes

    Nom : Capture1.JPG
Affichages : 234
Taille : 28,2 Ko

    La Feuil6 a les données suivants :

    Nom : Capture2.JPG
Affichages : 187
Taille : 10,9 Ko

    Si je parametre la sub test ainsi a fin de faire l'exercise avec la feuille 6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
     
    feuille_sommaire_doublons_2 "A", "Feuil6"
     
    End Sub
    La première exécution, tous marche comme il se doit, la feuille sommaire_doublons est créés avec 2 a, 2 b, 2 c. La seconde exécution, la feuille sommaire_doublons contient seulement 2 a ... c'Est là que tout est bizzare !!! La 3eme exécution, la feuille sommaire_doublons n'est plus présente. La 4eme exécution le tout est redevenu a la normale



    JE me pose plusieurs questions mais je ne commprends pas pourquoi je n'arrive toujours pas au meme résultats.



    J'ai essayé a nouveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    feuille_sommaire_doublons_2 "A", "Feuil6"
    entre chaque exécution, je change de feuille et la tous marche parfaitement


    merci encore pour votre aide !!!
      1  0

  15. #15
    Invité
    Invité(e)
    Par défaut
    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
    Sub test()
     
    NewFeulle_sur_doublons_test "A"
    NewFeulle_sur_doublons_test "B"
    NewFeulle_sur_doublons_test "C"
    End Sub
    Sub NewFeulle_sur_doublons_test(ByVal col As String)
    ThisWorkbook.Sheets("Feuil1").Select
    With CreateObject("Adodb.connection")
    .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=no;"""
    Set rs = .Execute("Select count([F1]),[F1] from [Feuil1$" & Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "") & "] where [F1]  is not null group by [F1] having count([F1])>1")
    Set f = ThisWorkbook.Sheets.Add: f.Cells(1, "A").CopyFromRecordset rs
    rs.Close
    .Close
     End With
    End Sub
      1  1

  16. #16
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Il y a un erreur d'exécution '-2147467259 (80004005)':

    Cette table contient des cellules hors de la plage de cellules définie dans cette feuille de calcul



    Le débogage me pointe sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = .Execute("Select count([F1]),[F1] from [Feuil1$" & Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "") & "] where [F1]  is not null group by [F1] having count([F1])>1")

    crime que tu es génial et efficaces ...
      0  0

  17. #17
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2018
    Messages : 38
    Par défaut
    merci beucoup pour le sujet, et le site de notre ami Jacques Boigontier
      1  1

  18. #18
    Invité
    Invité(e)
    Par défaut
    En fait thisworkbook est le fichier qui exécute la macro. Thisworkbook.fullname retourne le chemin complet du fichier qui exécute la macro

    J'effectues ma connexion Data Source=" & ThisWorkbook.FullName

    Je défis si la.première ligne est le nom.de champs HDR=yes/no;"""

    Si no la première colonne de la plage considérée est [F1] la deuxième [F2] [Etc...]

    Si yes alors la première ligne est le nom.de chams [Nom],[Pnom],[Etc...]

    Une requête est une description

    Je sélectionne [F1],[F2] de la Feuille$
    Je filtre sur la valeur toto de [F1]
    Je regroupe.mes champs [F1],[F2]
    Je fait un dixième filtre suis mon regroupement

    Le croup by permet de faire de statiques cunt,min,max,moye etc...
    Le having des filtre sur ces même statistiques.

    Select (chemps)
    From table
    Where expression
    Group by champs
    Having expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Select count([F1]),[F1],[F2]
    From [Feuill1$]
    Where [F1]='toto'
    Group by [F1],[F2]
    Having count([F1])>1
     
    Select count([F1]),[F1],[F2],[F3]
    From [Feuill1$]
    Where [F1]='toto'
    Group by [F1],[F2],[F3]
    Having count([F1[)>1
    Dernière modification par Invité ; 18/09/2018 à 21h36.
      1  1

  19. #19
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2017
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2017
    Messages : 556
    Par défaut
    Juste un peu avant la notification du courriel,


    J'ai réussis a avoir le bon résultat avec ceci



    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
    Function feuille_sommaire_doublons(ByVal col As String, feuille_voulu As String)
    Dim Adresse As String
    Dim rs As Object
    Dim f As Object
    Dim wbk_creation As Workbook
     
    Set wbk_creation = ActiveWorkbook
     
     
    If sheetExists("sommaire_doublons") = True Then
            Application.DisplayAlerts = False
            Sheets("sommaire_doublons").Delete
            Application.DisplayAlerts = True
    End If
     
    Sheets(feuille_voulu).Activate
    Adresse = Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "")
     
     
    If Not CBool(InStr(Adresse, ":")) Then Exit Function
     
     
    With CreateObject("Adodb.connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & wbk_creation.FullName & ";Extended Properties=""Excel 12.0;HDR=no;"""
        Set rs = .Execute("Select count([F1]),[F1] from [" & feuille_voulu & "$" & Adresse & "] where [F1]  is not null group by [F1] having count([F1])>1")
     
    If Not rs.EOF Then
        Set f = wbk_creation.Sheets.Add: f.Cells(1, "A").CopyFromRecordset rs
        ActiveSheet.Name = "sommaire_doublons"
     
    End If
        rs.Close
        .Close
     
     End With
    l'adresse prenait la valeur de la feuille active.



    Je vais également jeter un oeil a votre solution
      1  0

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    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
    Sub test()
    NewFeulle_sur_doublons_test "A"
    couleur_sur_doublons_test "A", 6
    End Sub
    Sub couleur_sur_doublons_test(ByVal col As String, coul As Integer)
    Dim cn As Object, Adresse As String: Set cn = CreateObject("Adodb.connection")
    Adresse = Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "")
    If Not CBool(InStr(Adresse, ":")) Then Exit Sub
    ThisWorkbook.Sheets("Feuil1").Select
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=no;"""
    Set rs = cn.Execute("Select count([F1]),[F1] from [Feuil1$" & Adresse & "] where [F1]  is not null group by [F1] having count([F1])>1")
        For Each a In Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp))
           If CStr(a.Value) <> "" Then
           rs.Filter = "[F1]='" & Replace(a.Value, "'", "''") & "'"
                If Not rs.EOF Then a.Interior.ColorIndex = coul
            End If
        Next
    rs.Close
    cn.Close
     End Sub
     
     
    Sub NewFeulle_sur_doublons_test(ByVal col As String)
    Dim Adresse As String: Adresse = Replace(Range(Cells(1, col), Cells(Rows.Count, col).End(xlUp)).Address, "$", "")
    If Not CBool(InStr(Adresse, ":")) Then Exit Sub
    ThisWorkbook.Sheets("Feuil1").Select
    With CreateObject("Adodb.connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=no;"""
        Set rs = .Execute("Select count([F1]),[F1] from [Feuil1$" & Adresse & "] where [F1]  is not null group by [F1] having count([F1])>1")
        Set f = ThisWorkbook.Sheets.Add: f.Cells(1, "A").CopyFromRecordset rs
        rs.Close
        .Close
     End With
    End Sub
      1  1

Discussion fermée
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Copier Date sans les doublons via VBA ou Formule Matricielle
    Par Goulou95 dans le forum Excel
    Réponses: 2
    Dernier message: 23/03/2016, 16h30
  2. [XL-2007] Problème de fonctions dans VBA excel & Access via ADO
    Par Djohn92 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/06/2015, 18h35
  3. [XL-2007] Afficher le résultat d'une recherche via combobox dans textbox ( débutant VBA )
    Par lbr64 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/07/2014, 15h25
  4. Réponses: 0
    Dernier message: 25/01/2013, 11h14
  5. Réponses: 33
    Dernier message: 22/08/2011, 14h33

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