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

说我有专栏

/ 670 – 白色| / 650 – 黑色| / 680 – Red | / 800 – Whitest

这些数据在其行中。 基本上,我想要汇总他们的价值,如果他们的头包含我想要的string。 为了模块化的缘故,我只想指定总和/ 670,/ 650和/ 680,而不必提及标题文本的其余部分。

因此,类似= SUMIF(a1:c1;“/ NUM&/ NUM&/ NUM”; 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&" ")))) 

显然,每个MID函数在每个F9计算中都返回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&" "))) 

这个想法是,标题和RETURNSUM将成为像上面写的匹配匹配的标准,这样就更容易冲击新的标准到search表中。 截至目前,它不支持多行/拖动。

我已经敲了几个公式,将实现你在找什么。 为了方便我做了searchinput只需要按数字/不自动键入公式栏。 我对这个答案的长度表示歉意,对这个解释我有点不解。

我已经设置了3个位于J1K1L1

这是我取得的成果: 在这里输入图像说明

公式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])performance为一个数组公式,而不需要input为一个。 数组公式分解范围并逐个计算它们(在这个例子中,我们使用单行,所以公式将单独评估列)。

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

基本上我已经把Sumproduct()公式分成了3个相同的部分 – 每个search条件1个。 (A4:G4* :现在,由于公式的行为像一个数组,我们将乘以1或0的每个单独的单元格,并将结果添加在一起。

当公式的下一部分为真时产生1,在假时为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个数字,看看它们是否与我们正在search的3个单元格中的数字匹配(在本例中为第一个: J1 )。 同样,由于SUMPRODUCT()与数组公式一样,范围中的每个单元格都将被单独评估。

然后我使用IF(logical_test,[value_if_true],[value_if_false])来检查我正在search的数字的长度。 正如我们正在search一个4位数字的文本string,如果数字是4位,那么不加任何( "" )强制它为一个文本string,如果不是(因为它必须是3位数字)添加1空格结束( " " )再次迫使它成为一个文本string。

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

公式2:= SUM(IF(arrays)): [该公式不适用于3位数字,因为它们将存在于4位数字内! 我已经将它列入教育目的] =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))

该公式将需要作为一个数组input(一旦复制和粘贴,而仍然在公式栏按CTRL + SHIFT + ENTER

这个公式以类似的方式工作, SUM()将把IF(ISNUMBER(SEARCH()列)匹配结果列的数组值相加。

SEARCH()在单元格中find代表它在字符数中的位置的确切字符时,它将返回一个数字。 通过使用ISNUMBER()我避免了必须完成前面公式中使用的整个MID()IF(LEN()=4,""," ") ,因为如果发现匹配,则会生成TRUE / FALSE它的位置或单元格格式。

如前所述,这是一个问题,因为999可以在9999等内find

第一部分的结果数组是: {250,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE} (如果您想查看数组,可以突出显示该公式的一部分并使用F9进行计算,但一定要突出显示该部分公式的确切括号)。

我希望我已经解释清楚了,随时提出任何你不明白的问题。 很高兴看到有人热衷于学习,而不是只为了快速的回答。 我会很乐意帮助和更深入地解释。

我使用数组中的名字来启动这个解决scheme,可以将标题名称读入一个数组,而不会太困难。

 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 

这将打印答案到debugging窗口。