VBA - Dernière date du mois

Fermé
derout Messages postés 23 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 28 décembre 2009 - 8 mai 2009 à 13:31
derout Messages postés 23 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 28 décembre 2009 - 10 sept. 2009 à 14:12
Bonjour,

Je désirerai créer une macro qui ferait ressortir les lignes de mon fichier excel qui sont associées à la dernière date de chaque mois.

J'entends par là des dates tel que: 31/05/2008, 30/06 2008, 31/07/2008...

Si le 31/05/2008 n'existe pas dans le fichier, alors que la macro cherche la ligne associées au 30/05/2008. Si le 30/05/2008 n'existe pas, alors chercher 29/05/2008 et ainsi de suite...

Voici un lien pour accéder au fichier:

https://www.cjoint.com/?fkdhWTGw0f


Mes connaissances du langauage VBA sont encore limitées et j'ai besoin de quelques exemples concrets pour me familiariser avec la terminologie.

Je vois deux possibilités de macro:

*Réaliser une macro qui copie et colle les lignes associées aux denières dates dans une nouvelle feuille
*Réaliser une macro qui supprime les lignes dont je n'ai pas besoin

Merci pour votre aide,


Derout

2 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
8 mai 2009 à 14:01
Bonjour,
Essaye avec cette macros..
Sub MarquerLigne()
Dim Lig As Long, DerLig As Long
Dim M As Byte, MC As Byte
Dim i As Long
    DerLig = 2
    Sheets("Sheet2").Cells.ClearContents
    With Sheets("Sheet1")
        .Cells.Interior.ColorIndex = xlNone
        M = Month(.Cells(2, 2))
        For Lig = 2 To .Range("B65536").End(xlUp).Row
            MC = Month(.Cells(Lig, 2))
            If MC > M Or (MC = 1 And M = 12) Then
                .Rows(Lig - 1).Copy Sheets("Sheet2").Rows(DerLig)
                DerLig = DerLig + 1
                .Rows(Lig - 1).Interior.ColorIndex = 3
                M = MC
            End If
        Next Lig
    End With
End Sub

Marque les dernières lignes des mois et les copies dans la feuil2
A+
0
derout Messages postés 23 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 28 décembre 2009 1
8 mai 2009 à 18:45
Salut lermite222,


Splendide, ta macro marche parfaitement, merci pour ton aide.

J'essaie de comprendre le code et si je ne m'abuse, Dim M As Byte, MC As Byte fait reference à jour et mois. Qu'en est il des années?
Comment devrais-je modifier la macro pour que les années soient prises en compte (dans le cadre du traitement d'un fichier comportant un historique plus vaste)?

Est-il possible d'obtenir les définitions (un lexique par exemple) des termes employé en VBA (ceux qui s'affichent en menu deroulant)?

Merci pour ton aide


Derout
0
lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
9 mai 2009 à 04:57
M et MC font tout les deux références au mois, en fait quand MC > M c'est que l'ont a changer de mois, donc la ligne précédante est le dernier jour du mois qui est dans M.
Il peu y avoir changement d'année, j'ai pris ça en compte avec Or (MC = 1 And M = 12)
A+
PS: Le truc pour apprendre le VBA... L'éditeur de macro et la touche F1 (aide)
Quand tu a fait une macro avec l'éditeur sélectionner un mot (double clic dessus) et taper F1 pour avoir la définition de ce mot.
0
derout Messages postés 23 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 28 décembre 2009 1
11 mai 2009 à 15:49
Ok,

Je te remercie pour tes éclaircissements.

Derout
0
derout Messages postés 23 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 28 décembre 2009 1
10 sept. 2009 à 14:12
salut lermite,

J'ai constaté que la macro ne fonctionne plus lorsqu'il y a des trous dans l'historique (s'il manquent des mois)
à cause de la condition suivante:

If MC > M Or (MC = 1 And M = 12) Then
.Rows(Lig - 1).Copy Sheets("Sheet2").Rows(DerLig)

En effet, si la date passe par exemple de 18/07/2004 à 25/01/2006 alors la condition n'est plus respectée et la ligne nécessaire n'est pas sélectionnée.
J'ai essaye d'intégrer une condition années.

Voici ce que j'ai fait:

Sub MarquerLigne()
Dim Lig As Long, DerLig As Long
Dim M As Byte, MC As Byte
Dim Y As Integer, YC As Integer
Dim i As Long
DerLig = 2
Sheets("Sheet2").Cells.ClearContents
With Sheets("Sheet1")
.Cells.Interior.ColorIndex = xlNone
M = Month(.Cells(2, 2))
Y = Year(.Cells(2, 2))
For Lig = 2 To .Range("B65536").End(xlUp).Row
MC = Month(.Cells(Lig, 2))
YC = Year(.Cells(Lig, 2))
If MC > M Or (MC = 1 And M = 12) Then
.Rows(Lig - 1).Copy Sheets("Sheet2").Rows(DerLig)
DerLig = DerLig + 1
.Rows(Lig - 1).Interior.ColorIndex = 3
M = MC
If MC < M Or (MC = 1 And M = 12) And YC > Y Or (Y = 2000 And YC = 2009) Then
.Rows(Lig - 1).Copy Sheets("Sheet2").Rows(DerLig)
DerLig = DerLig + 1
.Rows(Lig - 1).Interior.ColorIndex = 3
End If
End If
Next Lig
End With
End Sub

Le code que j'ai ajouté n'a aucun impact et les lignes ne sont pas sélectionnées. Est ce que tu vois la cause du problème?
Qu'est ce que ça signifie Derlig?


Merci,
0