Используя собственные функции 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](https://i.stack.imgur.com/ByXdJ.png)