Есть ли обходной путь при достижении максимума слагаемых в = сумма в формуле Excel? - PullRequest
2 голосов
/ 23 февраля 2010

Я достигаю предела при попытке назначить сумму формуле ячеек:

cells(y,x).formula = "=sum(G65,H74,I38,J20,G22, .... ,K19,L22)"

Кажется, что я не могу иметь более 30 слагаемых в формуле = sum .

Есть ли решение этой проблемы?

Ответы [ 8 ]

4 голосов
/ 23 февраля 2010

Параметры:

  • A1 + A2 + ... + An
  • Сумма (A1, A2) + ... + Сумма (An, Am)
  • Сумма (A1, A2, Sum (An, Am))

Опция ихd не использует знаки плюс, если вы настороже.

4 голосов
/ 23 февраля 2010

Используйте вместо этого плюсы.

2 голосов
/ 23 февраля 2010

Вы можете сгруппировать ячейки, задав для них имена или разделив формулу суммы на =sum(...) + sum(...).

1 голос
/ 23 февраля 2010

Да, это довольно легко обойти. Просто выделите нужные ячейки заранее (если они не соединяются, просто удерживайте клавишу Ctrl, пока вы их выбираете). Как только вы все выбрали, просто дайте им имя. Так, например:

Мобильный телефон:

  • A3 = 3
  • G22 = 4
  • D1 = 5

Выберите их, удерживая нажатой клавишу Ctrl и выбирая каждый по отдельности. Затем в поле слева от строки формул введите для них имя, например «MyCells», и нажмите клавишу ввода. В вашем коде теперь используйте Cells(y,x).formula = "=sum(MyCells)"

1 голос
/ 23 февраля 2010

Вы также можете каскадно суммировать:

cells(y,x).formula = "=sum(sum(G65,H74,...,I38,J20), sum(G22, .... ,K19,L22))"

Имейте в виду, что ограничение длины формулы для Excel составляет 1024 символа, поэтому вы можете столкнуться с этим ограничением, если ваша формула должна быть намного длиннее. Если это так, используйте другие ячейки, чтобы действовать как промежуточные формулы и суммировать их.

0 голосов
/ 20 сентября 2014

Одним из способов решения проблемы длины строки является разбиение формулы на «чанки» и замена этих чанков после установки формулы.

Допустим, у вас есть некоторый диапазон с именем 'r', и у вас есть условие if, каждый из параметров которого имеет длину 120 байтов:

r.Formula = "=IF(P_01, P_02, P_03)"
r.Replace "P_01", "Parameter 1"
r.Replace "P_02", "Parameter 2"
r.Replace "P_03", "Parameter 3"

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

Предостережение: вы не можете ввести синтаксическую ошибку в любой момент, иначе она не будет выполнена. Я столкнулся с этим достаточно, чтобы иметь такой код:

m_rng_CurrentListItem.Replace "C_2_", m_str_FormulaReplacement1
m_rng_CurrentListItem.Replace "C_3_", m_str_FormulaReplacement2
m_rng_CurrentListItem.Replace "C_4_", m_str_FormulaReplacement3
m_rng_CurrentListItem.Replace "C_5_", m_str_FormulaReplacement4
m_rng_CurrentListItem.Replace "R_2_", m_str_FormulaReplacement5
m_rng_CurrentListItem.Replace "C_6_", m_str_FormulaReplacement6

Microsoft действительно должна исправить это ограничение, потому что это головная боль автоматизации отчетов.

Редактировать Я решил сделать небольшой пример с этим и расширил его до нескольких классов, которые можно использовать для представления более широкого решения.

Вы можете скачать его здесь . Чтобы лучше всего это проиллюстрировать, откройте редактор Visual Basic (Alt + F11), поместите его справа от экрана, выделитесь слева от экрана. В таблице выберите ячейку A1, в VBA перейдите к строке 291 модуля «Формула генерации». Поместите точку останова там. В строке 317 находится метод с именем «test», запустите этот метод и наблюдайте, как формула постепенно прогрессирует. Ниже приведены шаги, которые должны следовать, цифры могут измениться.

1

{=F_C_35}

2

{=SUM(F_C_34)}

3

{=SUM(IF(B_O_29, L_C_33, B_O_32))}

4

{=SUM(IF(P_E_27 = P_E_28, L_C_33, B_O_32))}

. , , Усеченный

