fitzjames
Messages postés55Date d'inscriptionmardi 8 juin 2004StatutMembreDernière intervention27 février 2009
-
22 juin 2005 à 13:33
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDerniè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
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!!!
'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
fitzjames
Messages postés55Date d'inscriptionmardi 8 juin 2004StatutMembreDernière intervention27 février 20091 22 juin 2005 à 17:03
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 22 juin 2005 à 17:47
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!!!
fitzjames
Messages postés55Date d'inscriptionmardi 8 juin 2004StatutMembreDernière intervention27 février 20091 23 juin 2005 à 11:39
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.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 23 juin 2005 à 16:33
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.
fitzjames
Messages postés55Date d'inscriptionmardi 8 juin 2004StatutMembreDernière intervention27 février 20091 24 juin 2005 à 14:03
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
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 25 juin 2005 à 17:23
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 )
fitzjames
Messages postés55Date d'inscriptionmardi 8 juin 2004StatutMembreDernière intervention27 février 20091 27 juin 2005 à 15:09
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.
ScSami
Messages postés1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 27 juin 2005 à 15:57
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!