Se connecter avec
S'enregistrer | Connectez-vous

Comparer transfer-effacer ligne

Dernière réponse : dans Programmation

  1. Sub Bouton1()
  2. Dim rngBF1 As Range, rngBF2 As Range
  3. dim vLig as long
  4.  
  5. Application.ScreenUpdating = False
  6.  
  7. 'définition de la plage sur la feuille synthèse (ici de A1 à la dernière cellule remplie) :
  8. Set rngBF1 = Sheets("synthèse").Range("A1:" & Sheets( _
  9. "synthèse").Cells(Rows.Count, 1).End(xlUp).Address)
  10.  
  11. 'définition de la plage sur la feuille MC (ici de G1 à la dernière cellule remplie) :
  12. Set rngBF2 = Sheets("MC").Range("G1:" & Sheets( _
  13. "MC").Cells(Rows.Count, 7).End(xlUp).Address)
  14.  
  15. For Each cell In rngBF1
  16. If Not IsError(Application.Match(cell, rngBF2, 0)) Then
  17. vLig = Application.Match(cell, rngBF2, 0) 'vLig = n° de la ligne trouvée dans la feuille MC
  18. If Sheets("MC").Range("AA" & vLig) = "TF-Post" Then
  19. 'on ne fait rien
  20. Else
  21. Sheets("synthèse").Rows(cell.Row).Delete
  22. End if
  23. Else
  24. Application.ScreenUpdating = True
  25. cell.Select
  26. msgbox "Cellule " & cell.Address & " sans correspondance dans MC", vbokonly + vbcritical, "Anomalie"
  27. End If
  28. Next
  29.  
  30. Application.ScreenUpdating = True
  31. End Sub

il fonctionne mais trop lent car il verifie si chaque cellule de la colonne A a bien un correspondant a la colonne G de la feuille "MC"

donc il y a une boite de dialogue qui s'affiche a chaque fois qu'il n'y pas de correspondance et moi je dois cliquer dessus pour pouvoir avancer
du coup s'il y a 10000 cellules a tester de sera donc penible ..!!

si quelqu'un peu bien me donner de l'aide sur ce code
merci

avant tout sachez que :

j'ai testé le code je croix qu'il est bon mais il y a un soucis par rapport a deux choses
premierement ma feuille synthese est un filtre que j'ai réalisé via un code
du coup dans ma feuille synthese il y a des lignes qui n'existent pas ma premiere cellule est donc A51 mais peu etre A30 car ça depend du fichier source qui n'a toujours pas le meme nombre de valeurs à trier.
donc ma premiere valeur et en A51 par exemple et la derniere
A200 par exemple mais il y a supression de certaines lignes entre A51 ET A200..
aussi dans la feuille "MC" c'est a partir de G2 que les nombres commencent

donc quand j'ai executé le code j'ai eu le message d'erreur ci-dessous DANS UNE BOITE DE DIALOGUE appelée "ANOMALIE"
" cellule $A$1 sans correspondance dans MC
lorsque je clic sur OK ça me fais passé a la cellule suivante .. et ainsi de suite .. jusqu'a ce que je parcours toute la colonne "A" mais si j'ai une colonne A a 1000 cellules ça devient penible
sinon j'ai supression des lignes ça signifie que le code m'efface bien ce que je veux ...

merci de votre aide POUR LE RENDRE PLUS EFFICACE :sol: 

Autres pages sur : comparer transfer effacer ligne

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Bon, alors il faut que tu comprennes ce que tu fais.
Le For Step -1 de la ligne 9, c'est très bien, c'est exactement ce qu'il faut faire.
Par contre, pourquoi le faire à la ligne 12 ???

Avec tes k et k_1, tu t'embrouilles peut-être. Et on avait des variables pour les feuilles. Où sont-elles passées ? Aide-moi à t'aider, ne me rebond pas un code 100% différents à chaque fois.

