Supprimer des lignes dans excel [Résolu]

Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
- - Dernière réponse : ScSami
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
- 7 juil. 2005 à 18:58
Bonjour,

J'ai un petit souci avec ma macro, quand elle trouve des doublons elle delete toutes mes lignes.
ce qu'elle devrais faire c'est deleter les lignes quand elle trouve des doublons sauf la première.

Dim i As Integer
Dim noDoc As String


For i = 3 To 10

'copy des données
Sheets("Feuil1").Select
Rows(i).Select
Selection.Copy
Sheets("Feuil2").Select
Rows(i).Select
ActiveSheet.Paste

'Recupération du numéro du projet
noDoc = Worksheets("Feuil2").Range("A" & i)
If noDoc = "0" Then
' Fin du fichier(plus de projets à traiter)
Exit For
End If

'Supprime les lignes dont les n° de projets sont identiques après la première ligne
For Each rw In Worksheets(2).Range("A" & i).CurrentRegion.Rows
If noDoc = last Then rw.EntireRow.Delete
last = noDoc
Next

Next i

merci d'avance pour votre aide

Estelle
Afficher la suite 

16 réponses

Meilleure réponse
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
3
Merci
Dim i As Integer

Dim varTour1 As Integer

Dim varTour2 As Integer

Dim noDoc As String



'Copy des données

For i = 3 To 10

Sheets("Feuil1").Select

Rows(i).Select

Selection.Copy

Sheets("Feuil2").Select

Rows(i).Select

ActiveSheet.Paste

Next i



'Supprime les lignes dont les n° de projets sont identiques après la première ligne

For varTour1 = 3 To 10 '<= Nombre de lignes!!!

noDoc = Worksheets("Feuil2").Range("A" & CStr(varTour1)).Value
If noDoc = "" Then Exit For

For varTour2 = 3 To 10

If varTour1 <> varTour2 And _

noDoc = Worksheets("Feuil2").Range("A" & CStr(varTour2)).Value Then _

Worksheets("Feuil2").Range("A" & CStr(varTour1)).EntireRow.Delete

Next varTour2


Next varTour1



Le caractère " _" permet de continuer la meme ligne de code mais "à la ligne"...





Alors, est-ce que maintenant ça fonctionne ??? Et si oui, n'oublie pas
de valider la réponse... (question de respect pour les membres... pas
de vanité!)



Et encore désolé pour ma grossière erreur d'interprétation de ton code de tout à l'heure!!!



Enjoy

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 220 internautes nous ont dit merci ce mois-ci

Messages postés
28
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
17 février 2006
0
Merci
dim rng as range
dim lngNbLigne, lngNbCol as long
dim intI as integer
dim strCoord as string

set wks = Worksheets(2)
'permet d'aller rechercher le nombre de ligne et de colonne de la feuille

wks.Activate
wks.Range("A1").Activate
Set rngListeNotes = ActiveCell.CurrentRegion

lngNbLigne = rngListeNotes.Rows.Count
lngNbCol = rngListeNotes.Columns.Count

'permet de créer un range pour toute la ligne
for intI = 1 to lngNbLigne
strCoord = "R" & intI & "C1:R" & intI & "C" & CStr(lngNbCol)
wks.Names.Add Name:="L" & intI, RefersTo:="=" & strCoord
next intI

for intI = 2 to lngNbLigne
set rng = wks.range("L" & intI )
rng.EntireRow.Delete
next intI

'ou alors tout bêtement mais je ne sais pas si ca marche...
'à tester
for inti= 2 to lngNbLigne
wks.cells(inti).entirerow.delete
next inti
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Non non non, a mon avis ton problème est beaucoup plus simple que ça!!!




Dim i As Integer

Dim i2 As Integer

Dim noDoc As String



For i = 3 To 10 'Lignes donc!



'copy des données

... pas de changements!



'Recupération du numéro du projet

noDoc = Worksheets("Feuil2").Range("A" & CStr(i)).Value

If noDoc = "" Then

' Fin du fichier(plus de projets à traiter)

Exit For

End If



'Supprime les lignes dont les n° de projets sont identiques après la première ligne

i2 = 3

For Each rw In Worksheets(2).Range("A" & i).CurrentRegion.Rows

If noDoc = last And i2 <> i Then rw.EntireRow.Delete

last = noDoc

i2 = i2 + 1

Next



Next i



