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 :

VBA - Excel - comparaison de deux feuilles


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Par défaut VBA - Excel - comparaison de deux feuilles
    Bonjour,

    Bon, ma question va certainement paraitre toute simple, mais bon, je suis perdue là, alors s'il vous plait, aidez-moi !!!
    Voilà, j'ai deux feuilles excel :
    Feuil1 :
    Nom 1976 1979 1990
    1,3 DP 1 1
    4,5 EX 1 1


    Feuil2 :
    Nom 1976 1979 1996
    4,5 EX 1 1
    8,9 TH 1 1

    Et j'aimerais obtenir en feuil3,
    Nom 1976 1979
    4,5 EX 1 1
    C'est à dire que les champs communs entre feuil1 et feuil2.

    J'avais penser à du VBA, mais j'ai du mal à concevoir mon algo, sinon, jai essayé avec un filtre élaboré mais il ne fonctionne que sur le nom, pas sur les années (j'ai peut-ête loupé une étape !!!).

    Merci de votre aide.

    Céline (ben oui, parce que des céline y'en a plein alors que toto, c'est plus rare )

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Pour le principe :
    Tu lis ligne par ligne les données de la première colonne de ta feuille 1
    Pour chaque ligne, tu recherches la donnée correspondante dans feuille 2
    - Si elle existe, tu vérifies que la donnée de la colonne 2 de la feuille 2 correspond à la donnée de la colonne 2 de la feuille 1
    - Si oui, tu incrémentes le N° de ligne de la feuille 3 et tu copies les données sur ce nouveau N° de ligne.
    - Si non, tu passes à la ligne suivante feuille1
    Pour la recherche, tu as deux solutions : si tu peux trier les données des feuilles 1 et 2, tu peux lire ta feuille 2 ligne par ligne. Sinon, utilise Find (F1...)
    Pour ma part, comme il n'est pas toujours possible de trier les données, je préfère utiliser Find.
    Fais quelque chose et montre-nous si tu as des difficultés
    A+

  3. #3
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Par défaut
    OK, merci, on dirait que je suis partie puor du VBA. C'est pas gagné !!!

    Bon, j'essaie et si je galère, je reviens

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Sans VBA le résultat ne sera pas exactement le même. Tu garderas des cellules vides.
    Cela dépend combien de fois tu comptes répéter l'opération. Si c'est du one-shot, tu peux utiliser des fonctions excel. Sinon il faudra du VBA comme indiqué par ouskel'n'or.
    En gros dans la feuille 3, cellule C3, on met la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(Feuil2!C3=""; ""; SI(ESTERREUR(RECHERCHEH(Feuil2!C3; Feuil1!3:3; 1; FAUX)); ""; Feuil2!C3))
    (Il faudra adapter les fonctions selon le langage d'Excel)
    Et il suffit d'étendre cette formule sur la Feuil3 sur la même plage que celle utilisée dans la Feuil2. Tu ne verras alors apparaître que les cellules de la feuil2 qui sont dans la feuil1 sur la même ligne (attention aux espaces superflux).
    En esperant que ca t'aidera...

  5. #5
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Par défaut
    Bonjour ! et merci pour votre aide.
    En fait, c'est un peu plus compliqué car je ne compare pas les fichiers lignes à lignes, je n'ai pas le meme nombre d'enregistrement entre la feuille 1 et la feuille 2, c'eut été trop facile !!!
    En fait, il faut d'abord que je recherche dans la feuille 2, les lignes où j'ai les meme noms que dans la feuille 1, ensuite, que je récupérer les années qui sont en commun, puis que je regarde si il y a un "1" pour le meme nom à la meme année. Oui, en fait, ça se résume à ça : "il faut que je trouve les cases où il y a un "1" pour le meme nom à la meme année".

    J'avoue que je galère complètement. Je suis totalement perdue. Mais je ne désespère pas, je vais bien trouver une solution.

    Est-ce que quelqu'un pourrait juste m'indiquer comment sélectionner mes années de la feuille 1 en fonction des années présentes dans ma feuille 2, ça m'aiderait beaucoup. Les champs concernant les années se situent en ligne 1, à partir de C1.
    Merci.

    Céline

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Je vois que tu veux vraiment le faire en VBA.
    Voici une methode possible :
    ¤ Faire une copie exacte de la Feuil2 en Feuil3
    ¤ Pour chaque année de la Feuil2, si elle n'est pas dans la Feuil1, supprimer complètement la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    line1 = 1 ' line1 étant la ligne ou se trouve les années
    col1 = 1  ' col1 étant la colonne ou se trouve les noms
    For i = 255 to col1 Step -1
    	annee = Feuil3.Cells(line1, i)
    	If annee <> "" Then
    		If Feuil1.Range(line1 & ":" & line1).Find(annee) Is Nothing Then
    			Feuil3.Cells(1, i).EntireColumn.Delete
    		End If
    	End If
    Next i
    Attention : selon le format de tes données, il faudra peut-être ajouter des paramètres à la fonction Find
    Rem. On fait une boucle For avec un Step -1 car, quand tu supprimes une colonne, cela les décale vers la gauche. 255 = nbr de colonnes max (mais on peut faire plus rapide).
    ¤ Faire la même chose sur les noms, sauf que l'on parcoure cette fois-ci les lignes et on recherche le nom dans la 1ere colonne de la Feuil1.
    Attention : pour les noms, ne pas commencer la boucle à 255, mais à Feuil1.UsedRange.Rows.Count + Feuil1.UsedRange.Row, càd le numéro de la dernière ligne utilisée.

    Rem. Si dans la Feuil1 et la Feuil2, la cellule en haut à gauche n'est pas identique, terminer la 1ere boucle For à line1 + 1, et la 2eme à col1 + 1.

    En esperant que ca va t'aider.

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Hello dadavyvy,
    toto14 ne veux pas supprimer une colonne si la donnée n'existe pas, une autre donnée située dans la même colonne et correspondant à ses critères peut exister pour la même année.
    Il est vrai qu'un plus grand nombre de lignes dans l'exemple que tu donnes, toto, pourrait éclaircir ce point là
    A+

  8. #8
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Par défaut
    Bonjour !

    Voici un exemple pour chaque fichier.

    Merci.
    Images attachées Images attachées   

  9. #9
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Par défaut
    Merci beaucoup, c'est génial !!! Première étape faite !!!
    Voici le code que j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    col1 = 3  
    Dim annee As Integer
     
    For i = 255 To col1 Step -1
        annee = Feuil3.Cells(1, i)
        If Not annee Then
            If Feuil2.Range("1:1").Find(annee) Is Nothing Then
                Feuil3.Cells(1, i).EntireColumn.Delete
            End If
        End If
    Next i
    merci à dadavyvy, c'était ça mais juste sur la première ligne de mes feuilles.

    Maintenant, il ne me reste plus qu'à sélectionner les noms identiques pour les deux feuilles (ça marche avec un filtre) et qu'à comparer mes deux feuilles sachant que mes deux plages seront de meme dimensions !

    Je vous tiens au courant des événements !

    Encore merci ! Je vais pouvoir passer un bon week-end !

  10. #10
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 29
    Par défaut
    Je vais mettre le post en 'Résolu'. Voici un code qui fonctionne. Il me reste à le généraliser pour que tout se fasse de façon automatique (que l'utilisateur n'ait qu'à indiquer les deux fichiers excel à comparer) et que le nombre de lignes et de colonnes soit automatique. Quand j'aurais fini tout ça, je vous mettrais le code final, ça peut toujours intéresser certains.

    En tout cas, encore merci.
    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
    Sub comp_fichier()
    ' 1ere étape : mêmes années
    col1 = 3  ' col1 étant les colonnes où se trouvent les années
    Dim annee As Integer
     
    For i = 255 To col1 Step -1
        annee = Feuil3.Cells(1, i)
        If Not annee Then
            If Feuil2.Range("1:1").Find(annee) Is Nothing Then
                Feuil3.Cells(1, i).EntireColumn.Delete
            End If
        End If
    Next i
     
    ' 2ème étape : mêmes noms
    ligne1 = 3
     
    For j = 255 To ligne1 Step -1
        nom = Feuil3.Cells(j, 1)
        If nom <> "" Then
            If Feuil2.Range("A:A").Find(nom) Is Nothing Then
                Feuil3.Cells(j, 1).EntireRow.Delete
            End If
        End If
    Next j
     
    ' 3ème étape : comparaison des 2 matrices
    Sheets("Feuil3").Select
    Sheets.Add
    Sheets("Feuil3").Select
    Range("A1:F2").Select
    Selection.Copy
    Sheets("Feuil4").Select
    ActiveSheet.Paste
    Sheets("Feuil3").Select
    Range("A1:B10").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Feuil4").Select
    Columns("A:B").Select
    ActiveSheet.Paste
    Range("C3").Select
    Application.CutCopyMode = False
    ActiveCell.FormulaR1C1 = "=IF(Feuil2!RC+Feuil3!RC>=2,""X"","" "")"
    Range("C3").Select
    Selection.AutoFill Destination:=Range("C3:F3"), Type:=xlFillDefault
    Range("C3:F3").Select
    Selection.AutoFill Destination:=Range("C3:F10"), Type:=xlFillDefault
    Range("C3:F10").Select
    Range("A1").Select
     
    End Sub

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

Discussions similaires

  1. VBA-Excel Comparaison 2 feuilles
    Par PiuPiu dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 15/10/2007, 18h05
  2. Macro VBA Excel : Comparaison des deux 1ères colonnes de 2 fichiers Excel
    Par techneric dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/01/2007, 10h00
  3. [VBA]excel comparaison de chaine de caractere
    Par ogenki dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2006, 15h32
  4. [VBA Excel] Remettre toute une feuille par défaut
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/12/2005, 16h56
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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