在Excel公式中用= sum求和最大加数时有没有解决方法?

当我尝试给单元格公式分配总和时,我遇到了一个限制:

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

似乎我不能在一个= sum公式中有超过30个加数。

有没有解决这个问题的方法?

改用加号。

选项:

  • A1 + A2 + … + An
  • Sum(A1,A2)+ … + Sum(An,Am)
  • SUM(A1,A2,SUM(一,AM))

他们的选项不使用加号,以防万一你是过敏。

您可以通过为它们定义名称来将这些单元格分组,或者将求和公式拆分为=sum(...) + sum(...)

您也可以级联这些数字:

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

请记住,Excel的公式长度限制为1024个字符,因此如果公式需要更长时间,则可能会遇到此限制。 如果是这样,请使用其他单元格作为中间公式并将它们相加。

是的,这很容易解决这个问题。 提前select你想要的单元格(如果它们是非连接的,只要按住Ctrl键就可以select它们)。 一旦你select了所有,只要给他们一个名字。 举个例子:

细胞:

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

按住Ctrl键并单独select每个选项。 然后,在公式栏左边的框中input名称,例如“MyCells”,然后按Enter键。 在你的代码中,现在使用Cells(y,x).formula = "=sum(MyCells)"

我会添加一列仅用于求和。 它将包含一个公式,将每行的数字拉到新的列中,然后您的代码总和公式将如下所示:

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

Q1:Q100将成为新数据列,并加上数字。

您的示例没有显示,但是如果您的所有单元格都在同一行或列中,并且select了单个总和以避免中间计算,请考虑使用SUBTOTAL。 见http://www.dailydoseofexcel.com/archives/2008/01/04/subtotals-ignoring-subtotals/

解决string长度问题的一种方法是将公式分解为“块”,并在设置公式后replace这些块。

假设您有一个名为' 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" 

当你有很长的公式时,事情会变得有点棘手,你必须按照连续的步骤分解它们,每个步骤都有自己的子expression式。

警告:在任何时候都不能引入语法错误,否则将会失败。 我已经遇到了足够的代码,如下所示:

 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 

微软真的应该解决这个限制,因为这是一个报告自动化头痛。

编辑我决定做一个小例子,并将其扩展到几个类,可以用来代表更广泛的解决scheme。

你可以在这里下载。 为了更好地说明这一点,打开Visual Basic编辑器(Alt + F11),将它放在屏幕的右侧,在屏幕左侧出现excel。 在工作表中select单元格A1,在VBA中,转到“FormulaGeneration”模块的第291行。 在那里放置一个rest点。 在317行是一个名为“testing”的方法,运行该方法,随着公式的逐渐推进而观察。 下面我已经把它应该遵循的步骤,数字可能会改变。

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')之后,我用它创build了700多个字符expression式; 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), "")}