Tout simplement!!! Teste pour voir si ça fonctionne, et si ça
fonctionne, outre un petit mot de remerciment, clique sur le bouton
"Accepter"...



Enjoy, et tiens nous au courant!
Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
0
Merci
Merci pour les réponses mais rien ne marche.

Pour la réponse de 219169 vaneri2004 la macro plante sur la ligne :
wks.Names.Add Name: ="L" & intI, RefersTo:="=" & strCoord
J'ai une erreur 1004 'Nom non valide'

Pour la Réponse de ScSami cela n' a rien changé il m'efface toutes mes lignes qui ont un doublons.

merci encore

Estelle
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Désolé... je me suis trompé...

Attendez, je vais refaire le code...
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Enfin, ceci dit, note quand même qu'il y a encore mieux
à faire... pour le rendre plus rapide (ce qui est un peu inutile dans
ton cas avec tes 7 lignes !!!)

D'ailleurs, on se demande même pourquoi tu fais un code!!! Tu aurais
déjà perdu tellement moins de temps à le faire manuellement!!!



A méditer...
Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
0
Merci
Bonjour,

désolé de n'avoir répondu plutôt.
La macro marche super sur les 7 lignes de mon fichier de test mais elle ne marche pas bien sur mon fichier de 1000 lignes.
Il reste quelques doublons (mais c aléatoire) et il m'efface quelques fois aléatoirement la première ligne qu'il rencontre. Je m'explique dans ma colonne D mon projet est pilote et /ou contributeur, quand il est pilote c la première ligne du projet et les autres lignes suivantes sont contributeurs. Il peut être uniquement contributeur aussi.

Merci encore

Estelle
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
C'est pas grave tu sais, un forum, quelque part, c'est un "chat" en temps pas réel ;-) mdr



Ah oui dis donc, j'avais pas vu!!! Mais t'es une fille !!!!! lol

Non non, t'inquiète pas, il m'a déjà été donné d'en voir dans vie...
c'est pas pour ça que je m'etonne... C'est parce que vous êtes,
décidéments, de plus en plus nombreuses ces temps-ci... Peut-être
est-ce à cause de la perdiode des stages en entreprise !? Mais quoi
qu'il en soit, ça fait vraiment du bien de voir que l'autre coté de La
Force [cf. StarWars ;-] peut s'intéresser à la prog. C'est vraiment
admirable je trouve...



Bon, trêve de divagations... Revenons dans le vif du sujet avec cette question :

As-tu modifié mon code pour l'adapter à 1'000 lignes ??? Non mais parce
que je sais pas si tu as remarqué (ne connaissant pas ton niveau en
programmation ???) mais ma routine va des lignes 3 à 10 et pas plus
loin!!!



Mais si, comme je le suppose, tu l'avais remarqué et modifié, c'est que
le problème vient d'ailleurs... Donc, il nous faut ton code au complet
si tu veux qu'on puisse t'aide. S'il est trop long, envoi-le plutôt en
message privé (MP dans la barre de titre de chaque réponse...).



Sinon, j'ai pas très bien compris ton histoire de "pilote/contributeur"
!!! Lorsque tu poses une question, je t'en supplie à 4 genoux, essaye
d'être plus explicite... N'hésite pas à écrire 10 lignes de plus!!!
Regarde nous le temps (libre!) qu'on perd à te répondre et à dire ce
genre de chose à tout le monde!!! C'est chiant à la longue! A croire
que vous voulez de l'aide mais que vous économisez, comme des radins,
votre temps pour l'obtenir!!! Comme si c'était à nous, bénévoles
libres, de perdre le temps que vous voulez pas perdre!!! Un comble si
on peut dire!

Bref, fait juste un petit effort s'il te plait, merci d'avance.



Mais pour ton problème, sache que rien n'est "aléatoire" si tu ne le
lui demande pas explicitement (ou si tu ne considères pas correctement
son fonctionnement interne!). Donc, ton problème vient d'ailleurs.



Enjoy
Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
0
Merci
Bonjour,

je pense avoir été assez explicite mais bon je vais réexpliquer. Que se soit avec 7 ou 1000 lignes ça doit marcher pareille, non ?

