En utilisant VBA, est-il possible d'obtenir le premier lundi du mois en cours? J'avais pensé que ce qui suit fonctionnerait: -
DateSerial(Year(Date), Month(Date), ((7 - Weekday(DateSerial(Year(Date), Month(Date), 7))) + 2) Mod 7)
... mais si je l'utilise aujourd'hui par exemple, j'obtiens une date du 31/07/2017, qui est évidemment le mois dernier.
2 réponses
Vous pouvez utiliser cette fonction générique:
' Calculates the date of the occurrence of Weekday in the month of DateInMonth.
'
' If Occurrence is 0 or negative, the first occurrence of Weekday in the month is assumed.
' If Occurrence is 5 or larger, the last occurrence of Weekday in the month is assumed.
'
' If Weekday is invalid or not specified, the weekday of DateInMonth is used.
'
' 2016-06-09. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function DateWeekdayInMonth( _
ByVal DateInMonth As Date, _
Optional ByVal Occurrence As Integer, _
Optional ByVal Weekday As VbDayOfWeek = -1) _
As Date
Const DaysInWeek As Integer = 7
Dim Offset As Integer
Dim Month As Integer
Dim Year As Integer
Dim ResultDate As Date
' Validate Weekday.
Select Case Weekday
Case _
vbMonday, _
vbTuesday, _
vbWednesday, _
vbThursday, _
vbFriday, _
vbSaturday, _
vbSunday
Case Else
' Zero, none or invalid value for VbDayOfWeek.
Weekday = VBA.Weekday(DateInMonth)
End Select
' Validate Occurence.
If Occurrence <= 0 Then
Occurrence = 1
ElseIf Occurrence > 5 Then
Occurrence = 5
End If
' Start date.
Month = VBA.Month(DateInMonth)
Year = VBA.Year(DateInMonth)
ResultDate = DateSerial(Year, Month, 1)
' Find offset of Weekday from first day of month.
Offset = DaysInWeek * (Occurrence - 1) + (Weekday - VBA.Weekday(ResultDate) + DaysInWeek) Mod DaysInWeek
' Calculate result date.
ResultDate = DateAdd("d", Offset, ResultDate)
If Occurrence = 5 Then
' The latest occurrency of Weekday is requested.
' Check if there really is a fifth occurrence of Weekday in this month.
If VBA.Month(ResultDate) <> Month Then
' There are only four occurrencies of Weekday in this month.
' Return the fourth as the latest.
ResultDate = DateAdd("d", -DaysInWeek, ResultDate)
End If
End If
DateWeekdayInMonth = ResultDate
End Function
Alors:
FirstMonday = DateWeekdayInMonth(Date, 1, vbMonday)
Exécutez la macro suivante et elle vous donne le premier lundi du mois:
Sub PromptFirstMondayofTheCurrentMonth()
Dim a As Variant
a = Date - Day(Date) + 1
MsgBox IIf(Weekday(a, vbMonday) = 1, 1, 9 - Weekday(a, vbMonday))
End Sub
De nouvelles questions
vba
Visual Basic pour Applications (VBA) est un langage de programmation orienté événementiel orienté objet pour l'écriture de macros, utilisé pour l'ensemble de la suite Office ainsi que pour d'autres applications. VBA n'est pas équivalent à VB.NET ou VBS; si vous travaillez dans Visual Studio, utilisez [vb.net]. Si votre question concerne spécifiquement la programmation d'une application MS Office, utilisez également la balise appropriée: [excel], [ms-access], [ms-word], [outlook] ou [ms-project].