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 :

Comparer 2 colonnes ADODB vs Dictionnaire [XL-2007]


Sujet :

Macros et VBA Excel

  1. #21
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour Oliv,

    Oui, j'avais fini par trouver le même lien

    Pour l'ordre, mystère et boule de gomme, je ne sais pas pourquoi il dégrade l'ordre original des données sans qu'on mette un ORDER BY, on dirait qu'il retourne en premier les enregistrements qui correspondent à travers la relation (join) mais je ne sais pas pourquoi... , surtout qu'il le fait pour la deuxième requête mais pas pour la première chez moi...

    Re,

    J'ai regardé ta dernière version déjà très rapide, et je me suis permis de la modifier légèrement pour n'utiliser qu'un dictionnaire, encore un tout petit peu plus rapide il me semble

    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
    Sub DictionnaireV2_1()
        Dim T As Double, i As Long
        Dim mondico As Object
        Dim TabloS1 As Variant
        Dim TabloS2 As Variant
        T = Timer
        Set mondico = CreateObject("Scripting.Dictionary")
     
        If Worksheets("Feuil2").UsedRange.Rows.Count < Worksheets("Feuil1").UsedRange.Rows.Count Then
            Set S2 = Worksheets("Feuil1")
            Set S1 = Worksheets("Feuil2")
        Else
            Set S1 = Worksheets("Feuil1")
            Set S2 = Worksheets("Feuil2")
        End If
        S1.Columns("B:B").ClearContents
        S2.Columns("B:B").ClearContents
     
     
        TabloS1 = Range(S1.Range("A1"), S1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value
        TabloS2 = Range(S2.Range("A1"), S2.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value
     
        For i = 1 To UBound(TabloS1, 1)
            mondico(TabloS1(i, 1)) = i
        Next i
     
        For i = 1 To UBound(TabloS2, 1)
            If mondico.Exists(TabloS2(i, 1)) Then
                TabloS2(i, 2) = "OK"
                TabloS1(mondico.Item(TabloS2(i, 1)), 2) = "OK"
            Else
                TabloS2(i, 2) = "ko"
            End If
        Next i
     
        For i = 1 To UBound(TabloS1, 1)
            If TabloS1(i, 2) = "" Then
                TabloS1(i, 2) = "ko"
            End If
        Next i
     
    Debug.Print Timer - T
    Debug.Print mondico.Count
        Application.ScreenUpdating = False
        S1.Range("A1:b" & UBound(TabloS1)) = TabloS1
     
        S2.Range("A1:b" & UBound(TabloS2)) = TabloS2
        Application.ScreenUpdating = True
    Debug.Print Timer - T
        MsgBox Timer - T
    End Sub

  2. #22
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour

    oais!!??? ok mais je n'en vois toujour pas l'utilité



    tu constatera que les variables tableaux sont aussi rapide que les variables dictionnaire

    alors moi il me viens une reflection sans doute sui je bete mais pourquoi créer un dictionnaire alors que les deux tableaux sont deja créés
    pourquoi ne pas comparer un tableaux a l'autre et meme pour le fun en créer un 3eme pour les noncommunset le rajouter a la suite

    sa reduirais
    les boucles
    les variables
    etc....

    enfin moi ceque j'en dis

    au plaisir

  3. #23
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour Patrick,
    Re,

    tu constatera que les variables tableaux sont aussi rapide que les variables dictionnaire
    Pour ce qui est des recherches d'une valeur dans un tableau, je crois (mais je peux me tromper ) que rien n'est aussi rapide que la méthode Exists des dictionnaires, si tu connais quelque chose de comparable, je suis preneur

    J'ai essayé sans dictionnaire, et alors que la dernière version d'Oliv prenait environ 4 secondes chez moi, ma version sans dictionnaire prenait environ 60 secondes, si je me souviens bien, pas vraiment comparable, mais sans doute y a-t-il plus rapide que la méthode que j'avais utilisé (Application.Match)

  4. #24
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    ca n'est pas la methode exist que je remet en cause

    mais le fait que tu boucle deja avant sur les tableaux et mon idée c'est que
    la moulinette doit s'arreter a ses deux boucle

    et il est impossible que 2 boucles sur 2 tableaux (.final )soit plus lente que 3boucle en testant en plus un dictionnaire

    tu vois ce que je veux dire

    ou alors vous avez de serieux probleme de librairie dans votre system

  5. #25
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Re,

    Après reflexion, s'il y a des doublons dans les n° SIREN, ma dernière version risque de ne pas fonctionner correctement, je pense qu'il faut en rester à la dernière version d'Oliv

    mais le fait que tu boucle deja avant sur les tableaux et mon idée c'est que
    la moulinette doit s'arreter a ses deux boucle

    et il est impossible que 2 boucles sur 2 tableaux (.final )soit plus lente que 3boucle en testant en plus un dictionnaire
    La question est comment tu vérifies, en ne bouclant que sur les 2 tableaux, que la valeur existe dans l'autre. C'est quand même le but de cette macro de savoir si ça existe ou pas...

    Encore une fois, si tu vois une autre méthode que Exists du dictionnaire, qui n'est pas une boucle supplémentaire et qui a des performances comparables, je prend

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ou alors vous avez de serieux probleme de librairie dans votre system
    Mais je n'ai peut-être pas les mêmes références de cochées que toi

  6. #26
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par tototiti2008 Voir le message
    Re,

    Après reflexion, s'il y a des doublons dans les n° SIREN, ma dernière version risque de ne pas fonctionner correctement, je pense qu'il faut en rester à la dernière version d'Oliv
    Je confirme , c'est ce que je viens de tester effectivement !

  7. #27
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour à tous,

    une version qui gère les doublons avec un seul dictionnaire

    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
    54
    55
    56
    57
    58
    59
    Sub DictionnaireV2_2()
        Dim T As Double, i As Long, j As Long
        Dim mondico As Object
        Dim TabloS1 As Variant
        Dim TabloS2 As Variant
        Dim TabloLigne
        T = Timer
        Set mondico = CreateObject("Scripting.Dictionary")
     
        If Worksheets("Feuil2").UsedRange.Rows.Count < Worksheets("Feuil1").UsedRange.Rows.Count Then
            Set S2 = Worksheets("Feuil1")
            Set S1 = Worksheets("Feuil2")
        Else
            Set S1 = Worksheets("Feuil1")
            Set S2 = Worksheets("Feuil2")
        End If
        S1.Columns("B:B").ClearContents
        S2.Columns("B:B").ClearContents
     
     
        TabloS1 = Range(S1.Range("A1"), S1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value
        TabloS2 = Range(S2.Range("A1"), S2.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value
     
        For i = 1 To UBound(TabloS1, 1)
            If mondico.exists(TabloS1(i, 1)) Then
                mondico(TabloS1(i, 1)) = mondico(TabloS1(i, 1)) & "," & i
            Else
                mondico(TabloS1(i, 1)) = CStr(i)
            End If
        Next i
     
        For i = 1 To UBound(TabloS2, 1)
            If mondico.exists(TabloS2(i, 1)) Then
                TabloS2(i, 2) = "OK"
                TabloLigne = Split(mondico.Item(TabloS2(i, 1)), ",")
                For j = LBound(TabloLigne) To UBound(TabloLigne)
                    TabloS1(CLng(TabloLigne(j)), 2) = "OK"
                Next j
            Else
                TabloS2(i, 2) = "ko"
            End If
        Next i
     
        For i = 1 To UBound(TabloS1, 1)
            If TabloS1(i, 2) = "" Then
                TabloS1(i, 2) = "ko"
            End If
        Next i
     
    Debug.Print Timer - T
    Debug.Print mondico.Count
        Application.ScreenUpdating = False
        S1.Range("A1:b" & UBound(TabloS1)) = TabloS1
     
        S2.Range("A1:b" & UBound(TabloS2)) = TabloS2
        Application.ScreenUpdating = True
    Debug.Print Timer - T
        MsgBox Timer - T
    End Sub

  8. #28
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour toti

    oui mais je n'arrive toujour pas a comprendre pourquoi et encore la on a un bon exemple

    tu boucle sur les tableaux et dictionnaire plusieur fois

    il suffit de prendre le plus grand rows.count et le comparer au plus petit avec un dictionnaire si veux
    et pourquoi pas changer la clé de l'item pour les communs

    j'ai fait plusieur essais avec des dicos et effectivement ils sont plus rapide alors elimines les tableaux tout du moins dans la moulinette

    au plaisir

  9. #29
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour Patrick,

    oui mais je n'arrive toujour pas a comprendre pourquoi et encore la on a un bon exemple
    Ben oui, mais moi je ne comprend pas pourquoi tu ne comprends pas

    tu boucle sur les tableaux et dictionnaire plusieur fois
    Il faut bien boucler sur le premier tableau pour remplir le dictionnaire
    Il faut bien boucler sur le second pour voir si le n° SIREN existe dans le dictionnaire
    La dernière boucle remplit les vides pour le 1er tableau, il y a peut-être moyen de la simplifier... mais je ne vois pas trop

  10. #30
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    re
    essaie ca

    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
    Sub DictionnaireV3()
    Dim k1, k2, i1, i2
    Set mondico = Nothing
        Set mondico2 = Nothing
    Set mondico = CreateObject("Scripting.Dictionary")
    Set mondico2 = CreateObject("Scripting.Dictionary")
    If Sheets(1).UsedRange.Rows.Count > Sheets(2).UsedRange.Rows.Count Then
    fin = Sheets(1).UsedRange.Rows.Count
    Else
    fin = Sheets(2).UsedRange.Rows.Count
    End If
       'on a pris le plus grand nombre de lignes utilisé pour les feuilles 1 et 2
        For i = 2 To fin
         mondico.Add Sheets(1).Cells(i, 1).Value, Sheets(1).Cells(i, 2).Value 'avec les clés en colonne A, les valeurs en colonne B
         mondico2.Add Sheets(2).Cells(i, 1).Value, Sheets(2).Cells(i, 2).Value 'avec les clés en colonne A, les valeurs en colonne B
        Next
     
      k1 = mondico.keys
     i1 = mondico.items
     k2 = mondico2.keys
     i2 = mondico2.items
     
         For n = 0 To mondico.Count - 1
    If mondico2.exists(k1(n)) Then
    'ici ton code que tu veux faire pour les communs moi je te met un msgbox qui te donne les ligne des feuilles1 et 2 ou se trouve les communs
    '
    '
    '
    MsgBox "les lignes communnes sont " & vbCrLf & "pour la feuill1 c'est la ligne :" & mondico.Item(k1(n)) & vbCrLf & "pour la feuill2 c'est la ligne :" & mondico2.Item(k1(n))
    End If
        Next
    MsgBox fini
    end sub

  11. #31
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        For i = 2 To fin
         mondico.Add Sheets(1).Cells(i, 1).Value, Sheets(1).Cells(i, 2).Value 'avec les clés en colonne A, les valeurs en colonne B
         mondico2.Add Sheets(2).Cells(i, 1).Value, Sheets(2).Cells(i, 2).Value 'avec les clés en colonne A, les valeurs en colonne B
        Next
    C'est toujours plus rapide de parcourir les éléments d'une variable tableau que de boucler sur les cellules d'une feuille. Ce sont là les abc et pas besoin de chercher midi à 14h

  12. #32
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonsoir mercatog

    je n'ai pas mis les tableau mais il va de soit

    ca n'est pas la que je voulais qui regarde

    et puis pas la peine non plus de boucler sur les cells pour faires des tableaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau=range("a1:b" & X)

    au plaisir

  13. #33
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Citation Envoyé par patricktoulon Voir le message

    et puis pas la peine non plus de boucler sur les cells pour faire des tableaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau=range("a1:b" & X)
    C'est aussi une évidence

  14. #34
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonsoir Patrick, Bonsoir mercatog,

    va faire un tour par la
    Merci pour le lien, je connaissais
    Mon dernier code n'utilise pas les dictionnaires de manière optimisée ?

    C'est toujours plus rapide de parcourir les éléments d'une variable tableau que de boucler sur les cellules d'une feuille. Ce sont là les abc et pas besoin de chercher midi à 14h
    C'est bien pour ça que le code d'Oliv le faisait, et que j'ai conservé ça dans mon adaptation de son code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    et puis pas la peine non plus de boucler sur les cells pour faires des tableaux
    Oui, ça non plus on ne le faisait pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TabloS1 = Range(S1.Range("A1"), S1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)).Value
    Mais merci de vos conseils

  15. #35
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bon je vois que je n'arrive pas à me faire comprendre depuis le début.
    J'en ai presque l'impression d'être un crétin.

    Alors voilà: quand je dis qu'il n'est pas nécessaire de boucler sur tableau puis sur dico, c'est que ce n'est pas la peine.
    Exemple:
    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
     
    Sub DictionnaireV3()
        T = Timer
        Dim k1, k2, i1, i2, n, i, fin, tablos1, tablos2
        Set mondico = Nothing
        Set mondico2 = Nothing
        Set mondico = CreateObject("Scripting.Dictionary")
        Set mondico2 = CreateObject("Scripting.Dictionary")
        If Sheets(1).Range("a" & Rows.Count).End(xlUp).Row > Sheets(2).Range("a" & Rows.Count).End(xlUp).Row Then
            fin = Sheets(1).Range("a" & Rows.Count).End(xlUp).Row
        Else
            fin = Sheets(2).Range("a" & Rows.Count).End(xlUp).Row
        End If
        tablos1 = Range(Sheets(1).Range("A1"), Sheets(1).Cells(fin, 2))
        tablos2 = Range(Sheets(2).Range("A1"), Sheets(2).Cells(fin, 2))
        'On a pris le plus grand nombre de lignes utilisé pour les feuilles 1 et 2
        For i = 1 To fin
            mondico.Add tablos1(i, 1), i                     'avec les clés en colonne A, les valeurs en colonne B
            mondico2.Add tablos2(i, 1), i                       'avec les clés en colonne A, les valeurs en colonne B
        Next
        k1 = mondico.keys
        i1 = mondico.items
        k2 = mondico2.keys
        i2 = mondico2.items
     
        For n = 0 To mondico.Count - 1
            If mondico2.exists(k1(n)) Then
                'MsgBox "les lignes communnes sont " & vbCrLf & "pour la feuill1 c'est la ligne :" & mondico.Item(k1(n)) & vbCrLf & "pour la feuill2 c'est la ligne :" & mondico2.Item(k1(n))
                tablos1(mondico.Item(k1(n)), 2) = "ok en lig : " & mondico2.Item(k1(n))
                tablos2(mondico2.Item(k1(n)), 2) = "ok en lig : " & mondico.Item(k1(n))
            Else
                tablos1(mondico.Item(k1(n)), 2) = "ko"
            End If
        Next
        Sheets(1).Range("A1:b" & fin) = tablos1
        Sheets(2).Range("A1:b" & fin) = tablos2
    purée de purée de purée.

    heu.... au plaisir

  16. #36
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour patrick,
    Tu as de la suite dans les idées, il manque des lignes à ton code, mais surtout j'ai une erreur 457 "Cette clé est déjà associée à un élément de cette collection" sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            mondico.Add tablos2(i, 1), i
    pour i = 9 , car c'est un doublon avec une ligne précédente !!!

    la même chose quand i est supérieur au nombre de ligne non vide de FEUIL2


    Attention à ton codage Sheets(1) l'index 1 n'est pas forcément sur la feuil1

  17. #37
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu n'as pas pensé à la possibilité d'une donnée existante en feuille2 et absente de feuille1?
    quand je dis qu'il n'est pas nécessaire de boucler sur tableau puis sur dico, c'est que ce n'est pas la peine.
    Pour remplir les dicos, tu boucles bien sur les tableaux, non?

    Enfin, tu auras besoin d'une autre boucle pour boucler sur les éléments de mondico2 (cf ma remarque plus haut)

    Bon je vois que je n'arrive pas à me faire comprendre depuis le début.
    Ou bien parce que tu as compris autre chose que les intervenants qui ont précédés.

  18. #38
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Chez moi sur 50000 lignes pour le test je n'ai aucune erreur.

    Ensuite pour le test de l'un dans l'autre et l'autre dans l'un, dans la SEULE BOUCLE DICO.

    AU LIEU DE BOUCLER SUR UBOUND(MONDICO) tu boucles sur la variable "fin" qui est la base et tu ajoutes la même condition que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if mondico2.exist 
    if mondico.exists 'ici tu inverses les dico et tablo
    et tu ajoutes l'inverse dans le "else" aussi.

    Tu aura tes "ko" et "ok" partout sur les deux sheets.

    Et oui j'ai de la suite dans les idées car depuis le début je suis persuadé qu'une seule boucle suffit pour la comparaison.

  19. #39
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    @patricktoulon
    Je ne vois pas de "ko" en 2ème feuille

    Car ça se peut qu'une donnée soit présente dans la feuille avec peu de ligne et absente de la feuille avec plus de données.

    C'est comme comparer les poissons d'eau douce et ceux marins.

    je te propose de relire le sujet initial. ça serait mieux pour tous.

  20. #40
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Voici une version corrigée de mon code car j'avais une erreur en cas de doublons dans TabloS2 :

    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
    54
    55
    56
    57
    58
    Sub DictionnaireV2()
        Dim T, truc, temp, i
        Dim mondico As Object
        Dim mondicoCommun As Object
        T = Timer
        Set mondico = CreateObject("Scripting.Dictionary")
        Set mondicoCommun = CreateObject("Scripting.Dictionary")
    
        Set s1 = Worksheets("Feuil1")
        Set S2 = Worksheets("Feuil2")
    
        If S2.UsedRange.Rows.Count < s1.UsedRange.Rows.Count Then
            Set SR = s1
            Set s1 = S2
            Set S2 = SR
            Set SR = Nothing
        End If
    
        Dim TabloS1 As Variant
        Dim TabloS2 As Variant
    
        TabloS1 = Range(s1.Range("A1"), s1.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1))
        TabloS2 = Range(S2.Range("A1"), S2.Cells(Rows.Count, 1).End(xlUp).Offset(0, 1))
    
        For i = 1 To UBound(TabloS1, 1)
            If Not mondico.Exists(TabloS1(i, 1)) Then mondico.Add TabloS1(i, 1), TabloS1(i, 1)
        Next i
    
        For i = 1 To UBound(TabloS2, 1)
            If mondico.Exists(TabloS2(i, 1)) Then
               If Not mondicoCommun.Exists(TabloS2(i, 1)) Then mondicoCommun.Add TabloS2(i, 1), TabloS2(i, 1)
                TabloS2(i, 2) = "OK"
            Else
                TabloS2(i, 2) = "ko"
            End If
        Next i
    
        For i = 1 To UBound(TabloS1, 1)
            If mondicoCommun.Exists(TabloS1(i, 1)) Then
                TabloS1(i, 2) = "OK"
            Else
                TabloS1(i, 2) = "ko"
            End If
        Next i
    
    Debug.Print Timer - T
    Debug.Print mondico.Count
    Debug.Print mondicoCommun.Count
        Application.StatusBar = mondicoCommun.Count
        Application.ScreenUpdating = False
        s1.Range("A1:b" & UBound(TabloS1)) = TabloS1
    
        S2.Range("A1:b" & UBound(TabloS2)) = TabloS2
        Application.ScreenUpdating = True
    Debug.Print "DictionnaireV2 :"; Timer - T
        MsgBox "DictionnaireV2 :" & vbCr & Timer - T
    
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Comparer deux colonnes
    Par gandalfthegrey dans le forum Excel
    Réponses: 6
    Dernier message: 30/01/2008, 11h57
  2. Comparer deux colonnes d'une même table
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 08/01/2008, 10h05
  3. Comparer deux colonnes adjacentes une à une sur mon tableau?
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/12/2007, 10h11
  4. Réponses: 3
    Dernier message: 22/10/2006, 23h15
  5. comparer deux colonnes sur Excel
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/12/2005, 10h50

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