Bon, alors, je t'ai réécris tout ça. Tu observeras que je donne des noms cohérents à mes variables :
  1. Dim numero As Long
  2. Dim ws_mc As Worksheet
  3. Dim ws_sy As Worksheet
  4. Dim i_mc As Long
  5. Dim i_sy As Long
  6. Dim nblig_mc As Long
  7. Dim nblig_sy As Long
  8.  
  9. Set ws_mc = Worksheets("MC")
  10. Set ws_sy = Worksheets("Synthèse")
  11.  
  12. nblig_mc = ws_mc.Cells(Rows.Count, 7).End(xlUp).Row
  13. nblig_sy = ws_sy.Cells(Rows.Count, 1).End(xlUp).Row
  14.  
  15. For i_sy = nblig_sy To 1 Step -1
  16. If ws_sy.Cells(i_sy, 3).Text Like "*EMTN*" Or _
  17. ws_sy.Cells(i_sy, 3).Text Like "*Oblig*" Then
  18. numero = ws_sy.Cells(i_sy, 1).Value
  19. For i_mc = 1 To nblig_mc
  20. If numero = ws_mc.Cells(i_mc, 7).Value Then
  21. If ws_mc.Cells(i_mc, 27).Text <> "TF-Post" Then
  22. MsgBox "Paré à supprimer la ligne " & i_sy & vbCrLf & vbCrLf & _
  23. "Ligne de synthèse : " & i_sy & vbCrLf & _
  24. "Code (3) : " & ws_sy.Cells(i_sy, 3).Text & vbCrLf & _
  25. "Numéro : " & ws_sy.Cells(i_sy, 1).Value & vbCrLf & vbCrLf & _
  26. "Ligne de MC : " & i_mc & vbCrLf & _
  27. "Code (27) : " & ws_mc.Cells(i_mc, 27).Text & vbCrLf & _
  28. "Numéro : " & ws_mc.Cells(i_mc, 7).Value, , _
  29. "Suppression de la ligne " & i_sy
  30. ws_sy.Rows(i_sy).Delete
  31. End If
  32. Exit For
  33. End If
  34. Next
  35. End If
  36. Next
Alors, c'est pas plus clair comme ça ?
Pour info, c'est TON code, juste revu, avec des noms de variables un peu plus parlants.

Pour moi, ce code est correct. J'ai ajouté la boîte de dialogue pour que tu vois pourquoi ça ne fait pas ce que tu veux.
Expert Programmation

Salut,

Citation :
sinon j'ai supression des lignes ça signifie que le code m'efface bien ce que je veux ...

Ouh que c'est pas-bien ! A lire, au plus vite : Supprimer des lignes dans un tableau.

Je ne sais pas ce que tu dois faire en cas d'anomalie. Si c'est juste pour information, alors tu peux accumuler les adresses des cellules anormales dans une variables et ne l'afficher qu'à la fin, par exemple.
Après la ligne 26, il aurait fallu remettre le ScreenUpdating à Faux. Mais comme on va faire autrement.

Tu as un autre problème. Le filtre ne fait que cacher les lignes dont tu n'as pas besoin. Mais elles existent toujours. Et VB les voient ! Utilise leur propriétés Height ;) 

N'utilise pas des Sheets() mais des Worksheets(). C'est plus précis.
Utilise des variables pour désigner tes feuilles.

Pour désigner une seule cellule, n'utilise pas Range() mais Cells(). C'est moins de boulot pour XL.

bonjour tout le monde
je vous explique ce que j'essai de faire dans ce code:
ma feuille active se nomme ("Synthèse") cette feuille synthese contient un tableau de la colonne A a la colonne I .La colonne A contient des nombres entiers
je veux donc rechercher chacun des numeros de la colonne A dans ma feuille nommé ("MC") a la colonne G une fois ce numero trouvé je reste dans ma feuil "MC" a la meme ligne je vais a la colonne AA regardé si j'ai le caractere "TF-Post" si j'ai le caractere "TF-Post" je conserve la ligne de la feuille "synthese " correspondante sinon je l'efface:
voici un exemple
supposons que j'ai dans ma feuille synthese A5=1022 alors je vais chercher ce numero a la colonne G dans ma feuille "MC"
supposons que je trouve ce numero a la ligne 100 de la colonne G donc
G100=1022 a partir de là je vais a la COLONNE AA toujours de ma feuille "MC" a la ligne 100
SI AA100="TF-Post" alors je conserve la ligne
5 de ma feuille synthese sinon je la suprime.

