【问题标题】:Finding closest coordinates with the help of VBA在 VBA 的帮助下找到最近的坐标
【发布时间】:2015-12-21 23:59:14
【问题描述】:

我的目标是找到离某个点最近的点。我有一个不同点的坐标列表,我想找到最接近不在该列表中的某个点 (Point1)。

使用 MIN 函数,我可以找到 Point1 和列表中最近点之间的最近距离。

问题是我找不到那个点的坐标(或至少一个坐标)。为此,我认为我需要使用 VBA。

我会使用 VBA 在一个坐标(例如 x)的列中找到我正在寻找的点的一个坐标(距离最近的点)。我编写了一个简单的代码,如果我添加我的 if 条件,它应该会给我我想要的东西,但它不起作用。我将在代码中使用的 if 条件是:

如果 columnx = (SQRT(Abs((distance) ^ 2 - ((columny - pt1y) ^ 2))) + pt1x) 那么 pt2x = columnx

pt2x就是函数名,pt1y-y坐标Point1,pt1x-x坐标Point1,其余的你要明白。

我写的代码是:

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 公式无法给出正确答案,因此我想尝试不同的方法。

【问题讨论】:

    标签: vba excel


    【解决方案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
    

    我还在你的函数找到匹配项和默认返回值时添加了一个提前退出(以防它找不到任何东西)。

    【讨论】:

    • 另外,您可能还可以使用索引/匹配做一些魔法来完成此任务,不过我不确定是否会想当然。
    • 谢谢,但这也不起作用。同样的错误。在我看来,索引/匹配没有帮助,因为公式需要一个无法输入到公式中的循环(for next)。
    • @inf 您调用它的语法到底是什么?
    【解决方案2】:

    我刚刚解决了我的问题。列 nr 应该添加到数组中。正确的代码是:

    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, 1) = M(j, 1) Then
                K23S = K(i, 1)
                Exit Function
            End If
        Next j
    Next i
    K23S = "Default Value"
    

    结束函数

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 2017-03-09
      • 2019-07-31
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多