如何根据标题名称的一部分对数据进行求和?
说我有专栏
/ 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个位于J1
, K1
和L1
。
这是我取得的成果:
公式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窗口。