2014-07-12 3 views
-2

Я пытаюсь передать массив в UDF, чтобы избежать массивного дублирования кода. В качестве простого примера:Передача массивов или диапазонов в VBA udf

function USERFUNC1(inp as variant) 
    Dim array_size As Integer 
    dim i as integer 
    dim values as double 
    array_size = WorksheetFunction.CountA(inp) 

    for i = 1 to array_size 
       values = values + inp(i) 
    Next i 
       USERFUNC1 = values 
    End function 


    function USERFUNC2(input1 as variant, input2 as variant) 
    Dim array_size As Integer 
    dim i as integer 
    dim values as double 
    array_size = WorksheetFunction.CountA(input1) 
    redim nested_array(array_size) 

    for i = 1 to array_size 
       nested_array(i) = input1(i)+input2(i) 
    Next i 

       USERFUNC2= USERFUNC1(nested_array) 
    End function 

В примере я создать у меня есть вложенная массив, который я передаю внутренне ОДС. Однако при запуске это приводит к ошибке по ошибке. Я уверен, что это может быть сделано, но я, кажется, что-то отсутствует

РЕДАКТИРОВАНИЕ

Кажется, что я написал вызвал замешательство, по существу, у меня есть ряд функций, выше, чтобы продемонстрировать идею ,

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

Я мог бы это сделать, однако сделать вторую функцию сложнее отлаживать, поскольку я больше не могу быть уверенным, что вложенный расчет выполняет правильный расчет, а мне нужно проверить все это. Пока у меня около 250 строк кода в первой и 300 строк второй и во втором (фазовое равновесие) мне нужно выполнить первый (fugacity) 4 раза.

+0

Массивы с нуля по умолчанию, так что вы получите сообщение об ошибке, когда я> ARRAY_SIZE-1. Кроме того, используйте UBound (inp), чтобы получить размер. –

+0

Вы хотите передать массив или диапазон? Мое понимание вашего вопроса состоит в том, что вы хотите передать массив ... –

+0

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

ответ

1

Если вы хотите USERFUNC1 возвращает массив значений в диапазоне InP, то просто:

function USERFUNC1(inp as Range) as Variant 
    USERFUNC1 = inp 
End function 

Это будет 1 на основе двумерного массива, где первое измерение представляет строки, а второй размер столбцов в исходном диапазоне inp.

Я не уверен, что ваша конечная цель, но вы можете даже не нужно USERFUNC1

+0

Привет Рон, Спасибо за ваш ответ. Пример, который я показал, ОЧЕНЬ прост по сравнению с тем, что я пишу. Это инженерное приложение, в котором я вычисляю некоторые промежуточные значения и передаю их основной функции. – user2978403

+0

@ user2978403 Факт остается фактом: если ваша цель состоит в том, чтобы поместить диапазон в массив, это так же просто, как array = range. Затем вы можете обработать массив в своих подпрограммах VBA (и намного быстрее, чем перемещение назад и вперед на рабочий лист). Если диапазоны не смежны, вам может потребоваться использовать несколько массивов (по одному для каждой области), но это довольно просто. –

Смежные вопросы