Ошибка значения при использовании UBound для ParamArray - PullRequest
0 голосов
/ 03 января 2019

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

Public Function PassArray(Longitude As Double, Latitude As Double, ParamArray varValues() As Variant) As Double
    Dim arr() As Variant
    Dim x As Long
    For x = 1 To UBound(varValues(0), 1)
        ReDim Preserve arr(x)
        arr(UBound(arr)) = Sqr((Longitude - varValues(0)(x, 1)) ^ 2 + (Latitude - varValues(0)(x, 2)) ^ 2)
    Next x
    PassArray = WorksheetFunction.Min(arr)

Я получил ошибку #Value!, когда пытался использовать эту функцию.Я проверил каждый шаг, и кажется, что UBound(varValues(0), 1) вызывает проблему.Когда я пытаюсь UBound(varValues), он возвращает 0, что, я полагаю, является верхней границей первого измерения массива параметров?

Я не могу понять, почему UBound(varValues(0), 1) не будет работать.Я думал, что он должен вернуть номер последней строки моего массива долготы и широты.

1 Ответ

0 голосов
/ 04 января 2019

Рассмотрите комментарий @Mathieu Guindon и продолжайте в том же духе:

Option Explicit

'ASSUMPTION: coordinatesArray is a 2D array with rows in dimension 1 and columns in dimension 2.
Public Function PassArray(longitude As Double, latitude As Double, coordinatesArray As Variant) As Double
    Dim rowLowerBound As Long
    Dim rowUpperBound As Long
    Dim x As Long

    'We're looking at coordinatesArray's first dimension (rows).
    'Let's consider both the lower and upper bounds, so as to adapt to the
    'configuration of coordinatesArray.
    rowLowerBound = LBound(coordinatesArray, 1)
    rowUpperBound = UBound(coordinatesArray, 1)

    'Dim arr upfront; this will be way faster than redimming within the loop.
    ReDim arr(rowLowerBound To rowUpperBound) As Double

    For x = rowLowerBound To rowUpperBound
       'Your calculations go here.
       'You can access coordinatesArray elements like so:
       'coordinatesArray(x, 1) for row x, column 1, and
       'coordinatesArray(x, 2) for row x, column 2.
       arr(x) = Sqr((longitude - coordinatesArray(x, 1)) ^ 2 + (latitude - coordinatesArray(x, 2)) ^ 2)
    Next x

    'Note that Application.WorksheetFunction.Min doesn't seem to care
    'whether arr is zero, one or n-based.
    PassArray = Application.WorksheetFunction.Min(arr)
End Function

Обратите внимание, что я не могу поручиться за ваш расчет расстояния;может работать для декартовых координат, но не для долготы / широты.

...