我一直绞尽脑汁试图弄清楚如何在 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。