Для объяснения ответа Бенджамина Линдли рассмотрим типичный случай, когда std :: sort использует quicksort с схемой разбиения типа Hoare. Левая сторона сканируется для значений & lt; с помощью compare (value, pivot), чтобы выполнить сравнение, в то время как правая сторона сканируется для значений> pivot, используя compare (pivot, value). Обратите внимание, что раздел quicksort может полагаться на то, что сканирование влево или вправо останавливается, когда оно встречает значение == pivot и не продолжает сканирование через точку поворота при этом сканировании. Если предоставленная пользователем функция сравнения возвращает true при таком сравнении (true, когда значение == pivot), сканирование может продолжаться за пределами границ массива или сортируемого вектора, что, по-видимому, произошло в тестовом примере Бенджамина Линдли.
Попробуйте это в Excel 2010 или новее:
=IF ( WEEKDAY (A1, 16) > 3 , A1-1 , A1 - WEEKDAY (A1, 16) )
Добавление 16
в качестве второго параметра WEEKDAY
устанавливает субботу = 1.
=WORKDAY(TODAY(),-1)
Это возвращает серийный номер дня в Excel, который можно просто отформатировать в ячейке.
Для полного объяснения функции см. здесь .
=IF(WEEKDAY(NOW()-2)>5,NOW()-WEEKDAY(NOW()-6),NOW()-1)
Затем просто отформатируйте ячейку, но вы хотите ее отобразить
В VBA:
Public Function PreviousWeekDay(InputDate As Date) As Integer
Dim Result As Integer
Result = Weekday(InputDate, vbMonday)
If Result = 6 Or Result = 7 Or Result = 1 Then
Result = 5
Else
Result = Result - 1
End If
PreviousWeekDay = Result
End Function
Возвращает 1 = понедельник, 2 = вторник и т. д.