J'ai un feuille 1 ou je fait des calculs .dans cette feuille, j'ai une colonne A avec des N° de projets, une colonne B avec les services qui s'occupent d'un projet, une colonne C avec le libellé, une colonne D avec le rôle du service (Pilote ou contributeur), etc...Pour 1 projet, il y a un service qui pilote et autant de services qui y contribuent. Sur certains projet il n'y a que des contributeur. Mes donnée sont triées par n° de projet (odre croissant) et par rôle ( ordre décroissant ) afin d'avoir tjrs le rôle = pilote sur le première ligne.
J'ai une feuille 2 où je copie mes donnée mais je veux la première ligne par projet. C'est à dire le projet dont le service est pilote sinon s'il yen a pas le service contributeur.

La macro marche bien jusqu' à la ligne 256 où je me suis aperçu que j'avais un projet en doublons mais puis sur les lignes suivantes une ligne par projet et j'ai de nouveau un projet en doublons jusqu'à 1000.
c'est aléatoire car cela ne se produits pas tout le temps. de plus quand pour un projet j'ai un service pilote qui devient un autre service contributeur. C'est aléatoire aussi car la macro le fait que de temps en temps.

J'espère que j'ai été un peu plus clair. Ci-dessous la macro de mon fichier excel.

Dim i As Integer
Dim varTour
1 As Integer
Dim varTour2 As Integer

Dim noDoc As String

'Copy des données
For i = 12 To 1000
Sheets("Feuil1").Select
Rows(i).Select
Selection.Copy
Sheets("Feuil2").Select
Rows(i).Select
ActiveSheet.Paste
Next i

'Supprime les lignes dont les n° de projets sont identiques après la première ligne
For varTour1 = 12 To 1000 '<= Nombre de lignes!!!
noDoc = Worksheets("Feuil2").Range("A" & CStr(varTour1)).Value

If noDoc = ""
Then Exit For
For varTour2 = 12 To 1000
If varTour1 <> varTour2 And
_
noDoc = Worksheets("Feuil2").Range("A" & CStr(varTour2)).Value Then
_
Worksheets("Feuil2").Range("A" & CStr(varTour1)).
EntireRow.Delete
Next
varTour2
Next varTour1

merci

estelle
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Le début est clair jusqu'a ces quelques lignes... je défie tout être doué d'intelligence de comprendre ce que tu veux dire!!!

"La macro marche bien jusqu' à la ligne 256 où je me suis aperçu que
j'avais un projet en doublons mais puis sur les lignes suivantes une
ligne par projet et j'ai de nouveau un projet en doublons jusqu'à 1000." !?!?!?!?!?!?!?

"c'est
aléatoire car cela ne se produits pas tout le temps."

Certitude bien présomptueuse! Rien n'est aléatoire si tu ne le lui demande explicitement!!!

"... de plus quand pour
un projet j'ai un service pilote qui devient un autre service
contributeur." !?!?!?!?!?

"C'est aléatoire aussi car la macro le fait que de temps
en temps.

J'espère que j'ai été un peu plus clair." <= Réponse, NON!



Bref, c'était juste pour te dire que tu n'es parfois pas si clair qu'on aimerait que tu le sois!



Donc, si j'ai bien compris, selon ce que tu me dis :

"J''ai une feuille 2 où je copie mes donnée mais je veux la première ligne
par projet. C'est à dire le projet dont le service est pilote sinon
s'il yen a pas le service contributeur."

On se fout complètement de savoir si le projet est contributeur ou
pilote! On se doit seulement de récupérer la 1ère ligne chaque projet
un point c'est tout. C'est quand même pas compliqué de bien définir ton
projet et de le résumer non !?!? Bref, passons...



