2013-03-13 4 views
2

Я построил формулу OFFSET для динамического диапазона, который представляет собой массив дат из списка. Основанный на сегодняшней дате, он принимает даты, начиная с понедельника X недель назад и до пятницы Y недель вперед. Все отвлекает внимание от того, что я хочу исключить даты выходных дней из моего массива.Исключить выходные из динамического диапазона дат

Мои данные когда-то оригинал имеет несколько мест где дат, т.е.

04/03/2013 = Mo 
05/03/2013 = Tu 
06/03/2013 = We 
06/03/2013 = We 
07/03/2013 = Th 
08/03/2013 = Fr 
09/03/2013 = Sa 
10/03/2013 = Su 
11/03/2013 = Mo 
12/03/2013 = Tu 

Это мой динамический диапазон. Календарь! $ D: $ D, где все даты в вышеуказанном формате найдены.

=OFFSET(Calendar!$D$1,MATCH(TODAY()+1-WEEKDAY(TODAY(),2)-14,Calendar!$D:$D,0)-1,0,MATCH(TODAY()+28-WEEKDAY(TODAY()+1),Calendar!$D:$D,0)-MATCH(TODAY()+1-WEEKDAY(TODAY(),2)-14,Calendar!$D:$D,0)+1) 

С учетом сегодняшней даты он находит понедельник две недели назад, а затем расширяет диапазон до пятницы на 3 недели вперед. Как заставить динамический диапазон исключать выходные дни?

+0

Я не могу изменить макет исходного текста, но я мог бы сделать ячейки с значениями в выходные дни пустыми. Не знаю, насколько это помогает. Я попытался использовать дату выходного дня IF, а затем условие «» для функции OFFSET, которая работает, но она оставляет пустые ячейки в массиве, а не объединяет столбец в один последовательный поток. –

+0

Просто подумайте, а как насчет использования 'na()' вместо из '' '', или вы можете иметь три функции смещения вместо одного, чтобы удалить выходные? – glh

+0

На самом деле, я просто удалил все выходные. Не хотелось прикасаться к ним, потому что это испортило бы другой лист, но я изменил формулы в этом, и теперь оба моих листа работают. В ответ на ваш комментарий: я не считаю, что динамические диапазоны могут быть объединенным набором функций смещения. Что касается NA(), он будет работать так же, как пробелы, т. Е. Даты выходных дней, будут заменены NA() в выходном массиве. Хотя я нашел обходной путь, я все равно все еще хотел бы найти решение. –

ответ

1

Вам не нужен список дат - эта формула будет генерировать тот же массив дат (только с понедельника по пятницу), не обращаясь к списку листа

=WORKDAY(TODAY()-WEEKDAY(TODAY(),2)-14,ROW(INDIRECT("1:30")))

работы в Excel 2007 или позже

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

=SMALL(IF((Range>=Start)*(Range<=End)*(WEEKDAY(Range,2)<6),Range),ROW(INDIRECT("1:"&SUM((Range>=Start)*(Range<=End)*(WEEKDAY(Range,2)<6)))))

Это даст вам все будние дни в порядке возрастания (независимо от порядка в списке), где Range - это ваш список дат, Start - это нужная дата начала, а End - обязательная дата окончания - я могу добавить более подробную информацию на этом, если вы хотите продолжить этот метод .....

+0

Как работает элемент INDIRECT («1:30»)? Формула не работает для меня, и более того, я не вижу, как она могла распознавать недели, когда определенные даты повторяются более одного раза. –

+0

ОК - моя ошибка - я не заметил повторной даты, поэтому их нужно брать из списка, но без сац и солнц? ROW (INDIRECT («1:30»)) просто генерирует массив чисел от 1 до 30, предполагая, что вы хотели 30 дат (6 недель пн-пт), но это спорный вопрос, если у вас есть повторы ...... –

+0

К сожалению, случай что есть повторяющиеся даты, поэтому необходимо извлечь все даты, не относящиеся к Sat и Sun. –

Смежные вопросы