Vba 当在Excel公式中达到=sum中的最大总和时,是否有解决方法?

Vba 当在Excel公式中达到=sum中的最大总和时,是否有解决方法?,vba,excel,Vba,Excel,当我尝试为单元格公式指定一个和时,我达到了一个极限: cells(y,x).formula = "=sum(G65,H74,I38,J20,G22, .... ,K19,L22)" 在一个=sum公式中,似乎不能有超过30个summands 是否有解决此问题的方法?您可以通过定义单元格名称对其进行分组,或将求和公式拆分为 =sum(…)+sum(…)使用加号代替。我会添加一列,仅用于求和。它将包含一个公式,将每行的数字拉入新列,然后代码的求和公式如下所示: cells(y,x).formula

当我尝试为单元格公式指定一个和时,我达到了一个极限:

cells(y,x).formula = "=sum(G65,H74,I38,J20,G22, .... ,K19,L22)"
在一个=sum公式中,似乎不能有超过30个summands


是否有解决此问题的方法?

您可以通过定义单元格名称对其进行分组,或将求和公式拆分为
=sum(…)+sum(…)

使用加号代替。

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

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

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

您也可以级联求和:

cells(y,x).formula = "=sum(sum(G65,H74,...,I38,J20), sum(G22, .... ,K19,L22))"
请记住,Excel的公式长度限制为1024个字符,因此,如果您的公式需要更长,您可能会遇到该限制。如果是,请使用其他单元格作为中间公式并求和。

选项:

  • A1+A2+…+一个
  • 和(A1,A2)+…+总和(安,上午)
  • 总和(A1、A2、总和(An、Am))

如果你是alergic,theird选项不使用加号。

是的,解决这个问题很容易。只需提前选择所需的单元格(如果它们不相交,请在选择它们时按住Ctrl键)。一旦你全部选择了,就给他们一个名字。例如:

单元格:

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

通过按住Ctrl键并逐个选择来选择它们。然后,在公式栏左侧的框中,键入它们的名称,如“MyCells”,然后按enter键。在您的代码中,现在使用<代码>单元格(y,x)。公式=“=和(MyCype)”< /Calp>

> P>您的示例不显示它,但是如果所有的单元格都在同一行或列中,则选择单独的和以避免中间计算,请考虑使用小计。请参见

解决字符串长度问题的一种方法是将公式分解为“块”,并在设置公式后替换这些块

假设您有一个名为“
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
微软真的应该修正这个限制,因为这是一个让报表自动化头疼的问题

编辑 我决定用这个做一个小例子,并将其扩展为几个类,这些类可以用来表示更广泛的解决方案

你可以下载它。为了更好地说明这一点,请打开Visual Basic编辑器(Alt+F11),将其放在屏幕的右侧,将excel放在屏幕的左侧。在工作表中选择单元格A1,在VBA中,转到“公式生成”模块的第291行。在那里放置一个断点。第317行是一个名为“test”的方法,运行该方法并观察公式的逐步进展。下面我列出了它应该遵循的步骤,数字可能会改变

一,

二,

三,

四,

。截断的

三十四

这将产生:

{=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), "")}
{=IF(和((模糊名称标准选择标准选择标准选择标准1“无”),(模糊名称标准选择标准选择标准1“”),索引((索引(模糊名称标准选择标准1,2,1):索引(模糊名称标准选择标准1,COUNTA(模糊名称标准选择标准1),1)),匹配(0,如果(((索引(模糊名称标准选择标准选择标准1,2,1)):索引(模糊名称标准选择标准1,COUNTA(模糊名称标准1),1)模糊名称标准选择标准1)和(行(索引(模糊名称标准1,2,1):索引(模糊名称标准1,COUNTA(模糊名称标准1),COUNTA(模糊名称标准1),1))>=行())和(ISNA(匹配)(索引(索引(模糊名称标准1,2,1):索引(二元名称二元标准二元,一元,一元):索引(二元名称二元标准二元,(ROW()-ROW(INDEX(二元名称二元标准一元,一元,一元)),一元,零元)=(真&真&真),0,1),1),“”)

这是在使用excel内置的VBA编程语言。尽管有人可能会否认这一点,但这仍然是一个编程问题…@Adam Davis。我不会将此称为编程。编写VBA以自动化excel肯定是编程。将公式放入单元格不是编程。代码
单元格(y,x)。公式=“=sum(G65,H74,I38,J20,G22,…,K19,L22)
是写入单元格的VBA代码。您不能将该行放入单元格并期望得到任何响应-您必须将其加载到VBA编辑器/解释器中才能使其产生任何效果。@GuitarPower,这里有一个标记这一事实并不意味着什么。具有250个重复的任何人都可以创建他们想要的任何标记。根据meta上的这个问题,questExcel公式上的问题应该在superuser.com上。@Sam:谢谢你的链接。那里的大多数答案似乎都同意我的观点。尽管我承认并非所有公式问题都需要在这里,但它们不一定总是需要转移到SU。
+
过敏是不可忽视的。
{=SUM(F_C_34)}
{=SUM(IF(B_O_29, L_C_33, B_O_32))}
{=SUM(IF(P_E_27 = P_E_28, L_C_33, B_O_32))}
{=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))}
{=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))}
{=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))}
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), "")}