簡體   English   中英

vba轉換周數(和年)到目前為止?

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

我在Cell C13中有一個星期編號 ,在Cell C14中有一年

我使用以下公式將其轉換為該周數的星期四

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

我怎么能用VBA做同樣的事情?

對於特定年份 ,您可以這樣做:

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

並測試它:

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

如果其他人正在研究這個並且不想要星期四或2017年不工作

  1. 改變5以滿足您的需求!

  2. 或者使用以下函數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周數系統,所以應始終在當前年份內。

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