Получить номер дня в течение календарной недели на определенную дату - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть набор данных, который включает в себя даты.Мне нужно разделить это по номеру недели для отчетности.Пока что у меня есть:

переменная startDate, содержащая 01.03.2015 (заполненная данными из электронной таблицы)

startDay = Day(startDate)
startMonth = Month(startDate)
startYear = Year(startDate)

startWeek = Application.WorksheetFunction.WeekNum(DateSerial(startYear, startMonth, startDay))

, которая дает мне первую неделю в startWeek

Тем не менее, я знаю, что нужно знать, как далеко находится первая неделя.Таким образом, для этого примера, поскольку дата - 3 января, она включает 3 дня недели 1

То есть отчет, который я собираю, будет представлять отчет только за 3 дня (в отличие от полной недели)

Единственный способ, который я рассчитывал сделать до сих пор, - это рассчитать, какой день года является датой, и использовать расчет MOD (в основном, делить на 7, а остаток - как далеко до недели).)

dayNumber = DateDiff("d", DateSerial(startYear, 1, 1), DateSerial(startYear, startMonth, startDay)) + 1 

dayOfWeek = dayNumber Mod 7

Это работает, но мне было интересно, есть ли более хорошее решение, чем это.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Вы можете использовать цикл, чтобы определить, за сколько дней до startDate изменился номер недели:

Public Sub FindDaysInWeekNo()
    Dim startDate As Date
    startDate = DateSerial(2015, 1, 3)

    Dim startWeek As Integer
    startWeek = Application.WorksheetFunction.WeekNum(startDate)

    Dim i As Integer
    Do While startWeek = Application.WorksheetFunction.WeekNum(DateAdd("d", -i, startDate))
        i = i + 1
    Loop

    Debug.Print i '= 3rd day in this week number
End Sub

В следующей таблице показано мое сравнение с другими предлагаемыми формулами и почему я так думаю (относится к=WEEKNUM) мои расчеты верны.

enter image description here

Обратите внимание, что если вы предполагаете, с 1 по 7 января будет неделя 1 (дни с 1 по 7) вы не можете использовать функцию WeekNum, потому что это даст вам другой результат (см. таблицу выше и обратите внимание, что первая неделя имеет только 6 дней в соответствии с функцией WeekNum). Также вы не можете назвать номер этой недели (поскольку то, что все называют номер недели определяется как https://en.wikipedia.org/wiki/Week#Week_numbering).

Вместо этого вам нужно будет использовать…

Public Function AlternativeWeekNum(startDate As Date) As Integer
    AlternativeWeekNum = WorksheetFunction.Days(startDate, DateSerial(Year(startDate), 1, 1)) \ 7 + 1 'note that this no normal division but a integer division and uses a backslash instead
End Function

для расчетаномер недели - альтернативный способ, и…

Public Function AlternativeWeekNumDay(startDate As Date) As Integer
    AlternativeWeekNumDay = WorksheetFunction.Days(startDate, DateSerial(Year(startDate), 1, 1)) Mod 7 + 1
End Function

для расчета дня в альтернативной неделе.

0 голосов
/ 18 декабря 2018
dayOfWeek  = (8 + Weekday(startDate) - Weekday(DateSerial(startYear, 1, 1))) mod 7

Просто возьмите положительную mod 7 разницу между текущим днем ​​недели и днем ​​недели для 1 января любого года, равного

0 голосов
/ 18 декабря 2018

Для этого можно использовать функцию Weekday():

=WEEKDAY(B4;2)

Второй параметр указывает, как вы хотите, чтобы ваши дни считались (начиная с воскресенья или понедельника, начиная с 0 или с 1,...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...