创建 VBA 循环来验证跨范围的两个嵌套函数的结果

创建 VBA 循环来验证跨范围的两个嵌套函数的结果

我一直绞尽脑汁试图弄清楚如何在 for each 循环中嵌套一个函数,以便对每个结果运行相同的验证,并在符合条件时将其添加到列表中。

因此,我使用的基本函数抓取 2 个纬度/经度集并获取两者之间的距离(以公里为单位)。列表如下:

Public Function getDistance(latitude1,longitude1,latitude2,longitude2)
earth_radius = 6371
Pi = 3.14159265
deg2rad = Pi / 180

dLat = deg2rad * (latitude2 - latitude1)
dLon = deg2rad * (longitude2 - longitude1)

a = Sin(dLat / 2) * Sin(dLat / 2) + Cos(deg2rad * latitude1) * Cos(deg2rad * latitude2) * Sin(dLon / 2) * Sin(dLon / 2)
c = 2 * WorksheetFunction.Asin(Sqr(a))

d = earth_radius * c

getDistance = d

End Function

因此我想要做的是针对两个位置列表运行它并执行 for 循环,用伪代码来说,它将是:对于列表 A 中的每个位置;创建 5 公里范围内每个位置的列表(获取距离结果)

我有来自 extendoffice 的第二个代码块,它看起来很接近,因为它是下面列出的多参数 vlookup:

Function MYVLOOKUP(pValue As String, pWorkRng As Range, pIndex As Long)
'Update 20150310
Dim rng As Range
Dim xResult As String
xResult = ""
For Each rng In pWorkRng

    If rng = pValue Then
        xResult = xResult & " " & rng.Offset(0, pIndex - 1)
    End If
Next
MYVLOOKUP = xResult
End Function

我似乎无法将该函数嵌套在 vlookup 循环中,我知道我必须在 for each 循环中调用 get distance 函数,但我认为它可能需要在那个 for 循环内嵌套循环。

我的想法完全错了吗?我对 VBA 还很陌生,所以我真正遇到的困难是弄清楚这个双重嵌套循环的语法...

更新:

所以我认为我已经进一步了解了我需要的东西。我不认为我会尝试比较这两个范围,而是将查找变量的纬度和经度引入函数。所以这就是我试图实现的目标:

包含我想实现的列和结果的电子表格片段

这两个函数的实际代码、之前列出的地理距离查询和我尝试创建的函数:

Public Function getDistance(latitude1, longitude1, latitude2, longitude2)
earth_radius = 6371
Pi = 3.14159265
deg2rad = Pi / 180

dLat = deg2rad * (latitude2 - latitude1)
dLon = deg2rad * (longitude2 - longitude1)

a = Sin(dLat / 2) * Sin(dLat / 2) + Cos(deg2rad * latitude1) * Cos(deg2rad * latitude2) * Sin(dLon / 2) * Sin(dLon / 2)
c = 2 * WorksheetFunction.Asin(Sqr(a))

d = earth_radius * c

getDistance = d

End Function

Function findCloseStores(basesitelat As Double, basesitelong As Double, storeRange As Range)
    Dim xResult As String
    xResult = ""
    Dim rw As Range
    Dim worker As Double
    For Each rw In storeRange.Rows
        worker = getDistance(basesitelat, storeRange.Cells(rw.Row, 2), basesitelong, storeRange.Cells(rw.Row, 3))
        If worker <= 9.77 Then
            xResult = xResult & "," & storeRange.Cells(rw.Row, 1)
        End If
    Next rw
    findCloseStores = xResult
End Function

我实际得到的结果只是空白。它正在处理我给它的函数,但它没有读取正确的内容/我在 findCloseStores 函数中写错了什么,导致它认为没有满足任何参数。

知道我在 findCloseStores 函数中做错了什么吗?

答案1

您说得对,这是一个嵌套循环。概括来说,它可以像这样:对于每个 A,对于每个 B,如果从 A 到 B 的 getDistance 较短,则将 B 添加到列表中,然后是 B,保存列表,然后是 A。

相关内容