Отладка фитнес-калькулятора с несколькими вложенными операторами IF

Я использую уравнение Харриса Бенедикта для расчета TDEE людей. Я использую Google Sheets, чтобы создать своего рода форму для этого, но с Google Sheets довольно сложно работать. Я получаю ошибку синтаксического анализа формулы. Форматирование - это плохо, извините за это.

Я знаю, что где-то делаю небольшую ошибку, связанную с запятыми или скобками, но не знаю, где именно.

Код должен спрашивать, предпочитают ли люди метрические / британские, мужские / женские, рост, вес, уровень активности и возраст.

Вот как Google Таблицы выполняет операторы if. Это в значительной степени:

IF(A2 = "foo","A2 is foo")

Синтаксис:

ЕСЛИ (логическое_выражение; значение_если_ истинно; значение_если_ ложь)

=IF (D9=”Imperial”,
    IF(D10=”Male”,
            IF(D16=”Sedentary (no exercise)”,
                    66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.2,

                    IF(D16=”Lightly Active (1-3 days of exercise/week)”,
                            66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.375,

                            IF(D16=”Moderately Active (3-5 days of exercise/week)”,
                                    66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.55,

                                    IF(D16=”Very Active(6-7 days of exercise/week)”,

                                            66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.725,
                                            IF(D16=”Extremely Active(exercise twice a day)”,

                                                    66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.9,
                                            “ “)))))


            IF(D16=”Sedentary (no exercise)”,
                    655.1 + ( 4.35 x D14 ) + ( 4.7 x (D13x12+G13) ) - ( 4.7 x D12 ) x1.2,

                            IF(Lightly Active (1-3 days of exercise/week)”,
                                    655.1 + ( 4.35 x D14 ) + ( 4.7 x (D13x12+G13) ) - ( 4.7 x D12 ) x1.375,

                                    IF(Moderately Active (3-5 days of exercise/week)”,
                                            655.1 + ( 4.35 x D14 ) + ( 4.7 x (D13x12+G13) ) - ( 4.7 x D12 ) x1.55,

                                            IF(D16=”Very Active(6-7 days of exercise/week)”,
                                                    655.1 + ( 4.35 x D14 ) + ( 4.7 x (D13x12+G13) ) - ( 4.7 x D12 ) x1.725,

                                                    IF(D16=”Extremely Active(exercise twice a day)”,
                                                            655.1 + ( 4.35 x D14 ) + ( 4.7 x (D13x12+G13) ) - ( 4.7 x D12 ) x1.9,
                                                    “ “))))))


    IF(D10=”Male”,
            IF(D16=”Sedentary (no exercise)”,
                    66.5 + ( 13.75 x D14 ) + ( 5.003 x D13 ) – ( 6.755 x D12 )x1.2,


                    IF(Lightly Active (1-3 days of exercise/week)”,
                            66.5 + ( 13.75 x D14 ) + ( 5.003 x D13 ) – ( 6.755 x D12 )x1.375,


                            IF(Moderately Active (3-5 days of exercise/week)”,
                                    66.5 + ( 13.75 x D14 ) + ( 5.003 x D13 ) – ( 6.755 x D12 )x1.55,


                                    IF(D16=”Very Active(6-7 days of exercise/week)”
                                            66.5 + ( 13.75 x D14 ) + ( 5.003 x D13 ) – ( 6.755 x D12 )x1.725,


                                            IF(D16=”Extremely Active(exercise twice a day)”,

                                                    66.5 + ( 13.75 x D14 ) + ( 5.003 x D13 ) – ( 6.755 x D12 )x1.9,

                                            “ “)))))



            IF(D16=”Sedentary (no exercise)”,
                    655.1 + ( 9.563 x D14 ) + ( 1.850 x D13 ) – ( 4.676 x D12 ) x1.2,


                    IF(Lightly Active (1-3 days of exercise/week)”,
                            655.1 + ( 9.563 x D14 ) + ( 1.850 x D13 ) – ( 4.676 x D12 ) x1.375,


                            IF(Moderately Active (3-5 days of exercise/week)”,
                                    655.1 + ( 9.563 x D14 ) + ( 1.850 x D13 ) – ( 4.676 x D12 ) x1.55,


                                    IF(D16=”Very Active(6-7 days of exercise/week)”,

                                            655.1 + ( 9.563 x D14 ) + ( 1.850 x D13 ) – ( 4.676 x D12 ) x1.725,


                                            IF(D16=”Extremely Active(exercise twice a day)”,

                                                    655.1 + ( 9.563 x D14 ) + ( 1.850 x D13 ) – ( 4.676 x D12 ) x1.9,

                                            “ “))))))

    )

person javaProgrammer    schedule 02.07.2016    source источник


Ответы (1)


У вас есть вещи вроде IF(Lightly Active (1-3 days of exercise/week)”, которые явно не сработают. Такого рода вложения IF не должно быть вообще, это минное поле опечаток. Вместо этого используйте hlookup или vlookup. Пример vlookup замены пяти вложенных IF:

=if(D9=”Imperial”,
  if(D10=”Male”,
    vlookup(D16, {
      ”Sedentary (no exercise)”,
        66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.2;   
      ”Lightly Active (1-3 days of exercise/week)”,
        66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.375;
      ”Moderately Active (3-5 days of exercise/week)”,
        66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.55;
      ”Very Active(6-7 days of exercise/week)”,
        66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.725;
      ”Extremely Active(exercise twice a day)”,
        66 + ( 6.2 x D14 ) + ( 12.7 x (D13x12+G13) ) – ( 6.76 x D12 )x1.9,
       }, 2, false)
    ....

Обратите внимание, что вы можете указать здесь 15 вместо 5, и никаких новых скобок не потребуется.

В зависимости от того, как структурированы ваши данные, вы можете разместить эти справочные таблицы в другом месте листа, например, в Table! A1: B5, Table! A6: B11 и т. Д .:

=if(D9=”Imperial”,
   if(D10=”Male”,
     vlookup(D16, Table!A1:B5, 2, false),
     vlookup(D16, Table!A6:B11, 2, false)
     ),
   if(D10=”Male”,
     vlookup(D16, Table!A12:B16, 2, false),
     vlookup(D16, Table!A17:B21, 2, false)
     )
   )

Каждый vlookup можно обернуть в iferror, чтобы, когда входные данные не ожидались, вы получали пустой результат вместо # N / A! ошибка (хотя последняя информативнее).

person Community    schedule 02.07.2016