Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/09/2011, 10h19   #1
Invité de passage
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 0
Points : 0
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 :
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.
Newbie_vba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h40   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
La piste c'est à toi à nous la donner .. en nous disant sur qu'elle ligne l'erreur ...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h44   #3
Invité de passage
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 0
Points : 0
Bonjour et merci bbil.

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

Le message intervient sur la 2eme ligne :

Code :
list1 = ancien_classement.Range("A").End(xlDown).Row
Newbie_vba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h46   #4
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
il manque un numéro de ligne :
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h52   #5
Invité de passage
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 0
Points : 0
Merci bbil .

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

Code :
list1 = ancien_classement.Range("A", 1).End(xlDown).Row
Merci beaucoup.
Newbie_vba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h54   #6
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
ou tu vois une virgule la : ?

Citation:
Envoyé par bbil Voir le message
il manque un numéro de ligne :
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h57   #7
Invité de passage
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 0
Points : 0
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.
Newbie_vba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 11h04   #8
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
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 ?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 11h13   #9
Invité de passage
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 0
Points : 0
J'ai essayé de mettre cette ligne :

Code :
list1 = ancien_classement.Range("A1").End(xlDown).Row
à la place de cette ligne :

Code :
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.
Newbie_vba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 11h42   #10
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 692
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 692
Points : 1 443
Points : 1 443
Bonjour,

Tu indiques :

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

Code :
List1 = Worksheets(“ancien_classement”).Range("A1").End(xlDown).Row
Autre solution, tu utilises l’instruction Set pour associer ta feuille à une variable.

Code :
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.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 11h46   #11
Invité de passage
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 0
Points : 0
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.
Newbie_vba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 11h51   #12
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Essai pour voir si cela te conviens :
Code :
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é.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/09/2011, 11h55   #13
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
oups ... j'avais pas vu que ces variables worksheet n'étaient pas affectées :

Code :
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)
(...)
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h36.


 
 
 
 
Partenaires

Hébergement Web