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 et insérer les occurences dans une troisième


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Comparer deux feuilles et insérer les occurences dans une troisième
    Bonjour le forum,

    Je voudrais créer une macro qui compare deux listes, dans deux feuilles séparées, et que lorsque il y a occurrence, les données soient reprises dans la troisième feuille.

    La première feuille correspond au score des joueurs à J-1, la seconde liste , le score du jour.
    Chaque feuille contient le nom du joueur (colonne A) son nombre de points(colonne B) ,son état (colonne C), sa distance (colonne D), son alliance(colonne D).

    En gros, ce que je voudrai :

    Si joueur existe dans colonne A de la feuille1 et dans la colonne A de la feuille 2, alors on le reporte dans la feuille trois.

    J'ai bricolé un code pour la macro, mais quand je veux la lancer j'ai une erreur de boucle with ou variable non définie . Je suis donc mal parti

    Quelqu'un aurait-il une idée sur le problème?

    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
     
    Sub comparer_score()
    Dim ancien_classement As Worksheet, classement_actuel As Worksheet, resultat As Worksheet, a, b 'Je déclare mes feuilles pour pouvoir manipuler leur contenu
    list1 = ancien_classement.Range("A").End(xlDown).Row'list1 correspond à la colonne A de la 1ere feuille(ancien classement)
    list2 = classement_actuel.Range("A").End(xlDown).Row'list2 correspond à la colonne de la feuille2 (classement actuel)
    list3 = resultat.Range("A").End(xlDown).Row'list3 me servira à comparer les scores
    For a = 1 To list1
    For b = 1 To list2
        If ancien_classement.Range("A" & a).Value = classement_actuel.Range("A" & a).Value Then'Si le om du joueur apparaît dans les colonnes A des deux premières feuilles
        resultat.Range("A" & a).Value = classement_actuel.Range("A" & b).Value'On affecte le nom du joueur dans la colonne A de la feuille 3
        resultat.Range("B" & a).Value = ancien_classement.Range("B" & a).Value'On affecte a la colonne B de la feuille 3 l'ancien nombre de points du joueur
        resultat.Range("C" & a).Value = classement_actuel.Range("C" & b).Value
        resultat.Range("D" & a).Value = classement_actuel.Range("D" & b).Value
        resultat.Range("E" & a).Value = classement_actuel.Range("B" & b).Value
     
     
            End If
         Next
      Next
     
     
     
    End Sub
    J'ai un soucis, j'ai un message d'erreur qui apparaît :

    Variable objet ou variable de bloc with non définie.

    Auriez vous au moins une piste à me conseiller ?

    Merci pour votre aide.
    Newbie_vba.

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    La piste c'est à toi à nous la donner .. en nous disant sur qu'elle ligne l'erreur ...

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour et merci bbil.

    Désolé j'ai oublié ce point crucial.

    Le message intervient sur la 2eme ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list1 = ancien_classement.Range("A").End(xlDown).Row

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    il manque un numéro de ligne :

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci bbil .

    Le message est toujours là, voici ce que j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list1 = ancien_classement.Range("A", 1).End(xlDown).Row
    Merci beaucoup.

  6. #6
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    ou tu vois une virgule la : ?

    Citation Envoyé par bbil Voir le message
    il manque un numéro de ligne :

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci !

    J'ai tenté les deux commandes en fait, bon je n'ai posté que la seconde, mais j'ai essayé

    Et le problème persiste.
    Désolé de vous embêter avec un tel détail.

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par Newbie_vba Voir le message
    Merci !

    J'ai tenté les deux commandes en fait, bon je n'ai posté que la seconde, mais j'ai essayé

    Et le problème persiste.
    Désolé de vous embêter avec un tel détail.
    tu as "tenté" quoi exactement ? peu-tu nous monter la ligne complète ? est-ce toujours le même problème ?

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé de mettre cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list1 = ancien_classement.Range("A1").End(xlDown).Row
    à la place de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list1 = ancien_classement.Range("A").End(xlDown).Row
    J'ai toujours le même message :

    variable objet ou variable de bloc With non définie.


    Je débute, , j'essaie de comprendre, merci pour votre aide en tout cas.

  10. #10
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    Tu indiques :

    List1 correspond à la colonne A de la 1ere feuille (ancien classement)
    Si le nom de ta feuille est « ancien_classement », tu dois écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List1 = Worksheets(“ancien_classement”).Range("A1").End(xlDown).Row
    Autre solution, tu utilises l’instruction Set pour associer ta feuille à une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim WsAC as Worksheet
    Set WsAC = Worksheets("ancient_classement")
    List1 = WsAC.Range("A1").End(xlDown).Row 'list1 correspond à la colonne A de la 1ere feuille(ancien classement)
    Idem pour les autres feuilles.

    Cordialement.

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour et MERCI gFZT82,

    Je comprends mieux comment définir ancien_classement en tant que worksheet.

    Je vais essayer de refaire la macro avec vos explications.

    Je posterai le retour.

    Merci beaucoup.

  12. #12
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Essai pour voir si cela te conviens :
    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
    60
    61
    62
    63
     
    Sub comparer_score()
     
        Dim Ancien_classement As Worksheet
        Dim Classement_actuel As Worksheet
        Dim Resultat As Worksheet
        Dim Plage_Ancien As Range
        Dim Plage_Actuel As Range
        Dim Cel_Find As Range
        Dim Cel As Range
        Dim Ligne As Long
     
        'pour le test
    '    Set Ancien_classement = Worksheets("Feuil1")
    '    Set Classement_actuel = Worksheets("Feuil2")
    '    Set Resultat = Worksheets("Feuil3")
     
        'défini les plages de recherche
        With Ancien_classement
     
            Set Plage_Ancien = .Range(.[A1], .[A65536].End(xlUp))
     
        End With
     
        With Classement_actuel
     
            Set Plage_Actuel = .Range(.[A1], .[A65536].End(xlUp))
     
        End With
     
        'recherche la dernière ligne non vide
        With Resultat
     
            Ligne = .Range("A" & .Rows.Count).End(xlUp).Row
            If Ligne > 1 Then Ligne = Ligne + 1
     
        End With
     
        'effectue la recherche pour chaque nom
        For Each Cel In Plage_Ancien
     
            Set Cel_Find = Plage_Actuel.Find(Cel, , xlValues, xlWhole)
     
            'et si trouvé, envoi des résultats dans la feuille Resultat
            If Not Cel_Find Is Nothing Then
     
                With Resultat
     
                    .Range("A" & Ligne) = Cel 'nom du joueur
                    .Range("B" & Ligne) = Cel.Offset(0, 1) 'Ancien score
                    .Range("C" & Ligne) = Cel_Find.Offset(0, 2) 'colonne C
                    .Range("D" & Ligne) = Cel_Find.Offset(0, 3) 'colonne D
                    .Range("E" & Ligne) = Cel_Find.Offset(0, 1) 'colonne B
     
                    Ligne = Ligne + 1
     
                End With
     
            End If
     
        Next Cel
     
    End Sub
    Hervé.

  13. #13
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    oups ... j'avais pas vu que ces variables worksheet n'étaient pas affectées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim ancien_classement As Worksheet, classement_actuel As Worksheet, resultat As Worksheet, a, b 'Je déclare mes feuilles pour pouvoir manipuler leur contenu
    set ancien_classement  = ThisWorkbook.sheets("ancien_classement")
    set classement_actuel   = ThisWorkbook.sheets("classement_actuel")
    set resultat  = ThisWorkbook.sheets("resultat")
     
    list1 = ancien_classement.Range("A1").End(xlDown).Row'list1 correspond à la colonne A de la 1ere feuille(ancien classement)
    (...)

Discussions similaires

  1. Comparer deux feuilles et supprimer les doublons
    Par xoco07 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/03/2014, 20h30
  2. [XL-2003] Comparer deux feuilles et copier les valeurs équivalentes sur une troisième
    Par Julzz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/08/2011, 14h02
  3. [XL-2007] Comparer deux feuilles et supprimer les doublons
    Par trhibal dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 01/07/2011, 03h18
  4. Comparer deux feuilles et supprimer les doublons
    Par Lison Lisette dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/10/2010, 22h35
  5. [RegEx] Regex : récupérer toutes les occurences dans une chaîne
    Par Poulpynette dans le forum Langage
    Réponses: 1
    Dernier message: 10/10/2006, 10h14

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