utilisation de la fonction find

noir_desir

XLDnaute Junior
Bonjour tous le monde

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
 

Eric 45

XLDnaute Occasionnel
Re : utilisation de la fonction find

Bonjour à tous
Bonjour noir_desir

Tu peux essayer cela :

Code:
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

Eric
 

Gorfael

XLDnaute Barbatruc
Re : utilisation de la fonction find

noir_desir à dit:
Bonjour tous le monde

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
Salut
p'vez répétationner la question ?!? :confused:

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 ? :D

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.

A+
 
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : utilisation de la fonction find

Bonjour le fil,
j'ai pensé à ce code la (inspiré de l'aide) mais cela ne marche pas
: c'est à dire ?

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.

Cordialement
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : utilisation de la fonction find

Bonjour le fil, bonjour le forum,

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.
 
Dernière édition:

noir_desir

XLDnaute Junior
Re : utilisation de la fonction find

euh Je pensais avoir été clair :eek:
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

Répertoire de c:\essai

28/06/2007 17:31 149 504 V1069.xls
20/06/2007 12:12 142 848 V819_Fichier suivi affaire.xls
27/04/2007 16:36 138 240 V990_ Suivi affaire.xls
3 fichier(s) 430 592 octets

Total des fichiers listés :
3 fichier(s) 430 592 octets
0 Rép(s) 9 652 703 232 octets libres


Je voudrai donc supprimer de cette extraction les lignes contenant les lettres xls ET NON suivi affaire (ET NON étant ici le critère logique)

pour cela je veux utiliser la fonction find :)

en gros je voudrai que ca ressemble à cela au final

Le volume dans le lecteur C n'a pas de nom.
Le numéro de série du volume est F478-FFCF

Répertoire de c:\essai

20/06/2007 12:12 142 848 V819_Fichier suivi affaire.xls
27/04/2007 16:36 138 240 V990_ Suivi affaire.xls
3 fichier(s) 430 592 octets

Total des fichiers listés :
3 fichier(s) 430 592 octets
0 Rép(s) 9 652 703 232 octets libres
 

Pièces jointes

  • Classeur1.xls
    13.5 KB · Affichages: 52
  • Classeur1.xls
    13.5 KB · Affichages: 54
  • Classeur1.xls
    13.5 KB · Affichages: 59
Dernière édition:

Spitnolan08

XLDnaute Barbatruc
Re : utilisation de la fonction find

Re,
Bonjour Robert; Pierrejean

Effectivement ce n'était vraiment pas clair ! Pourquoi ne pas joindre un fichier exemple ? Ca nous éviterait de chercher pour rien:eek:
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...
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : utilisation de la fonction find

bonjour a tous

taquinerie pour taquinerie

noir desir a ecrit

suivi affaire ET Suivi affaire

c'est pour cela que j'ai mis Ucase
mais je reconnais bien volontiers que le Lcase fonctionne tout aussi bien !!!

Quant au

on resume next

je m'interroge sur son utilité

pour ma part

1) je ne l'utilise que pour couvrir 1 ligne en sachant quelle erreur est produite
2) je l'annule systematiquement par
on error Goto 0
 

Spitnolan08

XLDnaute Barbatruc
Re : utilisation de la fonction find

Re,
Quant au
on resume next
je m'interroge sur son utilité
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...:confused:

Cordialement
 

Statistiques des forums

Discussions
312 452
Messages
2 088 543
Membres
103 880
dernier inscrit
rafaelredsc