как узнать год и неделю от даты - PullRequest
0 голосов
/ 20 октября 2019

Мне нужна помощь в создании кода для извлечения номера года и недели из даты. Мне нужно было разделять заказы по неделям, а не по отдельным дням. Мне нужно получить формат yy, WW. В функции Excel я могу написать что-то вроде этого:

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

, но я не могу написать это в коде VBA.

Ответы [ 2 ]

1 голос
/ 20 октября 2019
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 голосов
/ 20 октября 2019

Используя собственные функции 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) на ","

Обратите внимание, что значения по умолчанию для first day of week и first week of year одинаковы для функции VBA Format и для функции Excel WEEKNUM

EDIT

Судя по комментариям, ОП НЕ хочет использовать определение по умолчанию Excel WEEKNUMBER.

Можно использовать ISOweeknumber и, возможно, избежать проблемы пропуска серийного номера YR,WN. Тем не менее, необходимо добавить тест для корректировки года для тех случаев, когда декабрьская дата действительно находится на первой неделе следующего года.

Я предлагаю попробовать:

Редактировать, чтобы обойти ошибку в функциях VBA Date

также год будет соответствовать номеру недели в начале / конце года

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

Дополнительные комментарии

  • Вы можете заменить DatePart("ww", dt - Weekday(dt, vbMonday) + 4, vbMonday, vbFirstFourDays) на Application.WorksheetFunction.IsoWeekNum(dt). Я не уверен, какой метод более эффективен, хотя я обычно предпочитаю использовать встроенные функции VBA вместо функций Worksheet, когда они доступны.

  • Немного изменив код зацикливания, похоже, он работаетОК, заполняя строки 1 и 2 yy,ww и соответствующей датой в строке 2 (я добавил строку 2 для проверки ошибок). Не пропускает ни одной недели.


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

enter image description here

...