Создание своей функции в EXCEL

Программирование на Visual Basic for Applications
Romanaerl
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 09.10.2003 (Чт) 13:21

Создание своей функции в EXCEL

Сообщение Romanaerl » 22.10.2003 (Ср) 13:38

Существует прайс-лист в оригинале занимающий от силы 500Кб, но в него в новой версии добавлены формулы. Так уж вышло, что формулы достаточно объемные и нужны в каждой строке... В результате файл расширился аж до 1500Кб. Есть ли возможность создать свою функцию - что бы она была универсальная для этих вычислений, и соответственно вызывалась в каждой строке меню _маленькой_ формулой, или есть ли какие либо другие способы обойти эту проблему?

Заранее благодарю.
я не программер - я только учусь :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.10.2003 (Чт) 8:47

Вставляшь модуль, создаёшь в нём
Код: Выделить всё
function MyFunc(params)
, и потом в ячейках пишешь
Код: Выделить всё
=MyFunc(a5:b10)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Romanaerl
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 09.10.2003 (Чт) 13:21

Сообщение Romanaerl » 27.10.2003 (Пн) 17:00

А как это сделать программно?
Передаю все команды к дейсвию из Фокс-Прошной проги, в частности - открываю несколько книг и запускаю макрос...
я не программер - я только учусь :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.10.2003 (Вт) 9:51

Ты не понял...
Функции листа вызываются с листа. Написанной функцией ты должен заменить имеющиеся формулы. Это делается единожды, потом эксель сам разберётся.
Чтобы автоматически изменить формулы в диапазоне, создай другую процедурину, в которой перебирай целевой диапазон и для каждой ячейки изменяй проперть formula. Пиши в неё выражение типа "=MyFunc(arglist)".
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Romanaerl
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 09.10.2003 (Чт) 13:21

Сообщение Romanaerl » 28.10.2003 (Вт) 12:19

Объясню ситацию подробнее:
Формула на данный момент - высчитавает значение по следующему алгоритму (если ето можно так назвать):
Код: Выделить всё
=ОКРУГЛ(ЕСЛИ(И((G4>=200000);(G4<10000000));E21-E21/100*10;" ")&ЕСЛИ(И((G4>=100000);(G4<200000));E21-E21/100*9;" ")&ЕСЛИ(И((G4>=50000);(G4<100000));E21-E21/100*8;" ")&ЕСЛИ(И((G4>=30000);(G4<50000));E21-E21/100*6;" ")&ЕСЛИ(И((G4>=20000);(G4<30000));E21-E21/100*4;" ")&ЕСЛИ(И((G4>=10000);(G4<20000));E21-E21/100*3;" ")&ЕСЛИ(И((G4>=5000);(G4<10000));E21-E21/100*2;" ")&ЕСЛИ(G4<5000;E21;" ");2)


Это выражение вычисляет цену со скидкой в зависимости от общей суммы заказа. E21 - меняется для каждой строки (E22, E23 ... EN)

Но проблема в том, что количество ЕСЛИ зависит от количества скидок, которые знает только фокспрошная прога. Задача в том, чтобы программно, каждый раз во время генерации прайса - менять вышеупомянутую формулу, причем не на предмет ячеек, а на предмет количества и качества (сумма и скидка) этих самых ЕСЛИ...

Стало быть хочется через саму VBA каждый раз создавать новую универсальную функцию, такую, чтобы она подходила к любой ячейке, к любой строке...
я не программер - я только учусь :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.10.2003 (Вт) 16:43

Ну и в чём трабла?
Пиши функцию на VB...

Передавай в неё массив границ. К примеру, {10000000,200000,100000,50000,30000,20000,10000,5000,0}. Потом пиши цикл for i=1 lbound(arr) to ubound(arr). Проверяй, в какой диапазон попадает, и умножай/дели на что там хочешь...
А если размеры интервалов одинаковые, юзай функцию partition.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Romanaerl
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 09.10.2003 (Чт) 13:21

Сообщение Romanaerl » 29.10.2003 (Ср) 11:56

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.10.2003 (Чт) 9:49

В каждой строке будет написано =MyFunc(G4, E21, 10000000,200000,100000,50000,30000,20000,10000,5000,0).
Имхо, это короче.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Romanaerl
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 09.10.2003 (Чт) 13:21

Сообщение Romanaerl » 30.10.2003 (Чт) 15:50

GSerg писал(а):В каждой строке будет написано =MyFunc(G4, E21, 10000000,200000,100000,50000,30000,20000,10000,5000,0).
Имхо, это короче.


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

Достаточно просто единожды расчитать коэффициент скидки в одной скрытой ячейке, а потом просто умножить на него значение цены в каждой строке. :))))))
я не программер - я только учусь :)


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList