Передать диапазон в пользовательскую функцию из ячейки - PullRequest
3 голосов
/ 11 июня 2010

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


Public Function multByElement(range1 As String, range2 As String) As Variant
    Dim arr1() As Variant, arr2() As Variant
    arr1 = Range(range1).value
    arr2 = Range(range2).value
    If UBound(arr1) = UBound(arr2) Then
        Dim arrayA() As Variant
        ReDim arrayA(LBound(arr1) To UBound(arr1))
        For i = LBound(arr1) To UBound(arr1)
            arrayA(i) = arr1(i) * arr2(i)
        Next i
        multByElement = arrayA
    End If
End Function

Как видите, я пытаюсь передать строковое представление диапазонов.В отладчике я вижу, что они правильно переданы, и первая видимая проблема возникает, когда он пытается прочитать arr1 (i) и отображается как «индекс вне диапазона».Я также пытался передать сам диапазон (то есть range1 как Range ...), но безуспешно.

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

Кстати, формула вячейка выглядит следующим образом:

= AVERAGE (multByElement ("A1: A3", "B1: B3"))

или

= AVERAGE (multByElement ("MySheet1! A1: A3 "," My Sheet1! B1: B3 "))

, когда я вызываю его с другого листа.

1 Ответ

3 голосов
/ 11 июня 2010

Во-первых, посмотрите комментарий, который оставил Рему, так как это действительно то, что вы должны делать здесь. Вам вообще не нужен VBA для поэлементного умножения двух массивов.

Во-вторых, если вы хотите работать с диапазонами, вы можете сделать это, объявив аргументы вашей функции типа Range. Таким образом, вы могли бы иметь

Public Function multByElement(range1 As Range, range2 As Range)

и не нужно разрешать строки, чтобы ранжировать ссылки самостоятельно. Использование строк не позволяет Excel обновлять ссылки, когда все перемещается на вашем рабочем листе.

Наконец, причина, по которой ваша функция дает сбой так, как она это делает, заключается в том, что массив, который вы получаете, взяв 'Value' многосотового Range, является двумерным, и вам нужно получить доступ к его элементам с двумя индексами , Так как похоже, что вы собираетесь (поэлементно) умножить два вектора, вы должны сделать либо

        arrayA(i) = arr1(i,1) * arr2(i,1)

или

        arrayA(i) = arr1(1,i) * arr2(1,i)

в зависимости от того, какую ориентацию вы ожидали от вашего ввода. (Обратите внимание, что если вы делаете это с VBA, ориентация того, что концептуально является 1-D массивом, имеет значение, но если вы последуете совету Рему, приведенному выше, Excel будет делать правильные вещи независимо от того, передаете ли вы строки или столбцы, или ссылки на диапазон или литералы массива.)

Как эпилог, похоже, что вы не используете Option Explicit. Поищите в Google информацию о том, почему вы, вероятно, всегда хотите это делать.

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