Patrice T Ответов: 2

Нужна помощь по созданию пользовательской функции для excel 2003


Привет ребята,
Сегодня я прошу вашей помощи.
Мне нужно создать пользовательскую функцию в VBA6 для Excel 2003.
Моя проблема в том, что мне нужно передать 2 списка того же размера, что и параметры 3 и 4. У меня есть этот код:
function MyFunc(P1, P2, P3 As Range, P4 As Range) As Long
    ...

Из камеры я могу назвать это как =MyFunc("Alpha", 123, A1:A3, {1,2,3})- пока все идет хорошо.

Проблема в том, что мне также нужны списки как {2, B1*2, C1}, и там я застрял. Мои списки должны быть смесью ссылок на ячейки, числовых констант и формул.Я не могу использовать ячейки для построения списков в виде диапазонов ячеек.

Как бы вы поступили ?
Должен ли я использовать ParamArray ?

Что я уже пробовал:

Погуглил много, но ничего интересного не нашел.

Maciej Los

Какой список должен быть {2, B1*2, C1}- первый или второй? Почему первым аргументом функции является строковый тип данных, если функция должна возвращать длинный тип данных?
Всегда ли количество элементов для lis1 и list2 одинаково?

Patrice T

Нашел решение с помощью ParamArray.
Параметры 1 и 2-это то, что они есть, потому что это необходимо, и функция возвращает числовое значение, поэтому длинный тип данных.

Maciej Los

Итак, если вы хотите передать 2 списка (функция принимает только один аргумент ParamArray), то вы должны знать количество аргументов и порядок их следования. Я прав? Вас интересует другое решение?

Patrice T

Нет, спасибо, это решение удовлетворит все мои потребности.

Maciej Los

Я бы предложил поделиться вашим решением из-за того, что кто-то другой может столкнуться с той же проблемой... Затем отметьте его как ответ, чтобы удалить свой вопрос из списка без ответа.

Patrice T

Мое решение довольно специфично.

Maciej Los

Согласитесь, но вам не обязательно публиковать всю функцию целиком. Вы должны объяснить, как обойти такую проблему.

2 Ответов

Рейтинг:
8

Maciej Los

Что касается ParamArray... Да, это хороший способ решить проблему с помощью ParamArray когда число параматеров в неизвестности. Обратите внимание, что вы можете использовать только один ParamArray параметр в функции. Таким образом, в вашем случае вы теряете возможность пройти два списка.

Если количество элементов в обоих списках всегда одинаково, вы можете определить функцию следующим образом:

Function MyFunc(ByVal a As String, ByVal b As Long, _
       ByVal x1 As Range, ByVal y1 As Range, ByVal z1 As Range, _
       ByVal x2 As Range, ByVal y2 As Range, ByVal z2 As Range) As Long
    'body of function
End Function


Это обычная практика. Взгляните на Линейная функция[^] в MS Excel.

К сожалению, нет никакого способа (насколько мне известно) передать определяемый пользователем тип (UDT) функции рабочего листа:
Function MyFunc(ByVal a As String, ByVal b As Long, _
       ByVal x1 As MyPoint, ByVal x2 As MyPoint) As Long
    'body of function
End Function

где MyPoint это UDT (структура, класс и т. д.)


Рейтинг:
0

Mehdi Gholam

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

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

Короче говоря: создайте больше столбцов в качестве промежуточных значений.


Patrice T

Хорошо, если я хорошо понимаю, мое решение-ParamArray с переменным количеством параметров, но без списка параметров.