简体   繁体   English

vba转换周数(和年)到目前为止?

[英]vba convert week number (and year) to date?

I have a week number in Cell C13 and a year in Cell C14. 我在Cell C13中有一个星期编号 ,在Cell C14中有一年

I am using the below formula to convert this into the Thursday of that week number's date: 我使用以下公式将其转换为该周数的星期四

=DATE(C14,1,-6)-WEEKDAY(DATE(C14,1,3))+C13*7

How could i do the same thing using VBA? 我怎么能用VBA做同样的事情?

For a specific year , you can do it like this : 对于特定年份 ,您可以这样做:

DateAdd("ww", WeekNumber - 1, DateSerial(2017, 1, 5))

And to test it : 并测试它:

Debug.Print Format(DateAdd("ww", WeekNumber - 1, DateSerial(YearNumber, 1, 5)), "ddd d MMM yy")

If others are looking into this and don't want a Thursday or don't work on 2017 : 如果其他人正在研究这个并且不想要星期四或2017年不工作

  1. change the 5 to fit your need! 改变5以满足您的需求!

  2. Or use the below function GetDayFromWeekNumber 或者使用以下函数GetDayFromWeekNumber

Code to test it : 测试代码:

Sub test()
    Debug.Print Format(GetDayFromWeekNumber(2017, 1, 4), "ddd d MMM yyyy")
End Sub

And the generic function GetDayFromWeekNumber : 通用函数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

It works quite ok, taking in mind that the first day of the week is Sunday: 它工作得很好,记住一周的第一天是星期天:

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

You have to pass which day do you want as third parameter. 您必须通过哪一天作为第三个参数。 Thursday is day number 5. Credits to these guys: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/ 星期四是第5天。对这些人的信任: http//www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

As an additional option, for those using the ISO weeknumber system, where Week 1 of the year is the first week of the year containing four days (or the week that includes the first Thursday of the calendar year, and the first day of the week is Sunday. 作为附加选项,对于那些使用ISO周数系统的人来说,一年中的第1周是包含四天的一年中的第一周(或包括该日历年的第一个星期一周的一周,以及一周的第一天)是星期天。

  • DOW is an optional argument representing the day of the week. DOW是表示星期几的可选参数。 It will default to Thursday and, since we are using the ISO weeknumber system, should always fall within the current year. 它将默认为星期四,因为我们使用的是ISO周数系统,所以应始终在当前年份内。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM