Excel et/ou VBA : 1er et dernier jour du mois

Résolu
sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -  
sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai actuellement un soucis avec Excel : j'ai en Cellule M4 une liste déroulante contenant les 12 mois de l'année + une vide (la liste déroulante a comme source "Mois" en E16:E28) et en L4 l'année désirée (simple nombre complété manuellement).

Je souhaiterais obtenir, en fonction de ces deux cellules, deux dates en M2 et M3 indiquant le premier et dernier jour du mois:
imaginons qu'on choisisse "février" en M4 et qu'on remplisse "2012" en L4 ; je souhaiterais obtenir "02/01/2012 00:00:00" en M2 et "02/29/2012 23:59:59" en M3
j'ai essayé de passer par un nombre standard (40140 pour 02/01/2012), des concatenate, des string, text, value, long et plein d'autres "techniques" sous VBA mais je n'ai obtenu que du caca en boite sans la boite :-/

Quelqu'un a une idée? =)

J'ai également essayé de faire un calendrier comme expliqué en forum mais je n'ai jamais trouvé la boite à outils (1ère étape XD)
https://forums.commentcamarche.net/forum/affich-1136865-excel-existe-t-il-un-calendrier

Merci à tous ceux qui pourront m'aider!

<config>Windows 2003 / Internet Explorer 8.0</config>

2 réponses

  1. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
     
    Youhouuu! J'ai finis par trouver avec une solution plus simple que je ne l'avais imaginé =) Le code est peut être un peu barbarre mais il marche! je vous le met pour le prochain interessé!

    Sub ActualMois()
     
    Dim Mois As String              ' = janvier, février...
    Dim NumMois As Double      '=0 ; 1 .. 12
    Dim NumAnnee As Double      
    
    Mois = Cells(4, 13)     'liste déroulante contenant le nom du mois en M4
    NumAnnee = Cells(4, 14).Value      ' cellule contenant l'année : N4
    
    If Mois = "janvier" Then              ' je définis NumMois selon la valeur de Mois
        NumMois = 1
        
    ElseIf Mois = "février" Then
        NumMois = 2
        
    ElseIf Mois = "mars" Then
        NumMois = 3
        
    ElseIf Mois = "avril" Then
        NumMois = 4
        
    ElseIf Mois = "mai" Then
        NumMois = 5
        
    ElseIf Mois = "juin" Then
        NumMois = 6
        
    ElseIf Mois = "juillet" Then
        NumMois = 7
        
    ElseIf Mois = "aout" Then
        NumMois = 8
        
    ElseIf Mois = "septembre" Then
        NumMois = 9
        
    ElseIf Mois = "octobre" Then
        NumMois = 10
        
    ElseIf Mois = "novembre" Then
        NumMois = 11
        
    ElseIf Mois = "décembre" Then
        NumMois = 12
    Else
        NumMois = 0
    End If
    
    
    'Voilà les formules : 
    
    If NumMois <> 0 Then
        Cells(2, 13).FormulaR1C1 = "=DATE(" & NumAnnee & "," & NumMois & ",1)"
        Cells(3, 13).FormulaR1C1 = "=DATE(" & NumAnnee & "," & NumMois + 1 & ",1) - 1 + 0.99999" 'dernier jour du mois = 1er jour du mois suivant - 1
    End If                      ' + 0.99999 correspond à 23h59
    End Sub
    0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    cela peut de faire par formule (toujours penser Excel avant de penser VBA)

    pour le dernier jour du mois
    =FIN.MOIS(DATE(L4;EQUIV(M4;E16:E27;0);1);0)
    pour le premier du suivant
    =DATE(L4;EQUIV(M4;E16:E27;0);1)

    si excel<2007 l'utilitaire d'analyse doit être activé (outil-macros complémentaires)

    si on tiens à VBA : un peu de patience
    Michel
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      et voilà par VBA (dates francophones)
      Sub xxx()
      Dim Mois As Byte
           Mois = Application.Match(Range("M4"), Range("E16:E27"), 0)
           Range("M2") = Format(DateSerial(Range("L4"), Mois, 1), "mm/dd/yyyy")
           Range("M3") = Format(DateSerial(Range("L4"), Mois + 1, 1) - 1, "mm/dd/yyyy")
      End Sub
      0
    2. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
       
      Parfait!

      le code marche dans le format souhaité! encore un grand merci!
      0
    3. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
       
      je l'ai légèrement modifié pour le format que je souhaite :

      Sub xxx()
      Dim Mois As Byte
           Mois = Application.Match(Range("M4"), Range("E16:E27"), 0)
           Range("M2") = Format(DateSerial(Range("L4"), Mois, 1), "m/d/yy h:mm;@")
           Range("M3") = Format(DateSerial(Range("L4"), Mois + 1, 1) - 1 + 0.99999, "m/d/yy h:mm;@")
      End Sub
      
      


      Il affiche en plus l'heure ;)
      0
    4. sym59 Messages postés 40 Date d'inscription   Statut Membre Dernière intervention  
       
      Enfaite non, j'ai parlé trop vite :s

      La zone "source" contient 13 cellules : 12 pour chacun des mois et une vide.
      Lorsque je choisis la vide, il me trouve une erreure... d'où la petite modif suivante :

      Sub ActualMois2()
      
      'Remplace ActualMois
      
      Dim Mois As Byte
          If Range("M4") <> "" Then
           Mois = Application.Match(Range("M4"), Range("E15:E26"), 0)
           Range("M2") = Format(DateSerial(Range("N4"), Mois, 1), "m/d/yy h:mm;@")
           Range("M3") = Format(DateSerial(Range("N4"), Mois + 1, 1) - 1 + 0.99999, "m/d/yy h:mm;@")
          Else
              Range("M2") = ""
              Range("M3") = ""
          End If
      
      
      End Sub


      Petite précision : la zone source est E14:E26
      E14 = cellule vide
      E15 = "janvier"

      et
      Mois=Application... Range("E15...


      Il y a un décalage si on lui indique de chercher en E14:E26 et non E15:E26
      0