Suppression de ligne en fonction d'une date

fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -  
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -
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

A voir également:

10 réponses

Heremion Messages postés 538 Date d'inscription   Statut Membre Dernière intervention   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
chossette9 Messages postés 4239 Date d'inscription   Statut Contributeur Dernière intervention   1 311
 
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
Heremion Messages postés 538 Date d'inscription   Statut Membre Dernière intervention   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
chossette9 Messages postés 4239 Date d'inscription   Statut Contributeur Dernière intervention   1 311
 
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
Heremion Messages postés 538 Date d'inscription   Statut Membre Dernière intervention   102
 
d'où le test
(Range("A" & i).Value <> "")

tu as encore lu trop vite ma p'tite chossette9 :D
0
chossette9 Messages postés 4239 Date d'inscription   Statut Contributeur Dernière intervention   1 311
 
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
Heremion Messages postés 538 Date d'inscription   Statut Membre Dernière intervention   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
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
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
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
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
chossette9 Messages postés 4239 Date d'inscription   Statut Contributeur Dernière intervention   1 311
 
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
Heremion Messages postés 538 Date d'inscription   Statut Membre Dernière intervention   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
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup,
cela fonctionne.

Désolé mais je suis pas un spécialiste
0
chossette9 Messages postés 4239 Date d'inscription   Statut Contributeur Dernière intervention   1 311
 
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
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
est ce que tu aurais une idée pour faire la même chose avec une liste de prénom

merci
0
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
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
Heremion Messages postés 538 Date d'inscription   Statut Membre Dernière intervention   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
fortbelin Messages postés 21 Date d'inscription   Statut Membre Dernière intervention  
 
MERCI BEAUCOUP
C'EST AU TOP
0