如何获得日期和星期几

问题描述 投票:0回答:2

我需要帮助编写代码以从日期中提取年和周的数字。我需要按周隔离订单,而不是每天。我需要获取格式yy,WW。在excel函数中,我可以这样写:

=CONCATENATE(RIGHT(YEAR(P13);2);",";TEXT(WEEKNUM(P13);"00"))

但是我不能用VBA代码编写。

excel vba week-number 2-digit-year
2个回答
0
投票
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)


0
投票

使用本地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 yearFormat默认值与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
© www.soinside.com 2019 - 2024. All rights reserved.