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 +

我需要帮助,使代码提取日期的年和周数。我需要把订单按周分开,而不是按天分开。 我需要得到格式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)

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)
替换为
,“

请注意,VBA
Format
函数的
每周第一天
每年第一周
的默认值与Excel
WEEKNUM
函数的默认值相同

编辑

根据评论,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