Suppression de ligne en fonction d'une date

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. 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. Contributeur
      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. 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. Contributeur
      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. d'où le test
      (Range("A" & i).Value <> "")

      tu as encore lu trop vite ma p'tite chossette9 :D
      0
    5. Contributeur
      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. Bonjour Fortbelin,

    "Si une cellule de la ligne...", tu entends par là, une cellule, n'importe laquelle, ou une cellule bien précise?
    0
    1. 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
      1. 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
        1. 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. Contributeur
            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. 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
        2. Merci beaucoup,
          cela fonctionne.

          Désolé mais je suis pas un spécialiste
          0
          1. Contributeur
            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
        3. est ce que tu aurais une idée pour faire la même chose avec une liste de prénom

          merci
          0
          1. 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
            1. 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
              1. MERCI BEAUCOUP
                C'EST AU TOP
                0