Si au-dela de 256 lignes (255 en réalité je pense!) ça ne fait plus ce
que tu attends, c'est que tu dois utiliser quelque part une variable de
type "Byte" (0-255 d'où 256). Je vois que tu ne m'as pas mis tout ton
code (entre autre la déclaration de la procédure!!!) et donc, je ne
peux pas grand chose pour toi !



Cependant, le code que tu m'as fourni ne fait appel à aucune variable
de type Byte... J'ai donc du mal à comprendre d'où peut venir le
problème!!!



Mais je peux déjà te dire une chose. Tu peux remplacer, dans ta procédure, ce code :


'Copy des données
For i = 12 To 1000
Sheets("Feuil1").Select
Rows(i).Select
Selection.Copy
Sheets("Feuil2").Select
Rows(i).Select
ActiveSheet.Paste
Next i



Par celui-ci :


'Copy des données
Sheets("Feuil1").Activate

ActiveSheet.Cells.Select

Selection.Copy

ActiveSheet.Cells(1, 1).Select



Sheets("Feuil2").Activate

ActiveSheet.Cells.Select

ActiveSheet.Paste

ActiveSheet.Cells(1, 1).Select



Qui sera bien plus rapide !!! (surtout si, comme tu dis, tu as environ 1'000 lignes !!!

Mais attention toutefois à ne pas mettre ce code dans une procédure
"_SelectionChange" parce que sinon le code va se mettre en boucle et tu
ne pourras l'arrêter qu'en appuyant sur les touches "CTRL +
BREAK/PAUSE". Et ceci à cause de la dernière ligne de chaque bloque
(qui sélectionne la 1ère cellule de la feuille afin de déselectionner
l'ensemble des cellules précédemment sélectionnées ce qui, forcément,
déclanche donc la procédure évenementielle "_SelectionChange" !!!).



Ceci dit, tu ne nous a pas donné la version d'Excel que tu utilisais
(alors qu'il faut toujours commencer chaque post par là !!! C'est
important pour qu'on puisse mieux t'aider m'enfin!!!). Donc, je te
soupçone d'utiliser une des dernières versions. Moi, je n'ai que la
version 2'000 et je ne peut donc pas être certain des réactions des
versions suivantes.

Et il se peut donc qu'il y ai une petite nuance dans la déclaration des variables!



Donc, ce que je peux te conseiller c'est de mettre ceci à la place de l'ancien bloc de déclarations :



Dim i As Long

Dim varTour
1 As Long

Dim varTour2 As Long
Dim noDoc As String



Ou alors, mais en dernier recours, de l'enlever purement et simplement !



Voilà, je peux pas t'en dire plus pour le moment... à toi de faire les tests et de me dire d'accord



Mais sinon, le code, lui, ne poserait pas ces problèmes!!!

Sauf si, je sais pas si tu l'as remarqué (???), il y a, dans ta liste,
une ligne vide dans la colonne A ("N° de Projet") auquel cas ça
arrêterait tout net le programme!!!

Donc, si ces modifications ne fonctionnent pas, vérifie ta liste de
projet... on sait jamais... y'a peut-être une erreur (ça arrive )





Enjoy

Et tient moi au courant STP
Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
0
Merci
Bonjour,


Je suis en formation cette semaine. Je peux pas faire de test actuellement.
Merci pour la macro de copy .
Désolé pour les mauvaises explications, pour moi cela me semble clair.
La version d'excel sur mon poste est excel 2003 et j'ai mis le code dans une macro qui se nomme liste.
Il n' y a pas de lignes vides mais les n° de projets sont en numérique et alphanumériques, et j'ai des doublons sur les alphanumériques.

c'est possible que ce soit cela , non ?

merci

Estelle
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Non sauf si tu as un truc du style :

A1 = "21AZF12"


A2 = "21AZF12 "



Dans ce cas là, vu que A2 a un espace à la fin, l'égalité sera fausse.
Du coup, si visuellement c'est la même chose, pour l'ordi ce sera deux
chaines alphanumériques différentes (ce qui vrai d'ailleurs!).



Donc, le traitement des chaines (numériques ou alphanumériques) demande
une certaine rigueur car contrairement aux nombres, les comparaisons
sont sensibles!



Mais ça m'étonnerais fort que ça pose problème dans ton cas. Non, moi
je dis qu'il faut déjà tester, dès que t'en aura la possibilité, ce que
je t'ai marqué plus haut!



Bonne chance

@++
Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
0
Merci
Bonjour ,

J'ai retesté la macro avec :
Dim i As Long
Dim varTour1 As Long
Dim varTour2 As
Long

Dim noDoc As String

C'est pire car j'ai des doublons à chaque n° de projets. J'ai regardé s'il n'y avait pas d'espace après le n° et ce n'est pas le cas.

Merci d'avance.

Estelle
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Alors, ne déclare pas les types de données et met juste ça :




Dim i
Dim varTour1
Dim varTour2

Dim noDoc




Ne te l'avais-je pas déjà suggéré d'ailleurs!?!?


Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
Messages postés
55
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
27 février 2009
0
Merci
Bonjour,

J'y avais pensé et j'ai même essayé "as Variant"

Bon c'est pas grave ça marche à peu près.
Merci pour ton aide.

@+

Estelle
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
17
0
Merci
Désolé de ne pouvoir faire plus!!! Mais bon, sans le fichier, on peut pas faire grand chose de mieux!


Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )