Excel – 没有VBA /macros的水平数据公式?
我的数据目前采用以下格式(我可以将其移至最适合此目的的位置,但我想知道这是否可能)。
CELL1 CELL2 CELL3 CELL4 CELLn ITEM # MATERIAL # MATERIAL # MATERIAL
一个例子可能是:
ABCD n Tacos 5 Tortillas 6 Garlic 4 Onions 3 Peppers Banana // These cells are empty because Bananas need no ingredients. Pasta 2 Garlic 3 Sauce
我想要一个公式来检查A列中的每一个独特的项目,并且每个项目都要经过该项目的所有成分(在B列 – > 无限列)。 计算每种成分,每种成分需要多less,然后按以下方式输出:
Torillas 5 Garlic 8 Onions 4 Peppers 3 Sauce 3
如果这是一种编程语言,我可以轻松地用几个for循环来做到这一点,但只是使用IF
和COUNTIF
和SUM
,我不知道从哪里开始。
这是我的build议:将表内的数据转换为2个向量,然后使用一个简单的数据透视表按类别进行求和。
所以首先我要用数据( B2:E4
)来定义所有的区域作为命名的范围materials
。 然后我用一个令人讨厌的公式来创build2个向量,一个是项目,一个是数量。
- 数量:
= IF(ISERROR(LEFT(OFFSET(材料,TRUNC((ROW() - ROW($ A $ 9))/列(的材料)),MOD(ROW() - ROW($ A $ 9),COLUMNS(材料)) (材料),TRUNC((ROW() - ROW($ A $ 9))/ COLUMNS(材料)),MOD(ROW() - ROW($ A $ 9),COLUMNS (材料)),1,1)))),0,VALUE(LEFT(OFFSET(材料,TRUNC((ROW() - ROW($ A $ 9))/列(的材料)),MOD(ROW() - (材料),1,1),find(“”,OFFSET(材料,TRUNC((ROW() - 行($ A $ 9))/ COLUMNS(材料)),MOD( ROW() - ROW($ A $ 9),COLUMNS(材料)),1,1)))))
- 对于项目:
= IF(ISERROR(MID(OFFSET(材料,TRUNC((ROW() - ROW($ B $ 9))/列(的材料)),MOD(ROW() - ROW($ B $ 9),COLUMNS(材料)) (材料),TRUNC((ROW() - ROW($ B $ 9))/ COLUMNS(材料)),MOD(ROW() - ROW($ B $ 9),COLUMNS (材料)),1,1))+ 1,LEN(OFFSET(材料,TRUNC((ROW() - ROW($ B $ 9))/列(的材料)),MOD(ROW() - ROW($ B $ 9),COLUMNS(材料)),1,1)))) “”,MID(OFFSET(材料,TRUNC((ROW() - ROW($ B $ 9))/列(的材料)),MOD(ROW (材料),1,1),FIND(“”,OFFSET(材料,TRUNC((ROW() - ROW($ B $ 9))/ COLUMNS(材料)) ,MOD(ROW() - ROW($ B $ 9),COLUMNS(材料)),1,1))+ 1,LEN(OFFSET(材料,TRUNC((ROW() - ROW($ B $ 9))/列(材料)),MOD(ROW() - ROW($ B $ 9),COLUMNS(材料)),1,1))))
将其粘贴到相关向量的第一个单元格中,然后将所有单元格引用(所有$A$9
和$B$9
)更改到刚刚粘贴公式的单元格(每个公式与其自己的单元格相关) 。 保持绝对的参考 。 最后你拖下来,直到你到达数据的最后一个项目(所以你vector的长度ROWS(materials)*COLUMNS(materials)
长度)。
现在,您只需在这个向量上添加一个Pivot表格,并过滤出空白单元格。
告诉我是否解决了这个问题;)
PS如果你想让我解释一下这个,请写下评论
假定A2:E4包含数据,并且A9:A13包含要返回计数的成分,请在B9中input以下公式,按CONTROL + SHIFT + ENTER确认,然后复制:
=SUM(IF(RIGHT($B$2:$E$4,LEN(A9))=A9,LEFT($B$2:$E$4,FIND(" ",$B$2:$E$4)-1)+0))
相应地调整范围。
这是我能做的
=SUM(IF(IFERROR(SEARCH(G6,$B$2:$E$4),0)>0,VALUE(LEFT($B$2:$E$4,SEARCH(CHAR(32),$B$2:$E$4)-1)),0))
(p / s:我换大蒜面食到5,我爱大蒜)