Suppression de ligne en fonction d'une date

fortbelin Messages postés 22 Statut Membre -  
fortbelin Messages postés 22 Statut Membre -
Bonjour,

Bonjour à tous et à toutes.

J'ai besoin de votre aide pour une macro.

Il s'agit de pouvoir supprimer des lignes d'une feuille excel mais seulement si une cellule de cette ligne contiens une date qui est antérieure à une date de référence.

Donc par exemple, supprimer toutes les lignes qui contiennent des dates antérieur au 25/12/2002

Merci beaucoup pour votre aide

10 réponses

  1. Heremion Messages postés 564 Statut Membre 102
     
    Dans ce cas :

    Private Sub CommandButton1_Click()
    Dim currentd As Date
    Dim refdate As Date
    Dim i, imax
    
        refdate = Range("A1").Value
        imax = Range("A65536").End(xlUp).Row
        
        For i = IndiceLigneDeTaPlageDeDate To imax + 1
            If (Range("A" & i).Value < refdate) And (Range("A" & i).Value <> "") Then
                Range("A" & i).EntireRow.Delete
                i = i - 1
            End If
        Next i
    End Sub


    où ta date de référence est en A1, et ta plage de données est en colonne A mais tu peux adapter. Si tes dates sont en ligne G, remplace Range("A65536") par Range("G65536"), et les "A" & i par "G" & i.

    Voilà.
    1
    1. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      Bonjour,

      ta macro n'est pas exacte : quand on supprime des lignes, on ne part pas de la première à la dernière, mais de la dernière à la première.

      En effet supposons que l'on doive supprimer la ligne 4 et 5. En partant de la première ligne, on va supprimer la 4e. La 5e devient donc la 4e, et la 6e devient la 5e. On continue le code et boucle, on arrive sur la 5e ligne (qui était la 6e), cette ligne n'est pas à supprimer. Du coup nous avons loupé la ligne n°5...

      Dans l'autre sens, on part de la dernière, on supprime la 5e, la 4e reste 4e. On boucle, et on supprime la 4e.

      Du coup il vaut mieux faire
      For i = Imax+1 to IndiceLigneDeTaPalgeDeDate Step -1


      Cordialement.
      0
    2. Heremion Messages postés 564 Statut Membre 102
       
      Par forcément puisque je décrémente dans le cas où je supprime, ce qui fait qu'on reste sur la même ligne. Du coup, aucun oublie, mais tu peux effectivement le faire dans l'autre sens, puisqu'il n'y aurait nullement besoin de décrémenter :)
      0
    3. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      Oups, autant pour moi, j'ai lu trop vite ^^

      Mais du coup vu que ton imax ne change pas et que tu supprimes des lignes, à un moment tu vas tester des lignes vides ;)
      0
    4. Heremion Messages postés 564 Statut Membre 102
       
      d'où le test
      (Range("A" & i).Value <> "")

      tu as encore lu trop vite ma p'tite chossette9 :D
      0
    5. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      Ouais mais tu vas quand même boucler. Certes ce sera super rapide, mais tu vas quand même boucler sur ces lignes vide.

      C'est juste pour chipoter et pour optimiser un max le code.
      0
  2. Heremion Messages postés 564 Statut Membre 102
     
    Bonjour Fortbelin,

    "Si une cellule de la ligne...", tu entends par là, une cellule, n'importe laquelle, ou une cellule bien précise?
    0
  3. fortbelin Messages postés 22 Statut Membre
     
    Bonjour,

    il s'agit plutôt d'une cellule bien précise car j'ai une colonne date dans ma feuille excel.

    Donc en fait, si ma colonne date est en G par exemple et bien, la macro supprime toute les lignes qui ont dans la colonne G une date antérieur à une date de référence.

    Merci beaucoup
    0
  4. fortbelin Messages postés 22 Statut Membre
     
    Merci beaucoup, je vais essayer

    Est ce que vous auriez la même chose mais en fonction d'une liste de prénom.

    Exemple, supprimer les lignes qui contiennent pierre ou paul ou jean ....

    Merci

    Christophe
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fortbelin Messages postés 22 Statut Membre
     
    C'est encore moi

    je suis désolé mais cela ne marche pas ou alors c c'est mois qui ne fais pas ce qu'il faut

    Est ce qu'il faut mettre le code dans un module

    Private Sub CommandButton1_Click()
    Dim currentd As Date
    Dim refdate As Date
    Dim i, imax

    refdate = Range("C1").Value
    imax = Range("C65536").End(xlUp).Row

    For i = IndiceLigneDeTaPlageDeDate To imax + 1
    If (Range("C" & i).Value < refdate) And (Range("C" & i).Value <> "") Then
    Range("C" & i).EntireRow.Delete
    i = i - 1
    End If
    Next i
    End Sub

    merci
    0
    1. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      Il faudrait peut être remplacer IndiceLigneDeTaPalgeDeDate par une valeur non ?

      Genre 1 si tu commences sur la première ligne, 2 si tu commences sur la 2e...
      0
    2. Heremion Messages postés 564 Statut Membre 102
       
      Oui, j'ai mis ça pour que tu le remplaces. Si ta plage de données commence à la ligne 2, tu mets 2 :) et pas besoin de mettre cela dans un module, sur un bouton suffit :)
      0
  7. fortbelin Messages postés 22 Statut Membre
     
    Merci beaucoup,
    cela fonctionne.

    Désolé mais je suis pas un spécialiste
    0
    1. chossette9 Messages postés 6855 Date d'inscription   Statut Contributeur Dernière intervention   1 313
       
      Aucun problème, mais il existe plein de tutoriels sur le net, ou des livres assez complets en librairie sur le VBA, alors n'hésites pas à consulter le net pour trouver comme réaliser des macros VBA.

      Personnellement, je te conseillerais d'aller sur le site des éditions First (éditeur de la série "pour les nuls").

      Cordialement.
      0
  8. fortbelin Messages postés 22 Statut Membre
     
    est ce que tu aurais une idée pour faire la même chose avec une liste de prénom

    merci
    0
  9. fortbelin Messages postés 22 Statut Membre
     
    Merci beaucoup, je vais essayer de me pencher sur le sujet mais pour le moment j'ai pas vraiment le temps.

    On me demande ça à mon boulot ...
    0
  10. Heremion Messages postés 564 Statut Membre 102
     
    De la même manière.
    En admettant que les prénoms à supprimer soient en colonne A à partir de la ligne 2 sur ta première feuille et ta liste de prénoms générale en colonne A ligne 2 de ta deuxième feuille :

    Private Sub CommandButton1_Click()
    Dim i1, i2
    Dim imaxOne
    Dim imaxTwo
    
        imaxOne = Worksheets(1).Range("A65536").End(xlUp).Row
        imaxTwo = Worksheets(2).Range("A65536").End(xlUp).Row
        
        For i1 = 2 To imaxOne
            For i2 = 2 To imaxTwo
                If Worksheets(1).Range("A" & i1).Value = Worksheets(2).Range("A" & i2).Value Then
                    Worksheets(2).Range("A" & i2).EntireRow.Delete
                    i2 = i2 - 1
                    imaxTwo = imaxTwo - 1
                End If
            Next i2
        Next i1
    End Sub
    
    0
  11. fortbelin Messages postés 22 Statut Membre
     
    MERCI BEAUCOUP
    C'EST AU TOP
    0