Ошибка значения при использовании UBound для ParamArray
Я пытаюсь написать функцию, которая вычисляет минимальное расстояние от одного почтового индекса до другого. Функция должна принимать долготу и широту одного почтового индекса, а затем двумерный массив со всей информацией о долготе и широте почтовых индексов. Вот функция, которую я написал:
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 ответ
Посмотрите комментарий @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
Обратите внимание, что я не могу поручиться за ваш расчет расстояния; может работать для декартовых координат, но не для долготы / широты.