regarder mon code:
  1. Sub Bouton1()
  2. Dim Lig As Long
  3. With Worksheets("Synthèse")
  4. While Cells(Lig, 1) <> ""
  5. If .Cells(Lig, 1) = Worksheets("MC").Cells(Lig, "G") Then
  6. .Cells(Lig, "AA") = "TF-Post"
  7. Lig = Lig + 1
  8. Else
  9. Worksheets("Synthèse").Rows(Lig).Delete
  10. End If
  11. Wend
  12. End With
  13. End Sub
mais j'ai une erreur ici:

Code VBScript :While Cells(Lig, 1) <> ""
(erreur definie par l'application ou par l'objet")
mais je n'arrive pas a la corriger

merci de votre aide :) 
Expert Programmation

Salut Dianbobo,

Toujours les mêmes choses :
1°) Indente correctement ton code. Tiens c'est presque parfait cette fois-ci ;) 
2°) N'utilise pas While .. Wend mais Do While .. Loop :o 
3°) Initialise tes variables :o 

Je t'invite à éviter la syntaxe With. Utilise des variables à la place :
  1. Dim Lig As Long
  2. Dim ws_synthese As Worksheet
  3. Dim ws_mc As Worksheet
  4.  
  5. Set ws_synthese = Worksheets("Synthèse" )
  6. Set ws_mc = Worksheets("MC" )
  7.  
  8. Do While Cells(Lig, 1) <> ""
  9. If ws_synthese.Cells(Lig, 1) = ws_mc.Cells(Lig, "G" ) Then
  10. ws_synthese.Cells(Lig, "AA" ) = "TF-Post"
  11. Lig = Lig + 1
  12. Else
  13. ws_synthese.Rows(Lig).Delete
  14. End If
  15. Loop
Maintenant que c'est plus clair, regarde bien la ligne 6. Deux erreurs s'y cachent.

d'abord apres lecture de ton code je pense qu'il ne fait pas ce que je veux a moins que je me trompe
voila :
la ligne 10 de ton code me semble incorrecte parceque la colonne AA en question est dans la feuille "MC" et non dans la feuille "synthese"
!! la ligne de ma feuille synthese est conservée lorsque je retrouve le numero en colonne G de "MC" d'ou:
  1. If ws_synthese.Cells(Lig, 1) = ws_mc.Cells(Lig, "G" ) Then

une fois le numero trouvé je vais a la colonne AA de la feuille MC voir si sur cette meme ligne j'ai "TF-Post" sinon
je suprime la ligne de la feuille synthese donc a mon avi il y a une seconde condition:
  1. if ws_mc.Cells(Lig, "AA" ) = "TF-Post" then
..
ce qui donne :

  1. Dim Lig As Long
  2. Dim ws_synthese As Worksheet
  3. Dim ws_mc As Worksheet
  4. Set ws_synthese = Worksheets("Synthèse" )
  5. Set ws_mc = Worksheets("MC" )
  6. Do While Cells(Lig, 1) <> ""
  7. If ws_synthese.Cells(Lig, 1) = ws_mc.Cells(Lig, "G" ) Then
  8. if ws_mc.Cells(Lig, "AA" ) = "TF-Post" then
  9. Lig = Lig + 1
  10. Else
  11. ws_synthese.Rows(Lig).Delete
  12. End If
  13. end if
  14. Loop


mais je n'arrive pas a voir les deux erreurs dont tu parle
j'ai essayé le code il ne tourne pas quelque chose ne va pas mais je vois pas :??: 
Expert Programmation

Si tu vois une erreur dans mon code, c'est que c'est ton erreur. :o 

