Excel et/ou VBA : 1er et dernier jour du mois [Résolu/Fermé]

Signaler
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015
-
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015
-
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

Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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
Messages postés
16206
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 septembre 2020
3 025
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
Messages postés
16206
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
12 septembre 2020
3 025
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
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

Parfait!

le code marche dans le format souhaité! encore un grand merci!
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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 ;)
Messages postés
40
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
11 août 2015

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