在Excel公式中命中= sum中的最大值时是否有解决方法?

时间:2010-02-23 17:27:45

标签: excel vba excel-vba

当我尝试为单元格公式分配总和时,我达到了极限:

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

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

此问题是否有解决方法?

8 个答案:

答案 0 :(得分:4)

改为使用加号。

答案 1 :(得分:4)

选项:

  • A1 + A2 + ... + An
  • 总和(A1,A2)+ ... +总和(An,Am)
  • SUM(A1,A2,萨姆(安,AM))

如果你是过敏的话,他们的选项不会使用加号。

答案 2 :(得分:2)

您可以通过为单元格定义名称或将sum-formula分割为单元格来对单元格进行分组 =sum(...) + sum(...)

答案 3 :(得分:1)

您也可以级联总和:

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

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

答案 4 :(得分:1)

是的,这很容易解决这个问题。只需提前选择您想要的单元格(如果它们是非连接的,只需在选择它们时按住Ctrl键)。完成所有选择后,只需给它们命名即可。例如:

细胞:

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

按住Ctrl键选择它们并单独选择。然后,在公式栏左侧的框中,键入它们的名称,如“MyCells”,然后按Enter键。在您的代码中,现在使用Cells(y,x).formula = "=sum(MyCells)"

答案 5 :(得分:0)

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

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

Q1:Q100将是新列,其中包含要求求和的数字。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

解决字符串长度问题的一种方法是将公式分解为' chunks'并在设定公式后替换这些块。

我们假设您有一些范围,命名为' 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

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

修改的 我决定用这个做一个小例子,然后把它扩展成几个类,可以用来代表更广泛的解决方案。

您可以下载here。为了更好地说明这一点,打开Visual Basic编辑器(Alt + F11),将其放在屏幕右侧,擅长屏幕左侧。在工作表中选择单元格A1,在VBA中,转到' FormulaGeneration'的第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))}

根据我的需要扩展了一些(未在示例中反映出来,并删除&#39; xl&#39;前缀以支持&#39; fg&#39;),我已经用它来创建700多个字符表达; fgRangedIndex如下所示:INDEX(vArray,vRow1,[vColumn1]):索引(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), "")}