Suppression selon critère
Bonjour à tous !
Eh bien me revoilà
j'ai un peu appris mais les lacunes se font tjrs autant souffrir ... ma boite me paye une formation VBA mais c'est pas pour tout de suite
j'aurai une question. Voilà j'ai cette macro assez simple
For i = 1 To 65536
If Cells(i, "F") = "Comptabilisée" Then
Cells(i, 1).EntireRow.Delete
i = i - 1
End If
Donc là il m'efface correctement les lignes qui comprennent la valeur "Comptabilisée" en colonne F mais j'aimerai qu'au lieu de cela :
S'il trouve la valeur "Comptabilisée" en colonne F, il aille chercher la valeur en colonne "Z" et supprime toutes les lignes sui comportent la valeur qu'il y aura trouvé.
Merci encore pour votre aide à tous !!!
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour,
Il vaudrait mieux envoyer ta feuille réelle, avec seulement quelques lignes
de façon à tester et régler la macro
Combien de lignes à traiter (environ) ?
Amicalement
Claude.
Voici un exemple tout refait, donc pour le coup la valeur Comptabilisée est passé de la colonne F à I
et la valeur en colonne Z est maintenant en colonne J
Donc j'aimerai que la si en colonne I il trouve "Comptabilisée" alors il va chercher la valeur en colonne J et supprime toutes les lignes qui ont cette valeur.
Dans mon exemple ca donne : il va trouver en colonne I "Comptabilisée" pour les lignes 2 ; 8 et 9 donc il va devoir me supprimer les lignes 2;11;12 & 8;13;14 é la ligne 9
Merci encore !
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Combien de lignes à traiter (environ) ?
Je parlais du total de lignes de la feuille
c'est pour savoir comment orienter une solution
Claude.
le nombre de ligne a traiter va être assez important ... disons que ca pourra aller de 200 à 2000 mais la macro peut prendre son temps
Bonsoir,
un petit exemple :
Sub suppr()
Dim Compta As Object
Dim Cel As Range, Plg As Range
Dim Tmp
Dim I As Long, DerLig As Long
Application.ScreenUpdating = False
Set Compta = CreateObject("Scripting.Dictionary")
DerLig = [F65000].End(xlUp).Row
Set Plg = Range("F2:F" & DerLig)
With Plg
.Offset(, 20).Replace "", "zzzzzzz"
For Each Cel In .Cells
If Cel.Value = "Comptabilisée" Then Compta.Item(Cel.Offset(, 20).Value) = Cel.Offset(, 20).Value
Next Cel
If Compta.Count = 0 Then Exit Sub
Tmp = Application.Transpose(Compta.Items)
For I = LBound(Tmp) To UBound(Tmp)
.Offset(, 20).Replace Tmp(I, 1), "", xlWhole
Next I
.Offset(, 20).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
.Offset(, 20).Replace "zzzzzzz", ""
End With
End Sub
Nota, les "zzzzzzz" sont là pour s'affranchir des cellules non encore renseignées de la colonne "Z"
Bonne soirée
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
J'ai ajouter une ligne en haut
Sub SupprLignes()
''Macros par Claude Dubois pour "wiid" Excel-Pratique le 8 Déc 09
Dim Lg%, i%
Lg = Cells.Find("*", , , , xlByRows, xlPrevious).Row
Application.ScreenUpdating = False
For i = Lg To 3 Step -1
If Cells(i, "i") = "Comptabilisée" Then
Range("m1") = Cells(i, "j")
Range("n2").Formula = "=$j3=$m$1"
Range("a2:j" & Lg).AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Range("n1:n2"), Unique:=False
Range("c3:c" & Lg).SpecialCells(xlCellTypeVisible).EntireRow.Delete
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
End If
Next i
Range("m1:n2").ClearContents
End Sub
Bonne journée
Claude.
Merci beaucoup Claude pour tes 2 exmples.
Je regarde, comprends et te reviens asap car pour l'instant je n'arrive pas à l'inclure dans mon cas réel au boulot.
Ne voulant pas poser trop de questions stupides, je vais chercher un peu de mon coté comme un grand.
Encore merci, je reviens d'ici 2j le temps de comprendre ce que tu as fait en détail
re bonjour à tous,
Completement débordé ces derniers j'ai du mettre cette macro de coté. Je tiens encore à te remercier Claude, mais je n'ai pas vraiment le niveau pour comprendre ta macro...
Je pensais écrire qq chose comme cela plutot :
Private Sub CommandButton3_Click()
For i = 1 To 65000
If Cells(i, "I") = "Comptabilisée" Then
For j = 1 To 65000
If Cells(j, "J") = Cells(i, "K") Then
ActiveCell.EntireRow.Delete
End If
Next j
ActiveCell.EntireRow.Delete
End If
Next i
End Sub
Malheureusement ca ne marche pas...
Si on prends mon fichier "exemple" il va aller sur la premiere ligne, il va trouver la valeur "comptabilisée" en colonne "I" il doit donc récuperer l'ID colonne "J" et me supprimer les lignes 1,11 et 12.
Merci pour votre aide !
edit : j'oubliais ! bonne fête de fin d'année à tous et à toutes !
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir wiid, à tous,
je n'ai pas vraiment le niveau pour comprendre ta macro...
Déjà, faudrait savoir de quelle macro tu parles, celle de cousinhub ou la mienne ?
Merci beaucoup Claude pour tes 2 exemples.
Tu n'as peut-être pas vu que nous sommes deux à t'avoir répondu !
N'ayant pas tester la macro de cousinhub, je ne parlerais que de la mienne.
Sur le fichier que je t'ai joint (wiid.xls), çà marche !
Maintenant, une macro c'est une pièce d'horlogerie qui ne fonctionne que sur un fichier
structuré à l'identique de celui pour lequel elle a été conçue.
c'est-à-dire que le tableau commence à la même cellule (ligne et colonne)
Dans mon exemple, les en-têtes sont en en ligne 2 et les données commencent en A3
C'est quand même pas sorcier d'envoyer ta feuille avec seulement 10 lignes !
à la limite, tu mets "Toto" dans chaque cellule (confidentialité) , c'est juste pour voir
la structure et régler la macro avec; chose qu'apparemment tu n'as pas su faire.
Pour ta gouverne, quand tu supprime des lignes il faut commencer la boucle par le bas et
remonter jusqu'en haut.
Quand on sait pas, on écoute et on suit les conseils, quitte à ne comprendre que + tard,
sinon on ne pose pas de question !
Pas content le Claude !
Bonnes fêtes quand même
Amicalement
Re bonjour à tous,
Je vais tout d'abord commencer par vous présenter mes meilleurs voeux pour cette année qui commence !
Je suis attristé de constater que j'ai pu me faire passer pour un mal autrui auprès de gens chez qui
je venais chercher de l'aide.
Effectivement, la réponse de "cousinhub" m'avait échappé et pensait qu'elle venait de toi Claude.
Mes plus plates excuses et je présente également mes remerciements à "cousinhub" pour son aide sur ce sujet.
En effet, je n'ai pas réussi à adapter vos macros à mon travail réel... je pensais pouvoir y arriver car
j'y ai réussi précédemment mais j'ai été dépassé par votre niveau.
Effectivement, j'ai voulu créer un exemple très proche de ce que je dois reproduire... sans réussir à adapter
votre travail. Certes cette méthode n'est pas bonne et je m'excuse d'avoir pu penser que j'apprendrai plus et
plus vite de cette manière (certes à vos dépends et je m'en excuse je n'avais pas bien pris la mesure de la chose
puisque je pensais, justement, arriver à adapter la macro).
Sur le fichier que je t'ai joint (wiid.xls), çà marche !
Maintenant, une macro c'est une pièce d'horlogerie qui ne fonctionne que sur un fichier
structuré à l'identique de celui pour lequel elle a été conçue.
c'est-à-dire que le tableau commence à la même cellule (ligne et colonne)
Dans mon exemple, les en-têtes sont en en ligne 2 et les données commencent en A3
C'est quand même pas sorcier d'envoyer ta feuille avec seulement 10 lignes !
à la limite, tu mets "Toto" dans chaque cellule (confidentialité) , c'est juste pour voir
la structure et régler la macro avec; chose qu'apparemment tu n'as pas su faire.
Je ne lis que du vrai dans ta phrase... je me permets donc de vous retransmettre un fichier. J'ai laissé qq lignes
et voici ce que j'aimerai reproduire
Les colonnes qui nous interesse donc sont les "A" ; "I" et "Y"
Etape 1 :
La macro va reperer toutes les lignes dont on trouve en colonne "H" la valeur "comptabilisée"
Si elle trouve la valeur comptabilisée elle va chercher sur cette meme ligne la valeur en colonne "Y" et
supprimer du fichier toutes les lignes qui ont la même "ID" en colonne "Y"
ex : ligne 1, il va trouver "comptabilisé" en colonne "H" donc il va supprimer les lignes 2, 5 et 7 du fichier
Etape 2 : (add...)
Si elle trouve une valeur différente de "comptabilisée" en colonne "H", j'aimerai qu'elle récupere encore uen fois
l'ID en colonne "Y" et qu'elle ne garde que la ligne dont le numéro en colonne A est le plus grand :
ex : ligne 2, il va trouver "envoyé" en colonne "H" donc il va supprimer les lignes 3 et 4 pour ne garder que la 6
Pour ta gouverne, quand tu supprime des lignes il faut commencer la boucle par le bas et
remonter jusqu'en haut.
merci pour l'info
j'aime pourtant comprendre en même temps... erreur de ma part...Quand on sait pas, on écoute et on suit les conseils, quitte à ne comprendre que + tard,
sinon on ne pose pas de question !
Encore pardon pour ce malentendu
Je vous remercie encore tous pour votre aide, et vous resouhaite une très bonne année 2010 en esperant que tout le
monde ait passé de bonne fêtes !
- Messages
- 9'246
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir,
Attention à l'orthographe de "comptabilisé"
sans majuscule et sans féminin
avant "Comptabilisée", maintenant "comptabilisé" (suivant ton dernier fichier)
Amicalement
Claude.