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

我在C13单元中有一个星期的数字 ,而在C14单元中有一个星期的数字

我使用下面的公式将其转换为当周数字的星期四

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

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

对于特定的一年 ,你可以这样做:

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

并testing它:

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

如果别人正在考虑这个, 不想要一个星期四或者2017年不工作

  1. 改变5以适应您的需要!

  2. 或者使用下面的函数GetDayFromWeekNumber

代码来testing它:

 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 

你需要通过哪一天你想要的第三个参数。 星期四是第五天。给这些家伙的信用: http : //www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

作为一个附加选项,对于那些使用ISO周编号系统的人来说,一年中的第一周是一年中的第一周,包括四天(或包括该日历年的第一个星期四以及一周中的第一天星期天。

  • 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