в VBA преобразовать номер недели (и года) на сегодняшний день?
У меня есть неделя в ячейке C13 и A год в ячейке C14.
Я использую приведенную ниже формулу для преобразовать это в четверг этой недели номер:
=DATE(C14,1,-6)-WEEKDAY(DATE(C14,1,3))+C13*7
Как я могу сделать то же самое с помощью VBA?
3 ответов
в течение определенного года, вы можете сделать это так :
DateAdd("ww", WeekNumber - 1, DateSerial(2017, 1, 5))
и проверить это:
Debug.Print Format(DateAdd("ww", WeekNumber - 1, DateSerial(YearNumber, 1, 5)), "ddd d MMM yy")
если другие смотрят на это и Не хочу четверг или не работать на 2017 :
измените 5 в соответствии с вашими потребностями!
или использовать функцию
GetDayFromWeekNumber
код для проверки:
Sub test()
Debug.Print Format(GetDayFromWeekNumber(2017, 1, 4), "ddd d MMM yyyy")
End Sub
и общая функция GetDayFromWeekNumber
:
Public Function GetDayFromWeekNumber(InYear As Integer, _
WeekNumber As Integer, _
Optional DayInWeek1Monday7Sunday As Integer = 1) As Date
Dim i As Integer: i = 1
If DayInWeek1Monday7Sunday < 1 Or DayInWeek1Monday7Sunday > 7 Then
MsgBox "Please input between 1 and 7 for the argument :" & vbCrLf & _
"DayInWeek1Monday7Sunday!", vbOKOnly + vbCritical
'Function will return 30/12/1899 if you don't use a good DayInWeek1Monday7Sunday
Exit Function
Else
End If
Do While Weekday(DateSerial(InYear, 1, i), vbMonday) <> DayInWeek1Monday7Sunday
i = i + 1
Loop
GetDayFromWeekNumber = DateAdd("ww", WeekNumber - 1, DateSerial(InYear, 1, i))
End Function
он работает вполне нормально, принимая во внимание, что первый день недели воскресенье:
Function fnDateFromWeek(ByVal iYear As Integer, ByVal iWeek As Integer, ByVal iWeekDday As Integer)
fnDateFromWeek = DateSerial(iYear, 1, ((iWeek - 1) * 7) + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)
End Function
вы должны пройти, в какой день вы хотите в качестве третьего параметра. Четверг-день номер 5. Кредиты этим парням: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/
в качестве дополнительной опции для тех, кто использует систему номеров недели ISO, где Неделя 1 года - это первая неделя года, содержащая четыре дня (или неделя, включающая первый четверг календарного года, а первый день недели-воскресенье.
- DOW является необязательным аргументом, представляющим день недели. Он будет по умолчанию в четверг и, поскольку мы используем систему ISO weeknumber, всегда должен попадать в текущий год.
Option Explicit
Function WNtoDate(WN As Long, YR As Long, Optional DOW As Long = 5) As Date
'DOW: 1=SUN, 2=MON, etc
Dim DY1 As Date
Dim Wk1DT1 As Date
Dim I As Long
DY1 = DateSerial(YR, 1, 1)
'Use ISO weeknumber system
I = DatePart("ww", DY1, vbSunday, vbFirstFourDays)
'Sunday of Week 1
Wk1DT1 = DateAdd("d", -Weekday(DY1), DY1 + 1 + IIf(I > 1, 7, 0))
WNtoDate = DateAdd("ww", WN - 1, Wk1DT1) + DOW - 1
End Function