我需要帮助编写代码以从日期中提取年和周的数字。我需要按周隔离订单,而不是每天。我需要获取格式yy,WW。在excel函数中,我可以这样写:
=CONCATENATE(RIGHT(YEAR(P13);2);",";TEXT(WEEKNUM(P13);"00"))
但是我不能用VBA代码编写。
D = now()
For i = 0 To t - 1
ActiveCell.Offset(0, i) = Application.WorksheetFunction.Right(Year(D + c * 7), 2)) & "," & Application.WorksheetFunction.WeekNum(D + c * 7)
c = c + 1
Next i
数据-(格式化后)
03.02.2020-(20,06)
27.12.2019-(19,52)
27.12.2019-(19,52)
使用本地VBA函数,例如:
Function vbYrWN(dt As Date) As String
vbYrWN = Format(dt, "yy") & _
Application.International(xlDecimalSeparator) & _
Format(Format(dt, "ww"), "00")
End Function
如果要硬代码逗号分隔符,只需将Application.International(xlDecimalSeparator)
替换为","
请注意,VBA first day of week
函数的first week of year
和Format
默认值与Excel WEEKNUM
函数的默认值相同
编辑
基于注释,看来OP不想使用Excel的默认定义WEEKNUMBER
。
一个人可以使用ISOweeknumber
,并且可以避免丢失串行YR,WN
的问题。但是,当十二月日期确实在下一年的第1周时,就必须添加测试来调整这些实例的年份。
我建议尝试:
编辑以解决VBA日期功能中的400年错误
年份也将与年初/周的周号相对应
Option Explicit
Function vbYrWN(dt As Date) As String
Dim yr As Date
If DatePart("ww", dt - Weekday(dt, vbMonday) + 4, vbMonday, vbFirstFourDays) = 1 And _
DatePart("y", dt) > 350 Then
yr = DateSerial(Year(dt) + 1, 1, 1)
ElseIf DatePart("ww", dt - Weekday(dt, vbMonday) + 4, vbMonday, vbFirstFourDays) >= 52 And _
DatePart("y", dt) <= 7 Then
yr = DateSerial(Year(dt), 1, 0)
Else
yr = dt
End If
vbYrWN = Format(yr, "yy") & _
Application.International(xlDecimalSeparator) & _
Format(Format(dt - Weekday(dt, vbMonday) + 4, "ww", vbMonday, vbFirstFourDays), "00")
End Function