假设我想"(x1*m1+x2*m2...+xi*mi)/m_tot"
在 excel 中使用此公式。其中“xi”出现在每 6 行中,而“mi”出现在另一个列中的每 6 行中。“m_tot”是所有“mi”值的总和。有人知道一个聪明的方法来做到这一点吗?有很多行,因此手动输入所有内容很费劲。
答案1
一个简单的解决方案是使用顺序()函数。不过,它在旧版 Excel 中不可用。下面的示例还使用了让()函数使公式变得更短且更容易理解。
x
我设置了一个包含A
和m
的样本数据表B
。我为两列都编了数字,最后每列都有 39 个值。这并不重要,但它有助于理解公式。您需要更改它以匹配您的实际数据。
以下是得出最终结果的公式:
=LET(X,A:A,M,B:B,n,SEQUENCE(COUNTA(X),1,2,6),Xn,INDEX(X,n),Mn,INDEX(M,n),SUMPRODUCT(Xn,Mn)/SUM(Mn))
让我们逐项分解。LET() 允许我们将值定义为变量,因此除最后一项外,其他所有项都是一对的一部分。这些对如下:
X,A:A
保存 X 的数据范围。更新它以匹配您的实际数据。M,B:B
保存 M 的数据范围。更新它以匹配您的实际数据。n,SEQUENCE(COUNTA(X),1,2,6)
创建一个数组,计数(在本例中)从 2 到 X 中有多少个非空白,仅报告每 6 个数字。您可能需要编辑它。在我的数据中,实际数据在 X 中从第 2 行开始。结果数组是2,8,14,20,...
。关键点:按照这种写法,它将创建一个计数比您的数据高得多的数组,因为它计数相同数量的点,但计数方式为 6。在我的例子中,我拥有的 39 行数据变成了一个数组2,8,14,...224,230,236
。当且仅当您在 X 下方没有更多数据时,这才没问题。如果有,您需要编辑它。一个选项是将第一个术语设置为COUNTA(X)/6+1
或类似的东西。Xn,INDEX(X,n)
从 X 中提取每个第 n 个项。如果n
计数远高于X
身高,那么这将包括 X 以下的数据。在我的例子中,这全是空白,算作零,所以没有影响。Mn,INDEX(M,n)
从 M 中提取每第 n 个项。保存与 相同的警告Xn
。
然后最后一项返回结果:
SUMPRODUCT(Xn,Mn)/SUM(Mn)
SUMPRODUCT()
将数组相乘,然后对结果数组求和,因此它等同于x1*m1 + x2*m2 + ... + xn*mn
。
这是我的数据的更大屏幕截图,也显示了一些中间步骤。
此公式不能保证完美适合您的用例。不过,它应该能为您提供一个良好的开端。如果您对 X 和 M 使用有限的范围(例如A1:A40
而不是A:A
),但不SEQUENCE()
相应地更改参数,它将尝试提取超出 X 范围的数据并返回 #REF! 错误。
答案2
将此公式放入 C1 并向下复制
=SUMPRODUCT(A1:A6, B1:B6) / SUM(B1:B6)
其中 A 列是您的 x 值,B 列是您的 m 值。从数学上讲,这是 xi 的加权和,其中每个 xi 都以 mi/mtot 的比率加权。该公式将计算当前行下方的 5 行(包括其本身在内为 6 行)。
如果您只希望每 6 行显示答案,则可以将中间的行空白掉:
=IF(MOD(ROW()-1,6)=0, SUMPRODUCT(A1:A6, B1:B6) / SUM(B1:B6), "")