En effet, ligne 6 de ton premier code, tu écrivais .Cell(..), ce qui se référait au With précédent. Cette syntaxe simplifie parfois le code, je trouve qu'elle le complique. Bref, écoute mes conseils, et ne l'utilise pas avant d'être très à l'aise en programmation VB (ce qui devrait arriver vite ;)  ).

Regarde mieux la ligne 6 de ton dernier code.
Et pose-toi des questions sur chaque mot :
  1. Do While Cells(Lig, 1) <> ""

* Do C'est Zeb qui l'a dit, c'est bon,
* While C'est Zeb qui l'a dit, c'est bon,
* Cells Qu'est ce qu'il a dit le pengouin-à-pancarte ? A oui, de mettre le nom de la feuille avant !!!!!!
* (Lig, 1) Quelle est la valeur de Lig ? A ce propos, qu'est ce qu'il a dit le rougeot-à-ressort ? A oui, d'initialiser ses variables !!!!!!!
* <> "" Le pénible-de-service ne m'a-t-il pas déjà dit dans plusieurs autres topics de préciser Value ou Text ?

:/ 

c'est vrai c'etait mon erreur a la base désolé
alors pour ce qui est ci dessous :

  1. Dim Lig As Long
  2. Dim ws_synthese As Worksheet
  3. Dim ws_mc As Worksheet
  4.  
  5. Set ws_synthese = Worksheets("Synthèse")
  6. Set ws_mc = Worksheets("MC")
  7. Lig = 0
  8. Lig = Lig + 6 ' en fait je commence a la ligne 6
  9. Do While ws_synthese.Cells(Lig, 1).Value <> ""
  10. If ws_synthese.Cells(Lig, 1).value = ws_mc.Cells(Lig, "G").value Then
  11. If ws_mc.Cells(Lig, "AA").Text = "TF-Post" Then
  12. Lig = Lig + 1
  13. Else
  14. ws_synthese.Rows(Lig).Delete
  15. End If
  16. End If
  17. Loop


est ce correcte? :??: 

bonjour j'ai fait une lecture sur la supression des lignes en vba bon comme il y a une boucle for j'ai donc ecris le code de la façon suivante:

  1. Dim k As Long
  2. Dim k_1 As Long
  3. Dim i As Long, j As Long
  4. Dim numero As Long
  5. k = Worksheets("MC").Cells(Rows.Count, 7).End(xlUp).Row
  6. k_1 = Worksheets("Synthèse").Cells(Rows.Count, 1).End(xlUp).Row
  7. For i = 1 To k_1
  8. If Cells(i, 2).Value Like "*AFS*" Then
  9. numero = Cells(i, 1).Value
  10. For j = 2 To k
  11. If numero = Worksheets("MC").Cells(j, 7).Value Then
  12. If Worksheets("MC").Cells(j, 27).Text = "TF-Post" Then
  13. i = i + 1
  14. Else
  15. Worksheets("Synthèse").Rows(i).Delete
  16. End If
  17. Exit For
  18. End If
  19. Next
  20.  
  21. End If
  22. Next



et puis j'ai fais la modification en partant de la derniere ligne :

  1. Dim k As Long
  2. Dim k_1 As Long
  3. Dim i As Long, j As Long
  4. Dim numero As Long
  5. k = Worksheets("MC").Cells(Rows.Count, 7).End(xlUp).Row
  6. k_1 = Worksheets("Synthèse").Cells(Rows.Count, 1).End(xlUp).Row
  7. For i = k_1 To 1 step -1
  8. If Cells(i, 2).Value Like "*AFS*" Then
  9. numero = Cells(i, 1).Value
  10. For j = k To 2 step -1
  11. If numero = Worksheets("MC").Cells(j, 7).Value Then
  12. If Worksheets("MC").Cells(j, 27).Text <> "TF-Post" Then
  13. Worksheets("Synthèse").Rows(i).Delete
  14. Else
  15. i=i-1
  16. End If
  17. Exit For
  18. End If
  19. Next
  20.  
  21. End If
  22. Next


mais, mais ce code me suprime toutes les ligne sauf une seule :??: 

