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 23/08/2011, 11h44   #1
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
Par défaut Copier en comparant deux numéros

Bonjour à tous!

Je vous explique mon blocage:

Je copie d'une feuille à une autre des informations (Feuil1 et Feuil2).
J'aimerais avant de copier mes données de la Feuil1 à la Feuil2, comparer les nombres des colonnes B.
Si le nombre que je souhaite coller existe déja dans la Feuil2, je souhaite remplacer la ligne par la nouvelle (Feuil1).
En revanche, si le nombre n'existe pas, j'aimerai l'ajouter mais par ordre croissant (qu'il trouve tout seul sa place au milieu de tous..).

Est-ce possible?

Merci d'avance pour votre aide

Chouki60.
chouki60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 13h53   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Bonjour,

Une possibilité serait:

- Pour chaque ligne de ta feuille 1 tester si ton nombre de ta colonne B est le même dans la feuille 2.

- Si oui, tu remplaces la ligne correspondante dans la feuille 2. Si non, tu la copies à la fin dans la feuille 2

- Et pour finir tu tries les données de la feuille 2 suivant ta colonne B.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 09h27   #3
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
Bonjour à tous,

Voici le code que j'ai fait ce matin, mais (evidemment) cela ne fonctionne pas..
J'ai une erreur au niveau de la ligne 6 : "Erreur d'exécution '1004': erreur définie par l'application ou par l'objet".

Quelqu'un pourrait me dire comment corriger cette erreur?

Merci !

Chouki.

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
Private Sub recherche()
Dim ws1 As Worksheet, ws2 As Worksheet, i1, i2, k, kk, z
Set ws1 = Worksheets("Essai")
Set ws2 = Worksheets("Recopie")
' tableau de page essai
i1 = ws1.Range("A8").End(20).Row
' tableau de page recopie
i2 = ws2.Range("A8").End(35).Row
'je me positionne page essai
With ws1
'au niveau du 8
  For k = 8 To i1
    'je commence au B8
    z = .Range("B" & k)  
 'je me met maintenant à 8 mais sur la feuille recopie    
     For kk = 8 To i2  
     'je commence au B8
        If z = ws2.Range("B" & kk) Then
        'si c'est le même numéro alors je recopie toutes les données de la feuille essai dans la feuille recopie
        ws2.Range("B" & i3 + 8) = z
        ws2.Range("E" & i3 + 8) = .Range("C" & k)
        ws2.Range("F" & i3 + 8) = .Range("D" & k)
        ws2.Range("G" & i3 + 8) = .Range("E" & k)
        ws2.Range("H" & i3 + 8) = .Range("F" & k)
        ws2.Range("I" & i3 + 8) = .Range("G" & k)
        ws2.Range("O" & i3 + 8) = .Range("H" & k)
        ws2.Range("P" & i3 + 8) = .Range("I" & k)
        ws2.Range("Q" & i3 + 8) = .Range("J" & k)
        ws2.Range("R" & i3 + 8) = .Range("K" & k)
        ws2.Range("S" & i3 + 8) = .Range("L" & k)
        ws2.Range("T" & i3 + 8) = .Range("M" & k)
        ws2.Range("U" & i3 + 8) = .Range("N" & k)
        ws2.Range("V" & i3 + 8) = .Range("O" & k)
        ws2.Range("W" & i3 + 8) = .Range("P" & k)
        ws2.Range("X" & i3 + 8) = .Range("Q" & k)
        ws2.Range("Y" & i3 + 8) = .Range("R" & k)
        ws2.Range("Z" & i3 + 8) = .Range("S" & k)
        ws2.Range("AA" & i3 + 8) = .Range("T" & k)
        ws2.Range("A" & i3 + 8) = .Range("A" & k)      
        'j'augmente de 1
        i3 = i3 + 1
        End If
     Next
  Next
End With
End Sub
chouki60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 11h16   #4
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Quelques pistes:

- C'est pas obligatoire en VBA mais c'est quand même mieux de typer ses variables donc tu pourrais déclarer les variables i1, i2, k, kk, z comme des types Long.

- Pour trouver la dernière ligne de ta feuille c'est plutôt:

