VBA - Dernière date du mois

derout Messages postés 25 Statut Membre -  
derout Messages postés 25 Statut Membre -
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
Configuration: Windows XP Internet Explorer 6.0

2 réponses

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
    1. derout Messages postés 25 Statut Membre 1
       
      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
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
    1. derout Messages postés 25 Statut Membre 1
       
      Ok,

      Je te remercie pour tes éclaircissements.

      Derout
      0
    2. derout Messages postés 25 Statut Membre 1
       
      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