Excel 2003 - supp ligne suiv val dans col

Résolu
Dauph-B51 Messages postés 4 Date d'inscription   Statut Membre -  
 Dauph-B51 -
Bonjour,
Je trouve ce site génial et je m'y suis inscrit.
Mon problème dans les macros Excel.
J'ai une feuille qui contient 45000 ligne environ mais toutes les données ne sont pas intéressantes
Donc je voudrais supprimer des lignes sous les conditions suivantes :
1/ Si la colonne B est vide
2/ Si la colonne C est vide
3/ Si la colonne D = "Y"
Merci de votre aide
Dauphin.
Configuration: Windows XP
Internet Explorer 7.0

3 réponses

  1. LePierre Messages postés 249 Statut Membre 338
     
    bonjour

    les lignes répondant aux trois conditions seront supprimées avec ce code :

    Sub test()
        For Lig = 45000 To 1 Step -1
            ColB = Cells(Lig, 2).Value
            ColC = Cells(Lig, 3).Value
            ColD = Cells(Lig, 4).Value
            If ColB = "" And ColC = "" And ColD = "Y" Then
                Rows(Lig & ":" & Lig).Select
                Selection.Delete Shift:=xlUp
            End If
        Next
    End Sub

    à plus
    0
    1. Dauph-B51 Messages postés 4 Date d'inscription   Statut Membre
       
      Merci LePierre
      Je vais faire le test ce soir , je te dirai la suite
      A+
      Dauph
      0
    2. Dauph-B51
       
      Salut tout le monde
      C'est tout de même géniale
      Dans le mélange des avis des uns et des autres j'ai trouvé la solution
      Merci à vous tous
      Mon problème est résolu pour l'instant
      A+
      Dauph
      0
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    avec une macro de ce genre tu devrait nettoyer ton classeur
    Public Sub sup_condi()
    Dim lig As Long
    For lig = UsedRange.Rows.Count To 1 Step -1
        If Cells(lig, 2) = "" And Cells(lig, 3) = "" And Cells(lig, 4) = "Y" Then
            Rows(lig).Delete
        End If
    Next lig
    End Sub
    
    0
    1. LePierre Messages postés 249 Statut Membre 338
       
      bonjour

      ce code est en effet beaucoup plus rapide en exécution mais il faut tenir compte des lignes vierges en tête du tableau
      Je vous propose ce code modifié :
      Public Sub sup_condi()
          Dim lig As Long
          ActiveSheet.UsedRange.Select
          ligDeb = ActiveCell.Row - 1
          For lig = ActiveSheet.UsedRange.Rows.Count + ligDeb To 1 Step -1
              If Cells(lig, 2) = "" And Cells(lig, 3) = "" And Cells(lig, 4) = "Y" Then
                  Rows(lig).Delete
              End If
          Next lig
      End Sub

      à plus
      0
    2. Dauph-B51 Messages postés 4 Date d'inscription   Statut Membre
       
      1000 merci pour tout cela
      Je vais faire le test ce soir , je te dirai la suite
      A+
      Dauph
      0
  3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    il faut tenir compte des lignes vierges en tête du tableau

    Si elle sont vierges, elles n'ont pas "Y" en colonne D ?
    0
    1. Dauph-B51 Messages postés 4 Date d'inscription   Statut Membre
       
      Merci pour ton contact
      Il n'y a pas de ligne vierge
      c'est une base figée que le programmeur m'a exportée au format XLS.
      Je vais faire les tests des possibilités indiquées ci-dessus ce soir
      Je dirai si OK
      En fait à titre indicatif toutes les cases en question contiennent un caractère mais je dois supprimer tous les "Y"
      Cordialement
      0
    2. LePierre Messages postés 249 Statut Membre 338
       
      bonjour

      le morceau de code :
      ActiveSheet.UsedRange.Rows.Count

      compte le nombre de lignes de la sélection.

      S'il y a des lignes vierges en tête de feuille, le nombre de ligne n'est plus égal au N° de la dernière ligne de la sélection.
      Ce qui revient à dire que les dernières lignes (nombre correspondant au nombre de lignes vierges en tête de tableau) de la sélection ne seront pas analysées.

      c'est en testant ton code (qui me plait bien par ailleurs) que j'ai constaté ce problème.
      à plus
      0
    3. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744 > LePierre Messages postés 249 Statut Membre
       
      bonjour LePierre,

      Effectivement, tu as vu la faille et la fonction usedrange a quelques faiblesses (même si ici ce n'est pas le cas) mais comme toujours, on peut contourner.
      Comme l'utilisation du select en vba est source de lenteur et depuis 2000 souvent inutile, on peut le faire ainsi
      Public Sub sup_condi()
      Dim lig As Long
      For lig = UsedRange.SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
          If Cells(lig, 2) = "" And Cells(lig, 3) = "" And Cells(lig, 4) = "Y" Then
              Rows(lig).Delete
          End If
      Next lig
      End Sub
      

      Merci de la détection de l'erreur et à bientôt sur un autre sujet.
      0
    4. LePierre Messages postés 249 Statut Membre 338 > gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention  
       
      superbe

      par contre j'ai un petit problème je suis obligé d'ajouter "ActiveSheet." devant " UsedRange.SpecialCells(xlCellTypeLastCell).Row " sinon j'ai erreur d'exécution '424' Objet requis
      est-ce grave docteur ?

      merci et à plus
      0
    5. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744 > LePierre Messages postés 249 Statut Membre
       
      bonjour

      est-ce grave docteur ?

      Oh non ! je ne pense pas que ta santé soit en danger pour si peu, si celle d'excel !

      Cela fait partie de quelque "bizarreries" comme par exemple, comme c'est le cas ici, après la suppression des lignes, usedrange n'est pas toujours mis correctement à jour mais si tu sauvegardes, fermes et ouvres à nouveau, il retrouve ses esprits : c'est un peu dommage quand tu veux rajouter une ligne en fin après les suppressions.

      Pour ajouter "ActiveSheet." devant, c'est un peu le même problème et cela dépend où tu mets ta macro sur une feuille ou dans un module. Dans ce dernier cas, la feuille n'est pas nécessairement activée pour excel.

      En fait, si tu regardes la doc, c'est obligatoire, et je respectais cela scrupuleusement mais comme excel prend un certain nombre de valeurs par défaut, j'ai fini par ne plus les mettre et dans certains cas il réclame la rigueur !

      lui aussi...
      0