Я ломал голову над тем, чтобы понять, как встроить функцию в цикл для каждого цикла, чтобы выполнить одинаковую проверку для каждого результата и добавить его в список, если он соответствует критериям.

Таким образом, базовая функция, которую я использую, захватывает 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 км (результат getDistance).

У меня есть второй блок кода из extensionoffice, который, кажется, близок, так как это многопараметрический 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 в цикл. Я знаю, что должен вызывать функцию 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 ответ1

0

Вы правы, что это вложенный цикл. В общих чертах, это может выглядеть так: для каждого A, для каждого B, если getDistance от A до B короткое, то добавьте B в список, затем B, сохраните список, затем A.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .