Suppresion lignes dans feuille excel

Résolu
Mag55 -  
 Mag55 -
Bonjour,

Je rencontre un petit soucis avec une macro que j'essaie inlassablement de faire tourner. Elle est la suivante :

Private Sub ListBox1_Change()

Dim i As Long
For i = Range("E14") To Range("E1000")
If Cells(i, 5) = "Total CDI 2011" Then Rows(i).Delete
Next i

'Cellule liée à la sélection ds boîte de dialogue
Range("$A$2").Value = ListBox1.Value

End Sub

En fait, j'aimerais qu'à chaque changement de sélection dans ma boîte de dialogue, VBA me supprime la ligne contenant "Total CDI 2011" qui ne peut se trouver qu'en colonne 5.

J'ai réduit la plage de données pour ne pas la faire tourner trop longtemps.

Mais il doit y avoir un soucis quelque part car elle ne fonctionne pas.

J'appelle donc comme d'habitude à vos talents pour me venir en aide!

Merci

1 réponse

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    1- consulte tes messages privés,
    2- Une boucle qui supprime des lignes doit toujours commencer par la dernière ligne et finir à la première, sinon la macro risque d'omettre certaines de ces lignes.
    3- Pour obtenir le numéro de la dernière ligne non vide d'une colonne, Voyez cette merveilleuse astuce............
    Donc, ton code devient :
    Private Sub ListBox1_Change()   
    Dim Lign As Long, DerniereLigne As Long  
    
    DerniereLigne = Range("E" & Rows.Count).End(xlUp).Row  
    For Lign = DerniereLigne To 14 Step - 1 'ici on ne mets que les numéros de ligne   
    If Cells(Lign, 5) = "Total CDI 2011" Then Rows(Lign).Delete   
    Next Lign   
    
    'Cellule liée à la sélection ds boîte de dialogue   
    Range("$A$2").Value = ListBox1.Value   
    End Sub 

    OK???
    Cordialement,
    Franck P
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      De plus, ton code étant lancé depuis un UserForm, il vaut mieux, dans tous les cas, préciser le nom de la feuille. Par l'intermédiaire de With End With. Comme ceci :
      Private Sub ListBox1_Change()   
      Dim Lign As Long, DerniereLigne As Long  
      With Sheets("NomDeTaFeuilleEntreGuillemets")
          DerniereLigne = .Range("E" & Rows.Count).End(xlUp).Row  
          For Lign = DerniereLigne To 14 Step - 1 'ici on ne mets que les numéros de ligne   
              If .Cells(Lign, 5) = "Total CDI 2011" Then .Rows(Lign).Delete   
          Next Lign   
          'Cellule liée à la sélection ds boîte de dialogue   
          .Range("$A$2").Value = ListBox1.Value
      End With   
      End Sub 
      0
    2. Mag55
       
      Merci Pikaju, j'irai consulter à ma pause.

      C'est fou, j'ai réussi à faire tourner une macro pendant une dizaine de minutes puis sans rien changer depuis, une erreur s'affiche : Incompatibilité de type avec la macro suivante :

      Private Sub ListBox1_Change()

      Dim i As Long
      For i = Range("E65536").End(xlUp).Row To 2 Step -1
      If Cells(i, 5) = "Total CDI 2011" Then Rows(i).Delete
      Next i

      Dim j As Long
      For j = Range("E65536").End(xlUp).Row To 2 Step -1
      If Cells(j, 5) = "Total CDD 2011" Then Rows(j).Delete
      Next j

      Dim k As Long
      For k = Range("E65536").End(xlUp).Row To 2 Step -1
      If Cells(k, 5) = "Total INT 2011" Then Rows(k).Delete
      Next k

      Dim l As Long
      For l = Range("E65536").End(xlUp).Row To 2 Step -1
      If Cells(l, 5) = "Total MO 2011" Then Rows(l).Delete
      Next l

      Dim m As Long
      For m = Range("L65536").End(xlUp).Row To 2 Step -1
      If Cells(m, 12) = "+ Prov manuelles SAP" Then Rows(m).Delete
      Next m

      Dim n As Long
      For n = Range("E65536").End(xlUp).Row To 2 Step -1
      If Cells(n, 5) = "R 2011 SAP" Then Rows(n).Delete
      Next n

      Dim o As Long
      For o = Range("L65536").End(xlUp).Row To 2 Step -1
      If Cells(o, 12) = "Taxes fiscales" Then Rows(o).Delete
      Next o

      'Cellule liée à la sélection ds boîte de dialogue
      Range("$A$2").Value = ListBox1.Value

      End Sub

      Du coup, je vais essayer la tienne sans plus attendre mais aimerais tout de même comprendre pourquoi la macro ne marche plus...
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      1- incompatibilité de type, ça doit être du au contenu ou au format d'une de tes cellules...
      2- pourquoi boucler sur les mêmes lignes autant de fois???
      Tu peux le faire en 1 seule boucle :
      Si la cellule est égale à ceci ET si la cellule est égale à cela etc... Alors
      Par exemple :
      Dim i As Long  
      For i = Range("E65536").End(xlUp).Row To 2 Step -1  
      If Cells(i, 5) = "Total CDI 2011" Then Rows(i).Delete 
      If Cells(i, 5) = "Total CDD 2011" Then Rows(i).Delete  
      If Cells(i, 5) = "Total INT 2011" Then Rows(i).Delete 
      If Cells(i, 5) = "Total MO 2011" Then Rows(i).Delete  
      If Cells(i, 12) = "+ Prov manuelles SAP" Then Rows(i).Delete  
      'etc.... 
      'tu peux même utiliser l'opérateur OR comme ceci : 
      If Cells(i, 5) = "R 2011 SAP" Or Cells(o, 12) = "Taxes fiscales" Then Rows(n).Delete  
      Next i 

      Tu y gagnes en temps d'exécution, la boucle ne se fait qu'une seule fois...
      3- N'utilises plus des variables à un seul caractère. Une variable doit être explicite. On doit vior au premier coup d'oeil que tu boucles sur des lignes (et non pas des colonnes ou des artichauds)
      Dans cette boucle, je remplacerais, perso, les i par des Lign. Tu avoueras que c'est beaucoup plus parlant.
      En règle générale, une variable est composée d'au moins 3 caractères et commence par une majuscule. Il est préférable également d'indiquer, dans son nom, le type de variable.
      Exemple d'une variable de type String censée représenter des noms de feuilles :
      Dim StrNomFeuil As String

      4- Lorsque l'on créé du code en VBA il est également d'usage de l'indenter (mettre des retraits en débuts de lignes pour les boucles, les If End If, less With End With Etc...).

      Ainsi :
      Dim i As Long  
      For i = Range("E65536").End(xlUp).Row To 2 Step -1  
      If Cells(i, 5) = "Total CDI 2011" Then 
      Rows(i).Delete
      End If 
      Next i 

      S'écrit :
      Dim i As Long 
       
      For i = Range("E65536").End(xlUp).Row To 2 Step -1  
          If Cells(i, 5) = "Total CDI 2011" Then 
              Rows(i).Delete
          End If 
      Next i 

      OK?
      0
    4. Mag55
       
      J'ai encore droit à des incompabilités de type avec la macro suivante :

      Private Sub ListBox1_Change()

      Dim Lign As Long
      For Lign = Range("E65536").End(xlUp).Row To 2 Step -1
      If Cells(Lign, 5) = "Total CDI 2011" Then Rows(Lign).Delete
      If Cells(Lign, 5) = "Total CDD 2011" Then Rows(Lign).Delete
      If Cells(Lign, 5) = "Total INT 2011" Then Rows(Lign).Delete
      If Cells(Lign, 5) = "Total MO 2011" Then Rows(Lign).Delete
      If Cells(Lign, 12) = "+ Prov manuelles SAP" Then Rows(Lign).Delete
      Next Lign

      'Cellule liée à la sélection ds boîte de dialogue
      Range("$A$2").Value = ListBox1.Value

      Il me surligne If Cells(Lign, 5) = "Total CDI 2011" Then

      Effectivement, la démarche que tu m'as donné est de loin plus claire !! Les compétences m'ont manqué pour la raccourcir comme tu me l'as proposé.
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Losque la macro buggue, elle te propsoe un "débogage". Clic donc un peu voir sur "débogage" et dis nous qu'elle ligne est surlignée de jaune.
      0