我的目标是找到最接近某一点的点。我有一个不同点的坐标列表,我想找到最接近该列表中不存在的某个点(Point1)。
使用MIN功能,我可以找到Point1与列表中最近点之间的最近距离。
问题在于我无法找到该点的坐标(或至少一个坐标)。为此,我想我需要使用VBA。
我会使用VBA在一个坐标(例如x)的列中找到我寻找的点(一个距离最近的点)的一个坐标。我已经编写了一个简单的代码,如果我添加if条件但是它不起作用,它应该能给我我想要的东西。我将在代码中使用的if条件是:
如果columnx =(SQRT(Abs((距离)^ 2 - ((columny - pt1y)^ 2)))+ pt1x)那么 pt2x = columnx
pt2x将是Point1的函数名,pt1y-y坐标,Point1的pt1x-x坐标,其余的你应该理解。
我写的代码是:
Function K23S(l As Range, s As Range) As Variant
Dim K() As Variant
K = Range("l").Value
Dim M() As Variant
M = Range("s").Value
Dim i As Long
Dim j As Long
For i = LBound(K) To UBound(K)
For j = LBound(M) To UBound(M)
If K(i) = M(j) Then
p = K(i)
End If
Next j
Next i
p = K23S
End Function
它比较两列(例如A1:A32和B1:B32),如果同一行中的值匹配(如果它们在同一行上开始),则应该给出一个值。目前它给#VALUE!错误。我也尝试了For Each,但结果是一样的。单元格中的值格式正确。
我做错了什么?或者也许你可以提供不同的解决方案?
我已经使用了这个链接,也许它有助于解决:http://excelmacromastery.com/Blog/index.php/the-complete-guide-to-using-arrays-in-excel-vba/
*在某些情况下,互联网上找到的Excel公式没有给出正确答案,所以我想尝试不同的方法。
答案 0 :(得分:1)
p = K23S
应为K23S = p
。
将Option Explicit
添加到模块的顶部,因为它应该识别这样的编译错误。
另外,您错误地进行了范围分配。
Function K23S(l As Range, s As Range) As Variant
Dim K() As Variant
Dim M() As Variant
K = l.Value
M = s.Value
Dim i As Long
Dim j As Long
For i = LBound(K) To UBound(K)
For j = LBound(M) To UBound(M)
If K(i) = M(j) Then
K23S = K(i)
Exit Function
End If
Next j
Next i
K23S = "Default Value"
End Function
我还在函数找到匹配项时添加了一个提前退出,并且默认返回值(如果找不到任何内容)。
答案 1 :(得分:0)
我刚刚解决了我的问题。列nr应该被引导到数组。正确的代码是:
功能K23S(l作为范围,作为范围)作为变体
Dim K() As Variant
Dim M() As Variant
K = l.Value
M = s.Value
Dim i As Long
Dim j As Long
For i = LBound(K) To UBound(K)
For j = LBound(M) To UBound(M)
If K(i, 1) = M(j, 1) Then
K23S = K(i, 1)
Exit Function
End If
Next j
Next i
K23S = "Default Value"
结束功能