让我解释一下我的电子表格。这是一个很好的屏幕截图:
我之所以创建此电子表格,主要是因为我已经厌倦了几乎所有营养跟踪应用程序的可用性问题。因此,我正在创建自己的电子表格!如您所见,水平食物是不同的食物/成分,下面是它们的营养成分值。
然后,您将看到在底部的标题为“第一餐”的行带有一些值。这实际上是我在说“ 2.5克藜麦,2粒小扁豆”等。该信息然后显示在下表中,左侧为“第一餐”。*
我现在的目标是允许两件事。
我这样做有点困难,从本质上讲,它取决于“第一餐”表上的 D行的公式。您可以想象SUMPRODUCT(Row Fat, Row First Meal)
的公式是SUMPRODUCT(Row Cholestrol, Row First Meal)
。这对于一顿饭没问题,但是调整多顿饭只是一项繁重的工作,而对多顿饭则无效。
目标是D列中每个单元格的值基本上由以下公式确定。
nutrient = // whatever row we are on
integer sum = 0;
foreach(row in top table):
integer weight = [ammount of the 'nutrient' in this row]
integer innersum = 0;
foreach(meal in meals):
if (meal is contained in string top left corner of this table):
innersum += [number of servings of this row];
sum += innersum * weight;
这实际上是我可以解释此公式的最清晰的方法。基本上,对于每种食品,请查看表格左上方的单元格,然后根据该字符串获取该食品的份量总和,然后再乘以餐中正确营养的含量。
理想情况下,此D单元格中值的公式可以如下实现:
从顶部表格中获取所有餐点的矩阵,并过滤出名称不在左上列中的行。然后,通过将一列中的所有元素相加,将此矩阵简化为单行。然后从膳食营养成分中得出具有该值和特定营养素数量的求和产品。问题是我不知道如何做整个矩阵滤波器并简化操作。坦白地说,我什至不知道电子表格的工作原理。
*不要担心我在设计这顿饭时会考虑一整天的食物。
答案 0 :(得分:1)
这是一个很长的公式,因为您有几件事要做:
(1)找到当前结果块的标题
INDEX(A:A,INT(ROW()/10)*10+1)
(2)在膳食列表中查找匹配的行
ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30)....
(3)根据这些匹配的行构建一个数组
ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30),INDEX(A:A,INT(ROW()/10)*10+1)))*Sheet1!B$20:H$30
(4)获取此数组的列总计
MMULT(TRANSPOSE(ROW(Sheet1!B$20:H$30))^0,ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30),INDEX(A:A,INT(ROW()/10)*10+1)))*Sheet1!B$20:H$30)
(5)在营养表中找到正确的行
INDEX(Sheet1!B$2:H$9,MOD(ROW()-1,10),0)
然后将所有这些放在一起
=SUM(MMULT(TRANSPOSE(ROW(Sheet1!B$20:H$30))^0,ISNUMBER(SEARCH(IF(Sheet1!A$20:A$30<>"",Sheet1!A$20:A$30),
INDEX(A:A,INT(ROW()/10)*10+1)))*Sheet1!B$20:H$30)*INDEX(Sheet1!B$2:H$9,MOD(ROW()-1,10),0))
这是一个数组公式,必须使用 Ctrl Shift Enter
输入我假设Sheet2排列成9行加空白行的块,即每个块总共10行。
Sheet1
Sheet2