如何将函数迭代应用于 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
结果应类似于以下内容。
您需要使用计算行的函数来处理 A
、B
引用。您可以使用 INDEX
、INDIRECT
或 OFFSET
等参考函数来完成您需要的操作。最后两个是易变的,所以请记住,每次 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)
所以我对使用 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
结果应类似于以下内容。
您需要使用计算行的函数来处理 A
、B
引用。您可以使用 INDEX
、INDIRECT
或 OFFSET
等参考函数来完成您需要的操作。最后两个是易变的,所以请记住,每次 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)