Excel 2007 - Как определить, вычисляется столбец или нет

У меня следующая ситуация:

У меня есть рабочий лист, который содержит список работы с предполагаемыми часами. Эти часы можно назначить пользователям (перечисленным в столбцах D и E) с помощью столбца C. Теперь я хочу рассчитать назначенные часы для каждого пользователя в столбцах D E и F.

Я могу заполнить значения для невычисляемых полей, используя следующую функцию: я уже использую следующие функции (удалил знак $ для удобства чтения, и я использую запись 3 в качестве примера, потому что она не вычисляется)

  • Расчет за назначенные часы: =IF(C3=D1;B3;0). Таким образом, если имя пользователя совпадает с именем назначенного пользователя, будет использоваться значение, в противном случае — 0.
  • Calculation for not assigned hours : =SUM(D3:E3) - B3. So if the assigned user does not exist in the columns then the hours are not assigned.
    • EDIT I have edited the calculation for not assigned hours. The previous version was:=IF(AND(C3<>D1; C3<>E1);B3;0)

Эти два вычисления работают нормально, но, конечно, не для вычисляемых полей.

Чего я хочу добиться

Теперь я хочу заполнить расчеты над вопросительными знаками. Это легко, если вы знаете, где размещаются вычисляемые поля, но это может быть где угодно. Поэтому мне нужна функция, которая делает следующее:

if: The value of columns B is calculated
then: calculate all values for the certain user until the next calculated row 
else: use one of the two calculations I have already described

Запрашиваемые результаты с использованием образца листа:

  • ?1?: SUM(D3;D6)
  • ?2?: SUM(E3;E6)
  • ?3?: SUM(F3;F6)
  • ?4?: SUM(D8;D9)
  • ?5?: SUM(E8;E9)
  • ?6?: SUM(F8;F9)

Пример листа

       A          B            C           D            E           F
1|   Tasks   |   Hours   |Assigned To|   User1   |   User2   |Not Assigned|
2|Main Task  |=SUM(A3:A6)|           |    ?1?    |    ?2?    |     ?3?    |
3|  Sub Task |    10     |   User1   |    10     |           |            |
4|  Sub Task |    25     |   User2   |           |    25     |            |
5|  Sub Task |    14     |   User2   |           |    14     |            |
6|  Sub Task |    17     |   User1   |    17     |           |            |
7|Main Task  |=SUM(A8:A9)|           |    ?4?    |    ?5?    |     ?6?    |
8|  Sub Task |    22     |   User2   |           |    22     |            |
9|  Sub Task |    43     |           |           |           |     43     |

Объяснение:
Столбец A: Каждая подзадача имеет один дополнительный отступ (с помощью кнопки indent) по сравнению с его родительская задача.

Столбец B: значение в этом столбце будет рассчитано, если элемент содержит подэлементы.

Task 1        Calculated because contains subtasks (Task 1.1 and Task 1.2)
 Task 1.1     Calculated because contains subtasks (Task 1.1.1 and Task 1.1.2)
  Task 1.1.1  Not calculated because no subtasks
  Task 1.1.2  Not calculated because no subtasks
 Task 1.2     Not calculated because no subtasks
Task 2        Not calculated because no subtasks
Task 3        Calculated because contains subtasks (Task 3.1)
 Task 3.1     Not calculated because no subtasks

Столбец C: пользователю могут быть назначены только не вычисляемые столбцы.

Столбец D - E: Заголовок содержит имя пользователя, которому могут быть назначены задачи.

Столбец F: содержит не назначенные часы для каждой задачи.


person hwcverwe    schedule 02.05.2012    source источник
comment
Почему бы вам просто не заполнить SUM() формулами в ColA в других столбцах?   -  person Tim Williams    schedule 02.05.2012
comment
Боюсь, ваш пример не имеет особого смысла. Во-первых, ваши SUM будут циклическими ссылками. Кроме того, кажется, что ваша таблица плохо организована и даже избыточна. Какова общая цель этого рабочего листа? Если вы спрашиваете, что я о вас думаю, то почему бы не вставить таблицу с итоговой строкой, а затем выбрать SUM из раскрывающегося списка для столбцов C:E? Фактически, вы можете сделать это для столбца A, а затем просто отфильтровать столбец B (пользователь), чтобы увидеть их общее количество часов. Однако, пожалуйста, уточните свою цель.   -  person Zairja    schedule 02.05.2012
comment
@Zairja Можете ли вы объяснить, почему SUM будут циклическими ссылками?   -  person hwcverwe    schedule 03.05.2012
comment
@Zairja: Основная цель — повернуть всех пользователей рядом с задачами и показать, на что этому конкретному пользователю нужно тратить свои часы. Я знаю, что это избыточно, но это имеет некоторую ценность, если моя проблема решена. Я знаю, что могу использовать фильтры, но все же вам нужно сгруппировать и рассчитать по основной задаче. Обратите также внимание, что мне не разрешено изменять первые 3 столбца. Таким образом, он снабжен рассчитанными основными задачами и несколькими подзадачами. Я должен использовать эту структуру.   -  person hwcverwe    schedule 03.05.2012
comment
@hwcverwe Можете ли вы предоставить снимок экрана или дать дополнительные разъяснения о том, как организован Col A. У меня есть несколько решений, но они должны знать, как вы определяете, когда начинается новая основная задача. Как они организованы — как бы вы определили разницу между тем, где заканчиваются подзадачи и начинается следующая основная задача? Кроме того, вы не можете изменить столбцы A:C, но всегда ли рассчитывается SUM часов из задачи (например, B2, B7) или иногда оно пустое?   -  person Zairja    schedule 03.05.2012
comment
@Zairja В конце моего вопроса я кальцинировал Col A. Спасибо за это. Я также изменил способ расчета не назначенных часов. Ответ на ваш вопрос о Cols A:C, SUM задачи всегда будет рассчитан. Таким образом, B2 и B7 никогда не будут пустыми.   -  person hwcverwe    schedule 03.05.2012


Ответы (1)


Вы можете определить, какие ячейки имеют формулы следующим образом:

Range formulaCells = range.SpecialCells(XlCellType.xlCellTypeFormulas);

[Изменить для VBA]

Вы можете создать пользовательскую функцию, например, в Есть ли в ячейке формулу из Excel VBA, а затем используйте его как:

= Формула (A1)

person Joshua Drake    schedule 09.05.2012
comment
Спасибо за Ваш ответ. Означает ли это, что мне нужно использовать макросы для решения моей проблемы? - person hwcverwe; 10.05.2012
comment
@hwcverwe Извините, я думал, что вы уже автоматизируете это. Это может быть не обязательным требованием, однако использование VBA было бы моей первой линией атаки после быстрого поиска документации Excel. Если вы хотите пойти по маршруту VBA, я могу привести дополнительные примеры. Примечание. Приведенный выше код взят из взаимодействия C# с Excel. - person Joshua Drake; 10.05.2012
comment
нет проблем. Все еще интересно узнать для других пользователей stackoverflow. Но да, можете ли вы предоставить мне пример VBA. заранее спасибо - person hwcverwe; 10.05.2012