如何将函数迭代应用于 Excel 中的数据组

How to iteratively apply a function to groups of data in Excel

所以我对使用 excel 很陌生,我可能错过了这样一个已经回答过的问题,但我想做的是测量一个点组之间的距离大 excel sheet。

我已经尝试了编写函数并将其向下拖动的标准方法,但是当我向下移动它时函数发生变化的方式不是我所需要的,我似乎无法弄清楚如何解决这个问题所以我认为宏可能是解决方案。

数据是每组 8 个测量值,每组有一个蓝色、红色、黄色、Csome、重叠、绿色、青色和完整对象。每个对象的 XYZ 坐标列在前三列中,我试图使用一个简单的距离公式来测量每个对象与其同一组中所有其他对象之间的距离。例如。 Blue to Red, Yellow, Csome... 等等 然后Blue2 to Red2, Yellow2, Csome2... and Blue3 to Red3, Yellow3, Csome3...等等第四个。

但是,当我将下面的公式放在我想要的输出应该出现的位置并尝试将其向下拖动时,显然我 运行 遇到了一些问题。对于第一个 Blue 对抗它的整个组,我从 =SQRT((A$2-A2)^2+(B$2-B2)^2+(B$2-B2)^2) 开始并将其向下拖动,使其循环第 2 行与第 3、4、5、6、7、8 和 9 行。当我到达包含 Blue2 的第 10 行时,问题就出现了。这不应与 Blue1 进行比较,而是开始一个新组。那么我怎样才能让循环在第 10 行重新开始,以便在该组中比较以 Blue 2 开头的新组,例如第 10 行中的 XYZ 到第 11、12、13 行中的 XYZ ... :

Position X  Position Y  Position Z  Unit    Category    Collection    Surpass Object

16.38   41.20   4436.18 um  Surface Position    Blue Selection
17.35   40.83   4436.17 um  Surface Position    Red Selection 
15.93   40.62   4435.93 um  Surface Position    Yellow Selection
16.22   40.80   4436.03 um  Surface Position    Csome1
17.97   42.23   4435.46 um  Surface Position    Overlap
15.37   40.87   4436.03 um  Surface Position    Green Selection 
15.44   40.04   4436.39 um  Surface Position    Cyan Selection 
17.97   42.23   4435.46 um  Surface Position    Full 1
15.57   36.20   4435.75 um  Surface Position    Blue Selection 2
12.83   35.19   4435.33 um  Surface Position    Red Selection 2
15.76   37.25   4435.74 um  Surface Position    Yellow Selection 2
14.94   36.17   4435.65 um  Surface Position    Csome2
15.99   36.78   4436.34 um  Surface Position    Overlap 2
14.23   36.26   4435.57 um  Surface Position    Green Selection 2
13.61   36.96   4436.09 um  Surface Position    Cyan Selection 2
14.64   36.42   4435.80 um  Surface Position    Full 2
42.83   36.04   4435.47 um  Surface Position    Blue Selection 3
42.34   36.56   4435.63 um  Surface Position    Red Selection 3
42.25   36.87   4435.75 um  Surface Position    Yellow Selection 3
42.48   36.50   4435.62 um  Surface Position    Csome3
41.77   36.02   4435.67 um  Surface Position    Overlap 3
42.64   36.89   4435.73 um  Surface Position    Green 3
42.05   36.90   4436.21 um  Surface Position    Cyan Selection 3
42.34   36.53   4435.71 um  Surface Position    Full 3
33.75   33.13   4436.32 um  Surface Position    Blue Selection 4
34.99   33.12   4436.38 um  Surface Position    Red Selection 4
35.40   31.97   4436.38 um  Surface Position    Yellow Selection 4
34.75   32.58   4436.36 um  Surface Position    Csome4
39.03   35.24   4436.04 um  Surface Position    Overlap Selection 4
35.49   32.19   4436.49 um  Surface Position    Green Selection 4
36.14   32.35   4436.42 um  Surface Position    Cyan Selection 4
36.16   33.20   4436.30 um  Surface Position    Full 4

作为新的 excel 用户,您已经直接进入了数组公式的奇妙而复杂的世界。

首先,您需要稍微准备一下数据。所有这些 1、2、3 和 4 都需要在它们自己的一列中,第 1 组中的所有这些都需要一个数字,并且所有内容都需要一致命名('Green' 与 'Green Selection')。我们可以使公式更加复杂,以说明数据中的这些特殊性,但清理它会使理解它和公式更容易。

现在我们把我们要计算距离的"Surpass Object"放入单元格I1(本例为'Blue Selection')并将下面的公式放入单元格I2中输入的时候一定要按住ctrl+shift+enter

=SQRT((INDEX($A:$A,MATCH(1,($G:$G=I)*($H:$H=$H2),0))-$A2)^2+(INDEX($B:$B,MATCH(1,($G:$G=I)*($H:$H=$H2),0))-$B2)^2)

这将为我们提供 x 和 y 之间的距离 co-ordinates。如果需要,您需要调整公式以将 z-coordinate 添加到计算中。

那么花哨的 index-match 公式是做什么用的呢?在第一个实例中,它获取 a 列中的单元格,该单元格同时匹配列 header 中的 'Surpass Object'(单元格 J)和当前行的组(单元格 $H2)

现在您只需填写剩余的 header 并向右和向下填写公式以获得您的差异矩阵

应用一些 VBA 循环匹配到 Full 使用通配符并为每次迭代重置公式的起始行应该是最好的方法.

Sub Group_Formula()
    Dim frmla As String, rw As Long, rws As Long, n As Long, cnt As Long

    frmla = "=SQRT((A$×-A×)^2+(B$×-B×)^2+(B$×-B×)^2)"

    With ActiveSheet '<-set to worksheet name properly!
        For cnt = 1 To Application.CountIf(.Columns("G"), "Full*")
            rw = Application.Max(2, rw)
            rws = Application.Match("Full*", .Cells(rw, "G").Resize(Rows.Count - rw, 1), 0)
            .Cells(rw, "H").Resize(rws, 1).Formula = Replace(frmla, Chr(215), rw)
            rw = rw + rws
        Next cnt
    End With

End Sub

结果应类似于以下内容。

您需要使用计算行的函数来处理 AB 引用。您可以使用 INDEXINDIRECTOFFSET 等参考函数来完成您需要的操作。最后两个是易变的,所以请记住,每次 sheet 中的值发生变化时,它们都会重新计算。 INDEX效率更高。

不清楚您的数据是否包含组号,因为行尾的数字不一致。如果它们与您的数据一致,您就可以使用它们。假设组号在列 I 中,这个 INDEX 公式将 return 正确的 A 参考:

INDEX($A:$A,1+((I2-1)*8))

或使用OFFSET函数:

OFFSET($A,(I2-1)*8,0)

否则,(不使用组号)您可以使用 ROWS 函数产生类似的结果:

INDEX($A:$A,1+QUOTIENT(ROWS(A:A2)-1,8)*8)

所有公式中的8表示一组中的项数

完整的公式为:

=SQRT((INDEX($A:$A,1+QUOTIENT(ROWS(A:A2)-1,8)*8)-A2)^2+(INDEX($B:$B,1+QUOTIENT(ROWS(B:B2)-1,8)*8)-B2)^2+(INDEX($C:$C,1+QUOTIENT(ROWS(C:C2)-1,8)*8)-C2)^2)