Excel 如何从日期开始获取年和周
我需要帮助,使代码提取日期的年和周数。我需要把订单按周分开,而不是按天分开。 我需要得到格式yy,WW。 在excel函数中,我可以编写如下内容:Excel 如何从日期开始获取年和周,excel,vba,week-number,2-digit-year,Excel,Vba,Week Number,2 Digit Year,我需要帮助,使代码提取日期的年和周数。我需要把订单按周分开,而不是按天分开。 我需要得到格式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 +
=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)
2019年12月27日-(19,52)
2019年12月27日-(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)
替换为,“
请注意,VBAFormat
函数的每周第一天
和每年第一周
的默认值与ExcelWEEKNUM
函数的默认值相同
编辑
根据评论,OP似乎不想使用Excel默认定义的WEEKNUMBER
您可以使用ISOweeknumber
并可能避免丢失序列号YR,WN
。但是,如果12月的日期确实在下一年的第1周,则必须添加一个测试来调整年份
我建议尝试:
编辑以解决VBA日期函数中的错误
此外,年份将与年初/年末的周数相对应
您能否至少包括您在VBA中尝试过的内容,以及一些示例数据和预期输出?虽然看起来不错,但这是wey年底的一个问题。我使用此代码跳过了20,01。ActiveCell.Offset(0,i)=格式(D+c*7,“yy”)&“,”和格式(格式(D+c*7,“ww”),“00”)可能是因为19,53和20,01同样弱。@marwineper您如何使用它?输入是什么?结果是什么?输入是curent date=now(),我使用简单的循环c=0,用于i=0到t-1活动单元格。偏移量(0,i)=格式(D+c*7,“yy”)&“,”和格式(格式(D+c*7,“ww”),“00”)c=c+1下一个i@marwineper您认为不正确的第01周的日期是什么?此循环将按周排序,但排序的项目有特定的日期,因此不会跳过任何一周
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
Sub test()
Dim c As Long, i As Long, t As Long
Dim R As Range
Dim D As Date
D = #12/25/2019#
Set R = Range("A1")
R.EntireRow.NumberFormat = "@"
t = 10
c = 0
For i = 0 To t - 1
R.Offset(0, i) = vbYrWN(D + c * 7)
R.Offset(1, i) = D + c * 7
c = c + 1
Next i
End Sub