merci d'avance
Expert Programmation

Mais qu'est ce que tu fais ?
C'est le For de la ligne 7 qui gère le i.
Tu ne dois pas le faire toi-même, ligne 15.

Et t'es revenu à du code où tu ne précises pas les feuilles devant les Cells. Si tu n'écoutes pas ce que je dis, ben je ne vais plus rien dire. :fou: 

c'est vrai que j'ai posté sans vraiment faire attention
  1. :Et t'es revenu à du code où tu ne précises pas les feuilles devant les Cells
desolé
c'est mieux comme ça?

  1. Dim k As Long
  2. Dim k_1 As Long
  3. Dim i As Long, j As Long
  4. Dim numero As Long
  5. k = Worksheets("MC").Cells(Rows.Count, 7).End(xlUp).Row
  6. k_1 = Worksheets("Synthèse").Cells(Rows.Count, 1).End(xlUp).Row
  7.  
  8.  
  9. For i = k_1 To 1 step -1
  10. If Worksheets("Synthèse").Cells(i, 3).Text Like "*EMTN*" Or Worksheets("Synthèse").Cells(i, 3).Text Like "*Oblig*" Then
  11. numero = Worksheets("Synthèse").Cells(i, 1).Value
  12. For j = k To 2 step -1
  13. If numero = Worksheets("MC").Cells(j, 7).Value Then
  14. If Worksheets("MC").Cells(j, 27).Text <> "TF-Post" Then
  15. Worksheets("Synthèse").Rows(i).Delete
  16. Else
  17. 'on ne fait rien
  18. End If
  19. Exit For
  20. End If
  21. Next
  22. End If
  23. Next


ça tourne mais il me reste aucune ligne sur la feuille :??: 
je me suis dit que la supression de ligne se passe dans la feuille synthèse donc il suffit de decrementer la boucle
  1. For i = k_1 To 1 step -1 ....
et de garder la seconde boucle incrementée
  1. for j=2 to k......

mais j'ai toujours le meme problème.

Bonjour tout le monde ,bonjour Zeb
j'ai essayé le code c'est bien ce que j'ai ecris . mais il fait la chose suivante :
la boucle commence a la derniere ligne de la feuille synthese ,la boite de dialogue me montre a quelle ligne dans la feuille "MC" correspond le "numero" que j'ai definis dans le code puis à la colonne 27 ce que j'ai comme caractere "TF-Post" ou pas puis la ligne est suprimé et on passe a la ligne precedent.
toutes les lignes sont suprimées :whistle: 
et pourtant j'ai cru ecrire une condition pour qu'une ligne soit suprimé ou pas :??: 

  1. If numero = ws_mc.Cells(i_mc, 7).Value Then
  2. If ws_mc.Cells(i_mc, 27).Text <> "TF-Post" Then...


mais dans mon code qu'il rencontre le caractere TF-Post ou pas il me suprime la ligne avant d'aller a la ligne precedente.

là je suis un peu perdu. :??: 

merci d'avance
Expert Programmation

Salut,

Alors c'est qu'il n'y a pas écrit "TF-Post" dans ta cellule.

Utilise ce message à la ligne 22 pour t'en convaincre :
  1. MsgBox "Code (27) : >>>>" & ws_mc.Cells(i_mc, 27).Text & "<<<<", , _
  2. "Suppression de la ligne " & i_sy


Forcément, si il y a des espaces, des lettres majuscules ou minuscules différentes, ça ne marchera pas.

