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 01/07/2009, 16h57   #1
Membre habitué
 
Avatar de Brunodm13
 
Inscription : novembre 2008
Messages : 123
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 123
Points : 110
Points : 110
Par défaut Suppression de lignes

Bonjour,

Il faut que j'exécute 3 fois ce code sur ma feuille Histo contenant 388 lignes pour supprimer celles dont je ne trouve pas la référence dans la feuille OF.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
i = Sheets("Histo").Range("B65536").End(xlUp).Row
 
For Each c In Sheets("Histo").Range("A" & i & ":A2")
    Set v = Sheets("OF").Range("G:G").Find(What:= c.Value, LookIn:=xlValues, LookAt:=xlPart)
        If v Is Nothing Then
            k = c.Row
            Rows(k).Delete
            j = j + 1
        End If
Next c
 
MsgBox j & " lignes supprimées"
j = 0
Alors qu'il me suffit d'exécuter une seule fois celui là pour colorer la cellule de la colonne A de la ligne que je voudrais supprimer.
Code :
1
2
3
4
5
6
7
8
9
i = Sheets("Histo").Range("B65536").End(xlUp).Row
 
For Each c In Sheets("Histo").Range("A" & i & ":A2")
    Set v = Sheets("OF").Range("G:G").Find(What:= c.Value, LookIn:=xlValues, LookAt:=xlPart)
        If v Is Nothing Then
            c.Interior.ColorIndex = 4
            j = j + 1
        End If
Next c
Quelqu'un pourrait-il m'expliquer car là je séche

Bruno
Brunodm13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2009, 17h02   #2
Membre confirmé
 
Inscription : octobre 2007
Messages : 232
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 232
Points : 235
Points : 235
Bonjour,

si tu pars du bas vers le haut, n'oublie pas le Step -1

Code :
For Each c In Sheets("Histo").Range("A" & i & ":A2") Step -1
mapeh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2009, 17h23   #3
Membre habitué
 
Avatar de Brunodm13
 
Inscription : novembre 2008
Messages : 123
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 123
Points : 110
Points : 110
Bonjour mapeh,

merci de ta réponse rapide.
Citation:
Envoyé par mapeh Voir le message
Bonjour,

si tu pars du bas vers le haut, n'oublie pas le Step -1
L'ajout de Step -1 me génère une erreur de compilation : Erreur de syntaxe.

De toute façon, si je fait :
Code :
For Each c In Sheets("HistoriqueGSI").Range("A2:A" & i)
le problème est le même.

As-tu une autre idée ?

Bruno
Brunodm13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2009, 17h31   #4
Membre confirmé
 
Inscription : octobre 2007
Messages : 232
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 232
Points : 235
Points : 235
Re-,

essaie avec ce code :

pour une suppression de lignes, il faut toujours aller du bas vers le haut....

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub suppr()
Dim Derlig As Long, I As Long
With Sheets("Histo")
    Derlig = .Range("B65536").End(xlUp).Row
 
    For I = Derlig To 2 Step -1
        Set v = Sheets("OF").Range("G:G").Find(What:=.Cells(I, 1).Value, LookIn:=xlValues, LookAt:=xlPart)
        If v Is Nothing Then
            Rows(I).Delete
            j = j + 1
        End If
    Next I
End With
MsgBox j & " lignes supprimées"
j = 0
End Sub
mapeh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2009, 17h46   #5
Membre habitué
 
Avatar de Brunodm13
 
Inscription : novembre 2008
Messages : 123
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 123
Points : 110
Points : 110
Ton code supprime bien les lignes en une seule fois

Je ne comprends toujours pas pourquoi il faut que j'exécute le mien 3 fois pour arriver au même résultat...

Encore une fois

A plus.

Bruno
Brunodm13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2009, 10h19   #6
Membre Expert
 
Avatar de Krovax
 
Inscription : juillet 2008
Messages : 1 889
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : juillet 2008
Messages : 1 889
Points : 1 937
Points : 1 937
Le problème du for each est qu'il a de haut en bas

Tu test la ligne 1 c'est bon
tu tests la ligne 2 tu la supprime, la ligne 3 monte a la place de la ligne 2
Tu test la ligne 3 (qui est l'ancienne ligne 4)
....

Il y a des ligne que tu ne testera jamais, du coup tu doit lancer le code plusieurs fois Regarde a l'envers ce que cela donne, tu comprendra l'intérêt
Krovax est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2009, 18h03   #7
Membre habitué
 
Avatar de Brunodm13
 
Inscription : novembre 2008
Messages : 123
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 123
Points : 110
Points : 110
Bonjour Krovax,

Citation:
Envoyé par Krovax Voir le message
Le problème du for each est qu'il a de haut en bas
Le For Each qui pose problème teste bien les lignes de bas en haut.
Code :
For Each c In Sheets("Histo").Range("A" & i & ":A2")
Effectivement, au départ, je testais les lignes de haut en bas. Je me suis fait la réflexion qu'effectivement je ratais des lignes tel que tu le décris. Je suis donc passé à un test de bas en haut.

Ce qui est curieux c'est que quelque soit la méthode de test des lignes, le code me supprime 61 lignes, puis 26 et enfin 1.

As-tu une autre idée, car je ne vois pas où se trouve l'erreur.

Cordialement.

Bruno
Brunodm13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 11h10.


 
 
 
 
Partenaires

Hébergement Web