34

{=SUM(IF(((TestTable3[Right Column] > 5)&(TestTable3[Right Column] < 50)&(TestTable3[Left Column] <> "Exclude Marker")&(TestTable3[Left Column] <> "Exclude Marker 19")) = (TRUE&TRUE&TRUE&TRUE), TestTable3[Right Column], L_C_30 + I_V_31))}

35

{=SUM(IF(((TestTable3[Right Column] > 5)&(TestTable3[Right Column] < 50)&(TestTable3[Left Column] <> "Exclude Marker")&(TestTable3[Left Column] <> "Exclude Marker 19")) = (TRUE&TRUE&TRUE&TRUE), TestTable3[Right Column], TestTable3[Right Column] + I_V_31))}

36

{=SUM(IF(((TestTable3[Right Column] > 5)&(TestTable3[Right Column] < 50)&(TestTable3[Left Column] <> "Exclude Marker")&(TestTable3[Left Column] <> "Exclude Marker 19")) = (TRUE&TRUE&TRUE&TRUE), TestTable3[Right Column], TestTable3[Right Column] + 100))}

После расширения его для моих нужд (не отраженного в примере и удаления префикса 'xl' в пользу 'fg') я использовал его для создания более 700 выражений символов; fgRangedIndex выглядит так: INDEX (vArray, vRow1, [vColumn1]): Index (vArray, vRow2, [vColumn2]).

Set m_exp_CurrentExpression = _
    fgIfCall( _
        fgAndCall(fgBinaryOperation(m_nam_PreviousSelection, fgBinOpInequality, "None", True), _
            fgBinaryOperation(m_nam_PreviousSelection, fgBinOpInequality, vbNullString, True)), _
        fgIndexCall( _
            fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1), _
            fgMatchCall(0, _
                fgIfCall( _
                    fgComplexAndCondition( _
                        fgBinaryOperation( _
                            fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1), fgBinOpInequality, m_nam_PreviousSelection), _
                        fgBinaryOperation(fgRowCall(fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1)), fgBinOpGreaterThanOrEqualTo, fgRowCall()), _
                        fgIsNaCall(fgMatchCall(fgRangedIndex(m_nam_PreviousList, 2, fgCountACall(m_nam_PreviousList), 1, 1), _
                                               fgRangedIndex(m_nam_CurrentName, 1, fgBinaryOperation(fgRowCall(), fgBinOpSubtraction, fgRowCall(fgIndexCall(m_nam_PreviousList, 1, 1)), True), 1, 1), 0))), 0, 1), 0), 1), vbNullString)

Какие выходы:

{=IF(AND((AMBIGUATED_NAME_CRITERION_SELECTION_1 <> "None"), (AMBIGUATED_NAME_CRITERION_SELECTION_1 <> "")), INDEX((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1)), MATCH(0, IF(((((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1)) <> AMBIGUATED_NAME_CRITERION_SELECTION_1))&((ROW((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1))) >= ROW()))&(ISNA(MATCH((INDEX(AMBIGUATED_NAME_CRITERION_1, 2, 1):INDEX(AMBIGUATED_NAME_CRITERION_1, COUNTA(AMBIGUATED_NAME_CRITERION_1), 1)), (INDEX(AMBIGUATED_NAME_CRITERION_2, 1, 1):INDEX(AMBIGUATED_NAME_CRITERION_2, (ROW() - ROW(INDEX(AMBIGUATED_NAME_CRITERION_1, 1, 1))), 1)), 0)))) = (TRUE&TRUE&TRUE), 0, 1), 0), 1), "")}
0 голосов
/ 24 февраля 2010

Ваш пример не показывает этого, но если все ваши ячейки находятся в одной строке или столбце, и вы выбираете отдельные суммы, чтобы избежать промежуточных вычислений, рассмотрите возможность использования SUBTOTAL. Смотри http://www.dailydoseofexcel.com/archives/2008/01/04/subtotals-ignoring-subtotals/

0 голосов
/ 23 февраля 2010

Я бы добавил столбец, который будет использоваться только для суммирования. Он будет содержать формулу, которая вытягивает номер каждой строки в новый столбец, и тогда ваша формула суммы для кода будет выглядеть следующим образом:

cells(y,x).formula = "=sum(Q1:Q100)"

Где Q1: Q100 будет новым столбцом с суммируемыми числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...