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 deux feuilles sans repasser plusieurs fois par les mêmes valeurs ("crible")


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut Comparer deux feuilles sans repasser plusieurs fois par les mêmes valeurs ("crible")
    Bonjour,
    Voilà une question générale mais qui se pose à moi dans le cadre de VBA.
    Je veux comparer ligne à ligne 4 champs sur deux feuille F1 et F2 contenant 50000 lignes au moins. Les lignes correspondantes peuvent être n'importe où (par exemple ligne_1 de F1 = ligne_45987 de F2 !), voire ne pas exister dans un sens ou dans l'autre...

    J'ai écrit un programme VBA qui fait ça, mais bien sûr il est long car il regarde chaque ligne de F1 pour la comparer à chaque ligne de F2. Même quand on trouve une correspondance pour une certaine ligne de F1 dans F2, la ligne dans F2 va être retestée pour les valeurs suivantes des lignes de F1, ce qui est inutile (car à une ligne correspond au plus une ligne).
    Sachant que je ne veux pas supprimer les lignes dans F2 car j'ai besoin du numéro de ligne exact pour savoir qui concorde avec quoi entre F1 et F2, comment puis-je faire en sorte de ne pas retester les lignes déjà en correspondance (un peu comme dans un crible) ?

  2. #2
    Membre expérimenté Avatar de lucasgaetan
    Homme Profil pro
    dessinateur BE
    Inscrit en
    Août 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : dessinateur BE
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 175
    Par défaut
    Bonjour totojava,

    Tu pourrait créer une variable de type string, où tu insert tes lignes ayant une correspondance sur 5 caractères par exemple.
    du genre:
    Ma_variable = "00152;01245;00023" etc...
    puis avant de tester ta ligne tu fais un test "instr" avec le n° de ligne

    sinon tu créais une colonne où tu dis si t'as ligne à été tester, et pourquoi pas la masquer pour l’esthétisme.

    bon courage.

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    ok pour la comparaison, qui équivaut selon tes explications à trouver les lignes des deux feuilles qui ont 4 champs identiques ... mais pour faire quoi ensuite ? Car sans cette explication, il y a des milliers de possibilités.

    Par exemple, en oubliant le VBA (pour commencer), la formule NB.SI.ENS() appliquée sur une nouvelle colonne de chacun des deux tableaux va très rapidement te sortir les occurrences identiques et te les dénombrer, de là tu viens de réaliser 80% du travail, quelle que soit la finalité (que tu n'as hélas pas exposé).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    @lucasgaetan : hum hum, désolé mais je ne comprends pas le but/l'intérêt de Ma_variable...
    (Rappel : lorsque je trouve une correspondance, il n'y en a pas d'autres, c'est certain.)

    J'ai bien pensé à créer une colonne supplémentaire sur la feuille 2 et la marquer d'un "x" à chaque fois qu'une ligne est mise en correspondance avec une autre de la feuille 1, mais ça oblige à faire un test supplémentaire (i.e. "est-ce que cette ligne contient un "x" dans cette colonne ? Si oui, passer à la suivante") à chaque nouvelle boucle sur la feuille 2 pour savoir si la ligne doit être utilisée ou non. Et ce test se fera donc autant de fois qu'il y a ligne sur la feuille 1.
    Au final, pas sûr que je gagne vraiment quelque chose à remplacer un test avec 3 "And" par un test sur "x" + éventuellement ce test avec les 3 "And" !!

    J'avais plutôt penser à définir un tableau contenant initialement la colonne de valeurs à tester puis à "retirer" le numéro de ligne de cette plage de valeurs à chaque fois que je trouvais une correspondance, mais est-ce que de réarranger le tableau pour en diminuer la taille à chaque correspondance ne va pas compenser négativement le gain sur le nombre de lignes à tester ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    @joe.levrai : Je connais les fonctions directes dans les cellules Excel, mais je pensais précisément pour avoir fait des essais que les performances seraient meilleures avec du VBA.
    Par ailleurs, le code de ma macro sera réexploitable (avec modifications éventuelles) à l'infini alors que refaire les formules à chaque fois, c'est un peu "galère".
    Par ailleurs, une fois que j'ai identifié les lignes en correspondance, je fais un test supplémentaire sur un autre champ (c'est cela qui m'intéresse), facile à faire en VBA dans la même macro...

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    alors explique plus précisément ton projet, quelques copies écran de l'état initial, de l'état final.
    et vraiment ce que tu fais ensuite. Là tu rajoutes une action supplémentaire qui n'était pas abordée dans ton premier message

    par exemple, on croit "deviner" qu'il faut que les 4 champs de la feuille 1 soit en correspondance avec 4 autres champs de la feuille 2. Et ensuite, on a l'impression que "peut-être" c'est un seul champs en correspondance qui permet de toper la ligne comme "correspondante" ? Ca fait beaucoup de devinettes pour nous qui n'avons pas ton projet sous les yeux.
    Si les 4 champs doivent correspondre, on peut utiliser une formule matricielle dans laquelle on concatène les 4 champs dans un critère unique.

    Et je te garanti à 90%, pour un dénombrement comme celui-là, que c'est Excel qui va gagner face à VBA, autant manipuler les outils excel par VBA au pire.
    Tous les outils excel sont déjà compilés contrairement aux actions VBA qui sont interprétées...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    Pour avoir une idée (et éventuellement faire des remarques constructives...), voici la portion de code que j'utilise avec les deux boucles imbriquées. J'ai "anonymisé" le nom des variables (même les compteurs que je nomme de façon plus explicite en vrai). Par ailleurs, je ne fais plus que 3 tests au lieu de 4 (sur les entités A, B et C) :

    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
    Dim vAFeuille(1 To 2) As Integer
    Dim vBFeuille(1 To 2) As Integer
    Dim vCFeuille(1 To 2) As Integer
     
    ' [... CODE ...]
    ' vAFeuille, vBFeuille, vCFeuille contiennent maintenant les numéros des colonnes 
    ' contenant les champs A, B et C à tester, et ce sur chaque feuille 1 et 2 
     
    ' Variables de raccourci pour éviter de manipuler des noms à rallonge dans le code :
    Dim vA1 As Date
    Dim vA2 As Date
    Dim vB1 As Date
    Dim vB2 As Date
    Dim vC1 As String
    Dim vC2 As String
    Dim vZ1 As String
    Dim vZ2 As String
     
    ' Compteur boucle externe :
    Dim i As Long
    i = 2
    ' Compteur boucle interne : 
    Dim j As Long
    ' Résultat du test : 
    Dim trouve As Boolean
     
    Do Until (feuille(1).Cells(i, 1) = "")   ' On parcourt l'ensemble du tableau feuille 1 jusqu'à la dernière ligne
        feuilleResultat.Cells(i, 1) = i   ' On écrit le numéro de ligne en cours
        vA1 = feuille(1).Cells(i, vAFeuille(1))  ' Raccourci
        vB1 = feuille(1).Cells(i, vBFeuille(1))  ' Raccourci
        vC1 = feuille(1).Cells(i, vCFeuille(1))  ' Raccourci
        j = 1  ' (Ré)initialisation variable boucle interne
        trouve = False  ' (Ré)initialisation 
        Do Until (trouve Or feuille(2).Cells(j, 1) = "")  ' !!! On parcourt l'ensemble du tableau feuille 2 !!! 
            j = j + 1 
            vA2 = feuille(2).Cells(i, vAFeuille(2))  ' Raccourci
            vB2 = feuille(2).Cells(i, vBFeuille(2))  ' Raccourci
            vC2 = feuille(2).Cells(i, vCFeuille(2))  ' Raccourci
            trouve = ((vA1 = vA2) And (vB1 = vB2) And (vC1 = vC2))  ' test sur les trois colonnes
        Loop
     
        If trouve Then
            vZ(1) = feuille(1).Cells(i, vZFeuille(1))  ' Raccourci
            vZ(2) = feuille(2).Cells(i, vZFeuille(2))  ' Raccourci
            feuilleResultat.Cells(i, 3) = j 
            feuilleResultat.Cells(i, 2) = vZ(1)
            feuilleResultat.Cells(i, 4) = vZ(2)
            ' Mise en évidence si ça correspond bien : 
            If (vZ(1) Like vZ(2)) Then
                feuilleResultat.Cells(i, 2).Interior.ColorIndex = 4
                feuilleResultat.Cells(i, 4).Interior.ColorIndex = 4
            Else
                feuilleResultat.Cells(i, 2).Interior.ColorIndex = 3
                feuilleResultat.Cells(i, 4).Interior.ColorIndex = 3
            End If
        End If
        i = i + 1
    Loop

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparer deux matrices sans passer par une boucle
    Par Djeu Kuru dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/01/2017, 09h17
  2. comparer deux feuilles excel ss VBA
    Par washh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/08/2008, 16h14
  3. comparer deux feuilles du même classeur
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 30
    Dernier message: 20/05/2008, 11h51
  4. Réponses: 7
    Dernier message: 24/08/2007, 14h29
  5. Réponses: 4
    Dernier message: 02/09/2004, 21h43

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