Suppression lignes selon valeur cellule

Résolu
Evedll Messages postés 79 Statut Membre -  
Evedll Messages postés 79 Statut Membre -
Bonjour,

J'ai essayé de saisir des lignes VBA pour supprimer un nombre de ligne (6 ou 7 en fonction des données) selon une valeur trouvée dans la colonne A ("Noé v2017") qui revient en boucle. Je ne sais pas faire de boucle malgré mes différentes recherches donc j'ai trouvé l'astuce d'utiliser la touche F4 après savoir lancé ma macro afin qu'elle se répète en boucle (je sais ce n'est pas ce qu'il faut faire mais en attendant mieux...). Est-il possible de m'aider à créer cette boucle.

Sub Supp_Lignes_Noe()
'
'
    'Range("A1").Select
    Columns("A:A").Select
    'ActiveCell.Columns("A:A").EntireColumn.Select
    Selection.Find(What:="Noé v2017", After:=ActiveCell).Activate
    ActiveCell.Offset(0, 0).Range("1:7").EntireRow.Select
    Selection.Delete Shift:=xlUp
    'Selection.ClearContents
End Sub


Par la suite, si c'est possible, j'aimerai pouvoir effectuer la même manipulation en entrant dans une boite de dialogue le nom de ma recherche ("Noé v2017" ==>" Noé v2018"...) et dans une autre boite de dialogue le nombre de ligne à supprimer (5, 6 ou 7 selon mon fichier). En attendant, je modifie manuellement cette macro selon mes besoins.

Donc pour récapituler, il doit trouver le texte "Noé v201..." et à partir de cette cellule, supprimer un nombre de ligne x.
L'éditeur de macro ne permet pas cette manipulation.
Je vous remercie de bien vouloir m'aider.
Dans cette attente, je continue mes recherches
Cordialement
Evelyne

3 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour

    Function FindAll(ByVal sText As String, ByRef oRange As Range, ByRef arMatches() As String) As Boolean
    ' --------------------------------------------------------------------------------------------------------------
    ' FindAll - To find all instances of the1 given string and return the row numbers.
    ' If there are not any matches the function will return false
    ' --------------------------------------------------------------------------------------------------------------
    On Error GoTo Err_Trap
    Dim rFnd As Range ' Range Object
    Dim iArr As Integer ' Counter for Array
    Dim rFirstAddress ' Address of the First Find
    ' -----------------
    ' Clear the Array
    ' -----------------
    Erase arMatches
    Set rFnd = oRange.Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)
    
    If Not rFnd Is Nothing Then
       rFirstAddress = rFnd.Address
       Do Until rFnd Is Nothing
          iArr = iArr + 1
          ReDim Preserve arMatches(iArr)
          arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
          Set rFnd = oRange.FindNext(rFnd)
          If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
       Loop
       FindAll = True
    Else
    ' ----------------------
    ' No Value is Found
    ' ----------------------
       FindAll = False
    End If
    ' -----------------------
    ' Error Handling
    ' -----------------------
    Err_Trap:
    If Err <> 0 Then
       MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
       Err.Clear
       FindAll = False
       Exit Function
    End If
    End Function
    
    Sub deleteByValue()
        Dim arMatches() As String
        Dim valcherch As String
        Dim Sh As Worksheet
        Dim rng As Range
        
        Set Sh = ThisWorkbook.Sheets("Feuil1")
        Set rng = Sh.Range("A1:A100")
        
        valcherch = "Noé v2017"
        
        bFound = FindAll(valcherch, rng, arMatches())
        If bFound = True Then
          nbElemTrouve = UBound(arMatches)
          For i = 1 To nbElemTrouve
             Debug.Print (arMatches(i))
             'ici tu peux mettre le code de suppression
             '...
             
          Next
        End If
    End Sub
    
    

    1
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      NB : Prend le code de ThauTheme .
      Je viens de voir que le miens pourrait te causer des difficultés....
      En effet, il faudra faire la boucle en partant de la fin (comme dans l'exemple de ThauTheme ) cas sinon les Numéros de lignes ne seront plus les bons au fur et à mesure que tu les supprimera )
      0
    2. Evedll Messages postés 79 Statut Membre
       
      Bonjour Jordane,
      Oui j'ai essayé ce matin avec un peu de mal. Je vais donc voir celui de ThauTheme.
      Cependant, je te remercie beaucoup de m'aider car je n'ai jamais appris et c'est difficile seule mais je progresse avec l'aide de vous tous.
      Cordialement
      Evelyne
      0
    3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Voila le code modifié et fonctionnel...
      Function FindAll(ByVal sText As String, ByRef oRange As Range, ByRef arMatches() As String) As Boolean
      ' --------------------------------------------------------------------------------------------------------------
      ' FindAll - To find all instances of the1 given string and return the row numbers.
      ' If there are not any matches the function will return false
      ' --------------------------------------------------------------------------------------------------------------
      On Error GoTo Err_Trap
      Dim rFnd As Range ' Range Object
      Dim iArr As Integer ' Counter for Array
      Dim rFirstAddress ' Address of the First Find
      ' -----------------
      ' Clear the Array
      ' -----------------
      Erase arMatches
      Set rFnd = oRange.Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)
      
      If Not rFnd Is Nothing Then
         rFirstAddress = rFnd.Address
         Do Until rFnd Is Nothing
            iArr = iArr + 1
            ReDim Preserve arMatches(iArr)
            arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
            Set rFnd = oRange.FindNext(rFnd)
            If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
         Loop
         FindAll = True
      Else
      ' ----------------------
      ' No Value is Found
      ' ----------------------
         FindAll = False
      End If
      ' -----------------------
      ' Error Handling
      ' -----------------------
      Err_Trap:
      If Err <> 0 Then
         MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
         Err.Clear
         FindAll = False
         Exit Function
      End If
      End Function
      
      Sub deleteByValue()
          Dim arMatches() As String
          Dim valcherch As String
          Dim Sh As Worksheet
          Dim rng As Range
          Application.ScreenUpdating = False
          Set Sh = ThisWorkbook.Sheets("Feuil1")
          Set rng = Sh.Range("A1:A3000")
          
          valcherch = "Noé v2017"
          
          bFound = FindAll(valcherch, rng, arMatches())
          If bFound = True Then
            nbElemTrouve = UBound(arMatches)
            For i = nbElemTrouve To 1 Step -1
               Debug.Print (arMatches(i))
               'ici tu peux mettre le code de suppression
               '...
               Rows(arMatches(i)).Delete
               
            Next
          End If
          Application.ScreenUpdating = True
      End Sub
      
      
      0