2017-01-04 2 views
0

У меня есть определенный набор данных, который состоит из информации для проектов, над которыми работает наша компания. Каждый проект может проходить через пять разных статусов, и у нас есть столбец, который записывает каждую дату, когда проект помещается в этот конкретный статус.Excel Forumla/VBA, чтобы пропустить пустые столбцы для расчета

Теперь для части Excel. Мы пытаемся рассчитать дни в каждом статусе и найти общее время проекта. Общее легко сделать, потому что я могу использовать сетевые дни между датой представления проекта и текущей датой проекта. Однако статусы дают мне проблемы, потому что иногда проект пропускает статус, оставляя поле даты пустым. Итак, что происходит, проект переходит от статуса B к статусу D, формула для дней в статусе «B» ищет дату в столбце «C» для использования в качестве второй даты в формуле NETWORKDAYS. Когда он пуст, аргумент IF указывает формуле использовать TODAY() в качестве второй даты. Что мне нужно, так это поиск столбцов справа (в пределах заданного диапазона A: E для этой строки) и использовать эту дату, если она существует. Если нет, то он может по умолчанию использовать TODAY(), потому что это будет «активный» проект, который не был включен.

=IF(IF(OR([@STALLED]<>"",[@CANCELED]<>""),"",IF([@INTAKEDATE]="","",IF([@SCOPEATE]="",NETWORKDAYS([@INTAKEDATE],TODAY()),(NETWORKDAYS([@STATUSADATE],[@SCOPEATE])))))<0,"",(IF(OR([@STALLED]<>"",[@CANCELED]<>""),"",IF([@INTAKEDATE]="","",IF([@SCOPEATE]="",NETWORKDAYS([@INTAKEDATE],TODAY()),(NETWORKDAYS([@STATUSADATE],[@SCOPEATE]))))))) 

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

ProjectID Projectname INTAKEDATE SCOPEATE BUILDDATE TESTDATE GOLIVEDATE INTAKEDAYS SCOPEDAYS BUILDDAYS TESTDAYS

Если есть какие-либо планы или лучше формула кто-то может помочь мне разобраться, я был бы признателен. Существует также другая область, которая дает текущий статус, или если проект считается живым, если это вообще помогает. Сейчас у меня есть excel-блок, и я не думаю о том, что имеет смысл для этого.

+0

Я не рассматривал использование 'MAX', хотя я думаю, что в моем случае мне нужно будет использовать' MIN', поскольку дни будут искажаться, если он пропустит следующую, немедленную дату статуса. Но возможно что-то подобное должно работать: SCOPEDAYS: = IF (IF (OR ([@ STALLED] <> "", [@ CANCELED] <> ""), "", IF ([@ BUILDDATE] = "" , ЧИСТРАБДНИ ([@ SCOPEDATE], MIN ([@ BUILDDATE]: [@ GOLIVEDATE], (ЧИСТРАБДНИ ([@ STATUSADATE], [@ SCOPEATE]))))) <0, "", (ЕСЛИ (ИЛИ ([@ ЗАГЛОХ] <> "", [@ ОТМЕНА] <> "") "" ЕСЛИ ([@ INTAKEDATE] = "", "" F ([@ BUILDDATE] = "", ЧИСТРАБДНИ ([@ SCOPEDATE], MIN ([@ BUILDDATE]: [@ GOLIVEDATE]))))))) – andresej21

ответ

0

Итак, я выяснил, используя MIN и немного изменив формулы IF. Кто бы это ни был, опубликовал около MAX раньше, действительно помог мне выйти из этого пути. Престижность вам сэр/мадам.

Я должен был добавить чек, чтобы увидеть, если SCOPEDATE = BUILDDATE, потому что без этого он возвращал 1, если совпадали даты, добавив еще один день по сравнению с запуском сетевых дней от INTAKEDATE до GOLIVEDATE.

=IF(OR([@STALLED]<>"",[@CANCELED]<>""),"", 
    IF([@SCOPEDATE]="","", 
    IF([@SCOPEDATE]=[@BUILDDATE],0, 
    IF(NETWORKDAYS([@SCOPEDATE],(MIN([@BUILDDATE],[@TESTDATE],[@GOLIVEDATE])))<0,NETWORKDAYS([@SCOPEDATE],TODAY()),NETWORKDAYS([@SCOPEDATE],(MIN([@BUILDDATE],[@TESTDATE],[@GOLIVEDATE]))))))) 

Надеюсь, это полезно для кого-то еще.

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