voila j'ai mis le message aa la ligne 22 comme ceci:

  1. Dim numero As Long
  2. Dim ws_mc As Worksheet
  3. Dim ws_sy As Worksheet
  4. Dim i_mc As Long
  5. Dim i_sy As Long
  6. Dim nblig_mc As Long
  7. Dim nblig_sy As Long
  8.  
  9. Set ws_mc = Worksheets("MC")
  10. Set ws_sy = Worksheets("Synthèse")
  11.  
  12. nblig_mc = ws_mc.Cells(Rows.Count, 7).End(xlUp).Row
  13. nblig_sy = ws_sy.Cells(Rows.Count, 1).End(xlUp).Row
  14.  
  15. For i_sy = nblig_sy To 1 Step -1
  16. If ws_sy.Cells(i_sy, 3).Text Like "*EMTN*" Or _
  17. ws_sy.Cells(i_sy, 3).Text Like "*Oblig*" Then
  18. numero = ws_sy.Cells(i_sy, 1).Value
  19. For i_mc = 1 To nblig_mc
  20. If numero = ws_mc.Cells(i_mc, 7).Value Then
  21. If ws_mc.Cells(i_mc, 27).Text <> "TF-Post" Then
  22. MsgBox "Code (27) : >>>>" & ws_mc.Cells(i_mc, 27).Text & "<<<<", , _
  23. "Suppression de la ligne " & i_sy
  24. MsgBox "Paré à supprimer la ligne " & i_sy & vbCrLf & vbCrLf & _
  25. "Ligne de synthèse : " & i_sy & vbCrLf & _
  26. "Code (3) : " & ws_sy.Cells(i_sy, 3).Text & vbCrLf & _
  27. "Numéro : " & ws_sy.Cells(i_sy, 1).Value & vbCrLf & vbCrLf & _
  28. "Ligne de MC : " & i_mc & vbCrLf & _
  29. "Code (27) : " & ws_mc.Cells(i_mc, 27).Text & vbCrLf & _
  30. "Numéro : " & ws_mc.Cells(i_mc, 7).Value, , _
  31. "Suppression de la ligne " & i_sy
  32. ws_sy.Rows(i_sy).Delete
  33. End If
  34. Exit For
  35. End If
  36. Next
  37. End If
  38. Next


et ça marche toujours ,j'ai encore regardé si dans ma cellule j'ai TF-post et bien oui!! mais toutes les lignes sont suprimées comme tout a l'heure. :??: 

Zeb au lieu d'ecrire j'ai fait un copier coller du mot TF- Post de la feuille vers mon code et j'ai remarquer qu'il y avait un peu plus d'espace entre TF et Post
puis j'ai relancé le code . et ça marche bien :bounce: 
vu que ça marche bien comment ne plus avoir a cliquer sur la boite de dialogue pour que le passage d'une ligne aune autre se face tout seul.

merci

comme ça non :??:  :

  1. Dim numero As Long
  2. Dim ws_mc As Worksheet
  3. Dim ws_sy As Worksheet
  4. Dim i_mc As Long
  5. Dim i_sy As Long
  6. Dim nblig_mc As Long
  7. Dim nblig_sy As Long
  8.  
  9. Set ws_mc = Worksheets("MC")
  10. Set ws_sy = Worksheets("Synthèse")
  11.  
  12. nblig_mc = ws_mc.Cells(Rows.Count, 7).End(xlUp).Row
  13. nblig_sy = ws_sy.Cells(Rows.Count, 1).End(xlUp).Row
  14.  
  15. For i_sy = nblig_sy To 1 Step -1
  16. If ws_sy.Cells(i_sy, 3).Text Like "*EMTN*" Or _
  17. ws_sy.Cells(i_sy, 3).Text Like "*Oblig*" Then
  18. numero = ws_sy.Cells(i_sy, 1).Value
  19. For i_mc = 1 To nblig_mc
  20. If numero = ws_mc.Cells(i_mc, 7).Value Then
  21. If ws_mc.Cells(i_mc, 27).Text <> "TF- Post" Then
  22.  
  23.  
  24. ws_sy.Rows(i_sy).Delete
  25. End If
  26. Exit For
  27. End If
  28. Next
  29. End If
  30. Next


oui et non maitre ... :) 
juste que ton elève doute encore de lui
sinon merci bcp maitre grace a toi je fais des progres :D 
ça veut dire que c'est correcte ce que j'ai ecris vu que tu n'a fais aucune remarque sur le code ..
n'est ce pas :??: 
Lassé par la pub ? Créez un compte