如何根据标题名称的PART对数据进行求和?

时间:2017-01-16 09:31:27

标签: excel vba excel-formula

说我有专栏

/ 670 - 白色| / 650 - 黑色| / 680 - 红色| / 800 - Whitest

这些行中包含数据。基本上,如果标题包含我想要的字符串,我想将它们的值汇总在一起。 出于模块化的考虑,我只想指定sum / 670,/ 650和/ 680,而不必提及标题文本的其余部分。

所以类似= SUMIF(a1:c1;" / NUM& / NUM& / NUM&#34 ;; a2:c2)

那不起作用,说实话,我不知道自己应该寻找什么。

其他内容:

  • 我试图自己想出答案,是否有可能提到标题文本作为ifs的条件?喜欢:如果A2 =" / 650 - 黑"然后继续总结下一个标题。这可能吗?
  • 可能不会涉及VBA,可以使用可拖动的公式!

  • 此时,我还可以请求一个处理完整标题名称的版本而不仅仅是其中的一部分,因为我认为单独使用公式代码很困难。

感谢您一看!

如果我需要详细说明,请告诉我。

编辑:关于数据样本,任何正数都会实际发生,该死的堆栈溢出并不支持表格降价。无论如何,例如......:

    +-------------+-------------+-------------+-------------+-------------+
    |      A      |      B      |      C      |      D      |      E      |
+---+-------------+-------------+-------------+-------------+-------------+
| 1 |/650 - Black |/670 - White |/800 - White |/680 - Red   |/650 - Black |
+---+-------------+-------------+-------------+-------------+-------------+
| 2 |     250     |     400     |     100     |     300     |     125     |
+---+-------------+-------------+-------------+-------------+-------------+

我应该澄清一下:

这些标题的编号范围是从/ 100 - / 9999开始,不超过这个。

编辑:

到目前为止的进展:

https://docs.google.com/spreadsheets/d/1GiJKFcPWzG5bDsNt93eG7WS_M5uuVk9cvkt2VGSbpxY/edit?usp=sharing

公式:

=SUMPRODUCT((A2:D2*
(MID($A$1:$D$1,2,4)=IF(LEN($H$1)=4,$H$1&"",$H$1&" ")))+(A2:D2*
(MID($A$1:$D$1,2,4)=IF(LEN($I$1)=4,$I$1&"",$I$1&" ")))+(A2:D2*
(MID($A$1:$D$1,2,4)=IF(LEN($J$1)=4,$J$1&"",$J$1&" "))))

显然,每个F9计算时,每个MID函数都返回false。

编辑编辑:

好!我发现了我的问题,当你提到它并不是必需的时候,它正在阅读。伙计,我应该停止略读!

最终编辑:

    =SUMPRODUCT((RETURNSUM*
(MID(HEADER,2,4)=IF(LEN(Match5)=4,Match5&"",Match5&" ")))+(RETURNSUM*
(MID(HEADER,2,4)=IF(LEN(Match6)=4,Match6&"",Match6&" ")))+(RETURNSUM*
(MID(HEADER,2,4)=IF(LEN(Match7)=4,Match7&"",Match7&" ")))

这个想法是Header和RETURNSUM将成为匹配条件,就像上面写的匹配一样,这样就可以更容易地将新标准打入搜索表。截至目前,它不支持多行/拖动。

2 个答案:

答案 0 :(得分:2)

我已经敲了几个能达到你想要的公式。为方便起见,我已经使搜索输入仅需要数字,因为按 / 不会自动键入公式栏。我为答案的长度道歉,我对解释感到有些不自在。

我已针对位于J1K1L1的3个条件进行了设置。

以下是我实现的输出: enter image description here

公式1 - SUMPRODUCT(): =SUMPRODUCT((A4:G4*(MID($A$1:$G$1,2,4)=IF(LEN($J$1)=4,$J$1&"",$J$1&" ")))+(A4:G4*(MID($A$1:$G$1,2,4)=IF(LEN($K$1)=4,$K$1&"",$K$1&" ")))+(A4:G4*(MID($A$1:$G$1,2,4)=IF(LEN($L$1)=4,$L$1&"",$L$1&" "))))

Sumproduct(array1,[array2])表现为数组公式,无需作为一个输入。数组公式细分范围并逐个单元计算它们(在本例中我们使用单行,因此公式将单独评估列)。

(A4:G4*(MID($A$1:$G$1,2,4)=IF(LEN($J$1)=4,$J$1&"",$J$1&" ")))

基本上我已将Sumproduct()公式分为3个相同的部分 - 每个搜索条件为1。 (A4:G4*:现在,由于公式的行为类似于数组,我们将每个单元格乘以1或0并将结果相加。

当公式的下一部分为真时产生

,而当它为假时产生0(TRUE / FALSE的默认数值)。

(MID($A$1:$G$1,2,4)=IF(LEN($J$1)=4,$J$1&"",$J$1&" "))

这里使用

MID(text,start_num,num_chars)来评估"/"之后的4位数,看看它们是否与我们搜索的3个单元格中的数字匹配(在这种情况下是第一个:{ {1}})。同样,由于J1非常类似于数组公式,因此将对每个范围内的单元格进行单独评估。

然后我使用SUMPRODUCT()检查我正在搜索的号码的长度。当我们搜索一个4位数的文本字符串时,如果数字是4位数,则不添加任何内容(IF(logical_test,[value_if_true],[value_if_false]))以强制它为文本字符串,如果不是(因为它必须是3位数)添加最后一个空格("")再次强制它成为文本字符串。

然后公式将执行如下计算: " "公式生成数组:MID()。这与第一次搜索相结合,产生{"650 ","670 ","800 ","680 ","977 ","9999","143 "},乘以{TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE} (记住0代表假,1代表真假)产生这个数组:A4:G4基本上把所需的结果拉到一起就可以求和了。

公式2:= SUM(IF(数组)): [此公式不适用于3位数字,因为它们将存在于4位数字中!我仅将其用于教育目的] {250,0,0,0,0,0,0}

公式将需要作为数组输入(一旦复制并粘贴,但仍然在公式栏中点击 CTRL + SHIFT + ENTER

此公式的工作方式类似,=SUM(IF(ISNUMBER(SEARCH($J$1,$A$1:$G$1)),A8:G8),IF(ISNUMBER(SEARCH($K$1,$A$1:$G$1)),A8:G8),IF(ISNUMBER(SEARCH($L$1,$A$1:$G$1)),A8:G8))会将SUM()列与结果列匹配的数组值相加。

IF(ISNUMBER(SEARCH()在单元格中找到表示其在字符数中的位置的确切字符时,它将返回一个数字。使用SEARCH()我无法完成我在上一个公式中使用的整个ISNUMBER()MID(),因为匹配时会生成IF(LEN()=4,""," ") / TRUE无论其位置或单元格格式如何都会被发现。

如前所述,这会产生一个问题,因为FALSE可以找到999等。

第一部分的结果数组是:9999(如果你想看到数组,你可以突出显示公式的那一部分并用 F9 计算,但一定要突出显示该公式中该部分的确切括号。)

我希望我已经很好地解释了这一点,随时可以询问有关您不理解的内容的任何问题。很高兴看到人们热衷于学习,而不仅仅是为了快速回答。我非常乐意帮助和更深入地解释。

答案 1 :(得分:1)

我使用数组中的名称启动此解决方案,您可以将标题名称读入数组并且没有太大困难。

Sub test()
    Dim myArray(1 To 4) As String
    myArray(1) = "/670 - White"
    myArray(2) = "/650 - black"
    myArray(3) = "/680 - Red"
    myArray(4) = "/800 - Whitest"

    For Each ArrayValue In myArray
    'Find position of last character
        endposition = InStr(1, ArrayValue, " - ", vbTextCompare)
    'Grab the number section from the string, based on starting and ending positions
        stringvalue = Mid(ArrayValue, 2, endposition - 2)
    'Convert to number
        NumberValue = CLng(stringvalue)
    'Add to total
        Total = Total + NumberValue
    Next ArrayValue
    'Print total
    Debug.Print Total
End Sub

这将打印调试窗口的答案。