macros通用公式

我有一个Excel工作表,有四列(AD),如下所示:

 1 XYZ 100 800
 2 XYZ 250 820
 3 XYZ 500 1100
 4 XYZ 4,000 1200 

我想要计算列的E值如下:

E1 =(D1-D1)* C1
E2 =(D2-D1)* C1
E3 =(D3-D1)* C1 +(D3-D2)* C2
E4 =(D4-D1)* C1 +(D4-D2)* C2 +(D4-D3)* C3

依此类推,如果有额外的行

预期结果:E1 = 0,E2 = 2000,E3 = 100000,E4 = 185000

是否有可能推广这个公式? 任何帮助,高度赞赏。

你不能在单元格中推广这个公式,因为公式需要增长 。 此外,Excel单元格中的公式的字符数限制(请参阅下面的@pnuts注释),因此无法可靠地使用VBA来“构build”公式,因为在一定数量的行之后,您将超出该阈值。 虽然你的用例可能没有运行到这个限制,在这种情况下,我宁愿UDF通过一个VBA子程序的“简单”build立一个长的公式string。

可以编写自定义函数,通过迭代范围来计算值。 这适用于您的示例数据。 将代码放在一个标准的代码模块中。

Public Function GetValue(ByVal clStart As Range, ByVal clEnd As Range) As Variant 'Pass only the cell address for the first cell ("D1") and the last cell ("D4") Dim rng As Range Dim r As Range Dim i As Long Dim myVal As Double Application.Volatile If Not clStart.Column = clEnd.Column Then 'These cells should be in the same column, if not ' display an error myVal = CVErr(2023) GoTo EarlyExit End If Set rng = Range(clStart.Address, clEnd.Address) For i = 1 To rng.Rows.Count - 1 Set r = rng.Cells(i) myVal = myVal + _ ((clEnd.Value - r.Value) * r.Offset(0, -1).Value) Next EarlyExit: GetValue = myVal End Function 

E4 = D4 * SUM(C $ 1:C3)-SUMPRODUCT(C $ 1:C3,D $ 1:D3)..而不是E4 =(D4-D1)* C1 + (D4-D2)* C2 +(D4-D3)* C3

为了防止性能下降,如果可以使用临时列,可以创build列来存储C和C * D的部分和。