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: Всяка подзадача има един допълнителен отстъп (с помощта на бутона отстъп) в сравнение с неговата родителска задача.

Колона 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
Страхувам се, че вашият пример няма много смисъл. От една страна, вашите SUMs биха били кръгови препратки. Освен това изглежда, че вашата маса е зле подредена и дори излишна. Каква е общата цел на този работен лист? Ако питате какво мисля, че сте, тогава защо не вмъкнете таблица с общ ред, след което изберете SUM от падащото поле за колони C:E? Всъщност можете да направите това за колона A, след което просто да филтрирате колона B (потребител), за да видите общите им часове. Моля, изяснете целта си все пак.   -  person Zairja    schedule 02.05.2012
comment
@Zairja Можете ли да обясните защо SUMs биха били кръгови препратки?   -  person hwcverwe    schedule 03.05.2012
comment
@Zairja: Основната цел е да насочи всички потребители към задачите и да покаже къде този конкретен потребител трябва да прекарва часовете си. Знам, че е излишно, но има някаква стойност, ако проблемът ми бъде решен. Знам, че мога да използвам филтри, но все пак трябва да ги групирате и изчислите за основна задача. Обърнете внимание също, че не ми е позволено да променям първите 3 колони. Така че е снабден с изчислени основни задачи и множество подзадачи. Трябва да използвам тази структура.   -  person hwcverwe    schedule 03.05.2012
comment
@hwcverwe Можете ли да предоставите екранна снимка или да предоставите още разяснения за това как е организиран Col A. Имам предвид някои решения, но те трябва да знаят как да разберете кога започва нова основна задача. Как са организирани - как бихте разграничили къде свършват подзадачите и започва следващата основна задача? Освен това не можете да променяте Cols 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]

След това можете да създадете функция, дефинирана от потребителя, като тази на Does Cell Have Formula от Excel VBA използвайте го като:

=IsFormula(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