доступ к отдельным элементам массива в функции VBA - PullRequest
2 голосов
/ 05 мая 2020

VBA newb ie здесь. Я пытаюсь передать массив ( это stati c, но, пожалуйста, ответьте также на динамический c диапазон ) функции. Затем назначьте отдельные элементы массива уникальным переменным и используйте эти переменные в пользовательской формуле. Я просто просмотрел и написал код, но продолжаю получать #VALUE! ошибка. Суть кода ниже:

Public Function mytest(ByRef arr1 As Range)
Dim A As Double
Dim B As Double

A = arr1(0)
B = arr1(1)

mytest = A + B 'The actual formula is a bit more complicated than simple addition
End Function

Я не уверен, что я вообще делаю не так. Если у кого-то есть решение, не могли бы вы объяснить, почему оно тоже работает. Я ценю любую помощь, которую могу получить. Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 05 мая 2020

Как указал Коулман, диапазон не является массивом, рассмотрим:

Public Function mytest(ByRef arr1 As Range)
    Dim A As Double
    Dim B As Double

    A = arr1(1, 1)
    B = arr1(2, 1)

    mytest = A + B 'The actual formula is a bit more complicated than simple addition
End Function

enter image description here

ПРИМЕЧАНИЕ:

  • мы обрабатываем Range аналогично массиву
  • он двумерный
  • это 1 на основе
  • если вы имеете дело только со значением Range's, вы можете создать внутренний массив в своей функции, который напрямую сопоставляется с переданным Range.
  • , если Range действительно является динамическим c, (как диапазон разлива) тогда все, что вам нужно передать, это ячейку привязки.
2 голосов
/ 05 мая 2020

Вопрос не в опубликованном вами коде, а в вызывающей его процедуре. Здесь вызывающая процедура сначала присваивает значения ячейкам на листе (для целей тестирования), затем передает диапазон функции, которая извлекает значения в массив, а затем использует этот массив для вычисления возвращаемого значения.

Private Sub TestmyTest()

    Dim Rng1 As Range

    Cells(1, "A").Value = 3.14
    Cells(2, "A").Value = 3
    Set Rng1 = Range("A1:A2")

    Debug.Print myTest(Rng1)
End Sub

Function myTest(Rng1 As Range) As Double
    ' procedures are 'Public' unless declared as 'Private'
    ' Therefore only declare "Private" or nothing
    ' Arguments are passed ByRef unless they are declared as 'ByVal'
    ' Therefore I recommend to omit "ByRef"

    Dim Arr As Variant
    Dim A As Double
    Dim B As Double

    ' this creates a 1-based 3-D array of 2 row and 1 column
    Arr = Rng1.Value

    A = Arr(1, 1)
    B = Arr(2, 1)

    myTest = A + B 'The actual formula is a bit more complicated than simple addition
End Function
2 голосов
/ 05 мая 2020

Кажется, вы пытаетесь использовать диапазон листа как массив, отсчитываемый от 0. На самом деле это не имеет смысла, хотя, используя свойство Cells диапазона (которое вы фактически пытаетесь сделать неявно), вы можете приблизиться:

Public Function mytest(arr1 As Range)
    Dim A As Double
    Dim B As Double

    A = arr1.Cells(1)
    B = arr1.Cells(2)

    mytest = A + B 'The actual formula is a bit more complicated than simple addition
End Function

В приведенном выше коде вы можете отбросить Cells(), поскольку здесь оно будет работать как свойство по умолчанию, но наиболее опытные программисты VBA любят явно указывать, какое свойство они используют.

Это будет более или менее работать для одномерных диапазонов, но может работать не так, как ожидалось с 2-х мерными диапазонами. Cells принимает до 2 индексов, и в целом я думаю, что код будет более ясным, если вы явно укажете полные индексы (например, A = arr1.Cells(1,1) и B = arr1.Cells(2,1)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...