Code :
1
2
i1 = ws1.Range("A8").End(xlDown).Row
i2 = ws1.Range("A8").End(xlDown).Row
- Pour copier une ligne entière, tu peux utiliser:

Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 14h05   #5
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
Merci beaucoup pour ces conseils ! J'ai donc un programme qui fonctionne concernant le test d'un numéro existant.

J'ai aussi réussi à mettre les données dans l'odre croissant.

Par contre, je n'arrive pas à copier les données (si le numéro n'existe pas) à la place de la première ligne vide.

Voici ce que j'ai fait :
Code :
1
2
3
4
5
6
7
8
9
 ' Dernière ligne vide dans la feuille recopie
    lgLigFinH = Worksheets("Recopie").Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
    ' Dernière ligne dans la feuille essai
    lgLigFinM = Worksheets("Essai").Range("A" & Cells.Rows.Count).End(xlUp).Row
 
    ' Copier les données de la feuille essai dans la première ligne vide de la feuille recopie
    Worksheets("Essai").Range("A8:B" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("A" & lgLigFinH)
    Worksheets("Essai").Range("C8:G" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("E" & lgLigFinH)
    Worksheets("Essai").Range("H8:T" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("O" & lgLigFinH)
Le problème est que ce bout de code tourne à l'infini, c'est à dire qu'il me recopie l'ensemble des données plusieurs fois, jusqu'à ce que la feuille recopie soit remplie..

Une astuce ?
chouki60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 14h42   #6
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Attention à lgLigFinM, il manque '+1' à la fin pour que ça désigne la première ligne vide de ta feuille de destination.

Sinon pour le fait que ça te remplisse ta feuille, c'est probablement que ce code se trouve dans une boucle et que la condition de sortie de la boucle n'est pas bonne.
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 08h46   #7
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
Ok, j'ai modifié la boucle, ça fonctionne mieux !
Mais toujours un petit bug

Ce qui ne fonctionne pas :
Lorsque deux numéros sont identiques entre la feuille "essai" et la feuille "recopie", je veux remplacer les données de la feuille "recopie" par les données de la feuille "essai".
Ceci fonctionne bien cependant, le code que j'ai fait me copie deux fois la ligne à remplacer..

Une idée?

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
Private Sub recherche()
Dim ws1 As Worksheet, ws2 As Worksheet, i1 As Long, i2 As Long, k As Long, kk As Long, z As Long
Set ws1 = Worksheets("Essai")
Set ws2 = Worksheets("Recopie")
i1 = ws1.Range("A8").End(xlDown).Row
i2 = ws2.Range("A8").End(xlDown).Row
With ws1
  For k = 8 To i1
    z = .Range("B" & k)    
     For kk = 8 To i2   
        If z = ws2.Range("B" & kk) Then             
        'si c'est le même numéro alors je recopie toutes les données de la feuille essai dans la feuille recopie
        ws2.Range("B" & kk) = z
        ws2.Range("E" & kk) = .Range("C" & k)
        ws2.Range("F" & kk) = .Range("D" & k)
        ws2.Range("G" & kk) = .Range("E" & k)
        ws2.Range("H" & kk) = .Range("F" & k)
        ws2.Range("I" & kk) = .Range("G" & k)
        ws2.Range("O" & kk) = .Range("H" & k)
        ws2.Range("P" & kk) = .Range("I" & k)
        ws2.Range("Q" & kk) = .Range("J" & k)
        ws2.Range("R" & kk) = .Range("K" & k)
        ws2.Range("S" & kk) = .Range("L" & k)
        ws2.Range("T" & kk) = .Range("M" & k)
        ws2.Range("U" & kk) = .Range("N" & k)
        ws2.Range("V" & kk) = .Range("O" & k)
        ws2.Range("W" & kk) = .Range("P" & k)
        ws2.Range("X" & kk) = .Range("Q" & k)
        ws2.Range("Y" & kk) = .Range("R" & k)
        ws2.Range("Z" & kk) = .Range("S" & k)
        ws2.Range("AA" & kk) = .Range("T" & k)
        ws2.Range("A" & kk) = .Range("A" & k)
 
        End If
    Next
  Next
End With
 
 
       'sinon, je recopie les données dans une ligne qui n'est pas occupée
 
 
    ' Dernière ligne vide dans la feuille recopie
    lgLigFinH = Worksheets("Recopie").Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
    ' Dernière ligne dans la feuille essai
    lgLigFinM = Worksheets("Essai").Range("A" & Cells.Rows.Count).End(xlUp).Row + 1
    ' Copier les données de la feuille "essai" dans la première ligne vide de la feuille recopie
    Worksheets("Essai").Range("A8:B" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("A" & lgLigFinH)
    Worksheets("Essai").Range("C8:G" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("E" & lgLigFinH)
    Worksheets("Essai").Range("H8:T" & lgLigFinM).Copy Destination:=Worksheets("Recopie").Range("O" & lgLigFinH)
 
 
'et puis maintenant je trie par odre croissant
    Range("A8:AA1000").Select
    Selection.Sort Key1:=Range("B8"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
chouki60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 10h47   #8
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Citation:
Envoyé par chouki60 Voir le message
le code que j'ai fait me copie deux fois la ligne à remplacer..
Qu'entends-tu par "copie 2 fois", que la ligne de la feuille Essai est copiée en double sur 2 lignes consécutives de la feuille Recopie?

Sinon, étant donné que la partie de ton code qui traite le cas où "ton nombre n'existe pas" se trouve en dehors de la boucle, je doute que cela te donne le résultat attendu...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 11h07   #9
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
Citation:
Qu'entends-tu par "copie 2 fois", que la ligne de la feuille Essai est copiée en double sur 2 lignes consécutives de la feuille Recopie?
C'est exactement ça oui.

Sinon, malgré que le code soit hors de la boucle, le cas où le nombre n'existe pas fonctionne très bien.
chouki60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 11h41   #10
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Tu es sûre que c'est la nouvelle ligne qui est copiée 2 fois ou que l'ancienne est conservée (il y aurait donc la nouvelle et l'ancienne).

Parce qu'à priori, je ne vois pas pourquoi ton code aurait ce comportement...
Tu peux toujours essayer de ne copier que la valeur pour voir si ça résout le problème:

Code :
ws2.Range("B" & kk).Value = z.Value  'et pareil pour les suivantes

Citation:
Sinon, malgré que le code soit hors de la boucle, le cas où le nombre n'existe pas fonctionne très bien.
Pourtant tout ce que cela devrait faire, c'est copier la dernière ligne de ta feuille "Essai" sur la dernière ligne vide de ta feuille "Recopie"...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 14h09   #11
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
Citation:
Envoyé par Sclarckone Voir le message
Tu es sûre que c'est la nouvelle ligne qui est copiée 2 fois ou que l'ancienne est conservée (il y aurait donc la nouvelle et l'ancienne).
C'est bien ce qui se passe, je viens de vérifier, la nouvelle ligne se copie deux fois.

Citation:
Envoyé par Sclarckone Voir le message
Code :
ws2.Range("B" & kk).Value = z.Value  'et pareil pour les suivantes
Ce code ne change pas du tout mon problème, cela copie toujours deux fois la même ligne


Citation:
Envoyé par Sclarckone Voir le message
Pourtant tout ce que cela devrait faire, c'est copier la dernière ligne de ta feuille "Essai" sur la dernière ligne vide de ta feuille "Recopie"...
Je viens de re-tester, ça marche pour toutes les nouvelles lignes..

En tout merci de prendre le temps pour mon problème !
Une autre idée?
chouki60 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 15h17   #12
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Je ne comprends pas pourquoi en tout cas. Si ton fichier ne contient pas de données confidentielles, mets-le en pièce jointe que je puisse jeter un œil à ta macro...
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 18h07   #13
Candidat au titre de Membre du Club
 
Femme
Inscription : avril 2009
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations forums :
Inscription : avril 2009
Messages : 41
Points : 12
Points : 12
J'ai essayé de mettre en pièce jointe mon document cependant je ne peux pas car "la marque de sécurité est manquante".. c'est à dire?
chouki60 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 16h33.


 
 
 
 
Partenaires

Hébergement Web