je voudrai utiliser la fonction find pour supprimer tous les lignes ne contenant pas certain critère
je voudrai que les critère soit :
supprimer ligne si écrit (xls) ET NON (*suivi affaire*)
j'ai pensé à ce code la (inspiré de l'aide) mais cela ne marche pas
Code:
Range("A" & derligne).Select
Range(Selection, Cells(1)).Select
With Worksheets("dirdoc").Range(selection,cell(1))
Set c = .Find([B]ma condition[/B] , LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Delete
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
Sub supp()
With Worksheets("Feuil1").Range("A1:A65536")
Set c = .Find("xls", LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
ligne = c.Row
Rows(ligne & ":" & ligne).Delete
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
en modifiant "Feuil1" et "Range("A1.....")
N'oublie pas de déclarer les variables
je voudrai utiliser la fonction find pour supprimer tous les lignes ne contenant pas certain critère
je voudrai que les critère soit :
supprimer ligne si écrit (xls) ET NON (*suivi affaire*)
j'ai pensé à ce code la (inspiré de l'aide) mais cela ne marche pas
Code:
Range("A" & derligne).Select
Range(Selection, Cells(1)).Select
With Worksheets("dirdoc").Range(selection,cell(1))
Set c = .Find([B]ma condition[/B] , LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Delete
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
Si tu demandes de l'aide, c'est parce que ton code ne fonctionne pas ? Alors pourquoi ne donner q'un bout de code ? T'es sûr que t'as pas d'autres erreurs ?
Range("A" & derligne).Select Range(Selection, Cells(1)).Select en supposant que derligne soit une variable Long qui détermine la dernière ligne à tester. on va dire 15 pour les explication
sélectionner la cellule A15
sélectionner la plage(A15 : première cellule de la plage des cellules de la feuille active)
autant faire Range("A1:A" & derligne).select
With Worksheets("dirdoc").Range(selection,cell(1))
définir le préfixe :
feuille dirdoc : ça, c'est toi qui sait cell(1) : ??? tu as déclaré un tableu de plages de nom cell à une dimension ?
Set c = .Find(ma condition , LookIn:=xlValues)
Je suppose que ma condition doit être pour le forum, que c'est aussi ce que tu cherches ?
(xls) ET NON (*suivi affaire*) : si c'est "xls" ou "(xls)", automatiquement, ce n'est pas autre chose. Où peut-être (mais, c'est dur) doit-on deviner de quoi tu parles ? (Essaies sur Médiums.com, ou peut-être sur BouleDeCristal.net, ils devraient pouvoir t'aider)
c.Delete : tu supprimes la cellule qui rempli ma condition ? Pas la ligne ?
Déjà, en haut de ton module, essaies de mettre
Option Explicit
ça t'oblige à déclarer tes variables (c'est chiant), mais si tu as une faute de frappe, VBA ne trouvant pas de déclaration te le signale (et ça, ça évites un tas de cheveux arrachés).
Ensuite, si tu veux de l'aide, soit tu donnes un fichier exemple, soit tu donnes ton code en intégralité : on peut corriger des erreurs, mais que si on peut les voir.
Dans la messure du possible, il faut éviter l'usage des SELECT : suivant le module et la feuille, ça peut déclencher une erreur, ça ralentit le code, et c'est difficile de ne pas faire d'erreur sur un code long.
Quand on supprime des lignes, il est préférable de remonter :
Excel teste la ligne 15 => critère=Vrai => suppression ligne 15
Excel, n'en tient pas compte, et continue le code à la ligne suivante (ligne 16, Ex-17), sauf si tu fais en sorte que la prochaine testée soit de nouveau la 15 ou que tu testes en remontant : la 14 reste la 14.
D'accord avec Gorfaël, tes explications ne sont pas d'une limpidité absolue. Je te propose d'essayer, si toutefois, j'ai compris ton besoin :
Code:
Sub test()
Dim macondition As String
Dim derligne As Integer
Dim c As Range, c1 As Range
derligne = ActiveSheet.Range("A65500").End(xlUp).Row
macondition = "xls"
With Worksheets("dirdoc").Range("A1:A" & derligne)
Set c = .Find(macondition)
If Not c Is Nothing Then
firstAddress = c.Address
Do
Set c1 = .FindNext(c)
c.EntireRow.Delete
Set c = c1
On Error Resume Next
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
Ce qui permet de résoudre le problème de reconnaissance par Excel d'une référence qui n'existe plus.
Il existe des solutions plus élégantes mais plus difficiles techniqueemnt...avec la fonction find.
Sinon il y a plus simple avec une simple boucle For Next... si le nombre de lignes n'est pas trop grand.
une proposition sans Find avec une boucle sur les cellules (peut-être plus lent...)
Code:
Sub Macro1()
Dim lf As Integer 'déclare la variable lf
Dim x As Long 'déclare la variable x
lf = Range("A65536").End(xlUp).Row 'définit la variable lf (à adapter)
For x = lf To 1 Step -1 'boucle sur toutes les cellules éditées de la colonne A (de la dernière à la première)
If Cells(x, 1).Value = "ta_condition" Then Rows(x).Delete 'si la condition est trouvée, supprime la ligne
Next x 'prochaine cellule éditée de la colonne A
End Sub
Édition :
Je navet (dans ce cas là on peut l'écrire comme ça... Si, si !) pas lu jusqu'au bout Spinolan... Ça correspond à ta soluce.
euh Je pensais avoir été clair
Mais euh au vu des réponse je me suis perdu mdr
ma condition sera extraite d'une cellule mais pour l'instant je voudrai que se soit xls ET NON suivi affaire
voici le code que j'ai mis :
Code:
ActiveWindow.ActivateNext
ActiveCell.SpecialCells(xlLastCell).Select
Rem Range("A1537").Select
derligne = ActiveSheet.Range("A65536").End(xlUp).Row
Rem Stop
Application.DisplayAlerts = False
Range("A" & derligne).Select
Range(Selection, Cells(1)).Select
With Worksheets("dirdoc").Range(selection,cell(1))
Set c = .Find(ma condition , LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Delete
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
J'ai un extrait dans un fenetre excel d'une commande "dir" :
voici un exemple de l'extraction
Le volume dans le lecteur C n'a pas de nom.
Le numéro de série du volume est F478-FFCF
Effectivement ce n'était vraiment pas clair ! Pourquoi ne pas joindre un fichier exemple ? Ca nous éviterait de chercher pour rien
Cependant en analysant un tout petit peu les codes translmis tu aurais pu trouver la solution! Ci après le mien à peine rectifié....
Code:
Sub test()
Dim macondition As String
Dim derligne As Integer
Dim c As Range, c1 As Range
a = Range("A1").End(xlDown).Row
derligne = ActiveSheet.Range("A65500").End(xlUp).Row
macondition = "xls"
With Worksheets("dirdoc").Range("A1:A" & derligne)
Set c = .Find(macondition, lookat:=xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Do
Set c1 = .FindNext(c)
If InStr(LCase(c), "suivi affaire") = 0 Then c.EntireRow.Delete
Set c = c1
On Error Resume Next
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub
Cordialement
Edit : Le Lcase c'est juste pour taquiner Pierrejean...car noir_desir a mis suivi affaire et pas SUIVI AFFAIRE
PAs vu dernier message noir_désir...
Il est indispensable dans ce code, car essaie de le retirer et tu verras qu'il plante lorsque la dernière occurence est trouvée. Il ne sert donc qu'une fois. Je l'explique par la suppression de ligne qui supprime la référence du c...