Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Function (VBA) - расчет / 22 сообщений из 22, страница 1 из 1
16.08.2012, 14:43
    #37919486
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Всем добрый день!

Вопрос по функциям в VBA:

есть пользовательская функция, которая используется в книге много-много раз.

Так вот, эта функция пересчитывается каждый раз для всех ячеек. И занимает это порядка 10 секунд.
Можно ли как-то сократить это время?
Ведь при работе с книгой при любом изменении начинается этот длительный пересчет формул....


Привожу текст функции:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Function TST (type As String, d_excel As Double) As Double


    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    

type_value =type
d_value = d_excel

last_row = Worksheets("source_sheet").UsedRange.Rows.Count

type_array = Worksheets("source_sheet").Range("A6:A" & CStr(last_row)).Value    '<----- записываю все в массив, чтобы было быстрее
coef_a_array = Worksheets("source_sheet").Range("E6:E" & CStr(last_row)).Value
coef_B_array = Worksheets("source_sheet").Range("F6:F" & CStr(last_row)).Value



For i = 1 To UBound(type_array)
    If array(i, 1) = type_value Then
        coef_a = coef_a_array(i, 1)   '<----- для каждого типа свои коэф-ты
        coef_b = coef_B_array(i, 1)
        Exit For
    End If
Next


TST = Application.WorksheetFunction.Ln(d_value) * coef_a + coef_b


    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
    End With

End Function
...
Рейтинг: 0 / 0
16.08.2012, 15:24
    #37919588
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Уберите её из формул и повесьте на кнопку. Саму кнопку делайте неактивной по нажатию (запуску пересчёта), а активной - по любому изменению в диапазоне (worksheet_change, проверяйте target), который влияет на результат расчёта.
...
Рейтинг: 0 / 0
16.08.2012, 15:26
    #37919591
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Странная у вас функция, дублирующая имеющийся функционал... Нельзя было воспользоваться формулами листа - ВПР() или массивной ИНДЕКС(ПОИСКПОЗ(... ?
...
Рейтинг: 0 / 0
16.08.2012, 15:31
    #37919603
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
AndreTM,

ВПР тут неподойдет, значение d_excel - это число, его нельзя найти в таблице
...
Рейтинг: 0 / 0
16.08.2012, 15:33
    #37919607
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Akina,

как вариант. но интересно, можно ли как-то решить проблему по скорости, ведь внутренние функции excel не вызывают такой задержки
...
Рейтинг: 0 / 0
16.08.2012, 16:10
    #37919667
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
skleppiВПР тут неподойдет, значение d_excel - это число, его нельзя найти в таблицеВ смысле "нельзя найти"? Вы же его в функцию откуда-то передаёте?
Может, вы не так поняли?
Если в A1 находится type , в B1 - d_excel , в C1, например, пишем:
Код: vbnet
1.
=LN(B1)*ВПР(A1;source_sheet!$A$6:$F$1000;5;ЛОЖЬ)+ВПР(A1;source_sheet!$A$6:$F$1000;6;ЛОЖЬ)

?
...
Рейтинг: 0 / 0
16.08.2012, 16:43
    #37919744
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
AndreTM,

понятно)) да, можно так, но есть желание упростить эту громоздкую формулу
...
Рейтинг: 0 / 0
16.08.2012, 16:47
    #37919766
Serge 007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
skleppiесть желание упростить эту громоздкую формулу
В Вашем коде 798 знаков, в формуле AndreTM - 89

Вот так упрощение
...
Рейтинг: 0 / 0
16.08.2012, 16:56
    #37919796
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Serge 007,

ну упростить с точки зрения использования в книге
...
Рейтинг: 0 / 0
16.08.2012, 17:02
    #37919807
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Упростить чем? Дополнительным распределением памяти под массивы? Затратами на заполнение этих массивов? Прямым поиском в неотсортированном массиве?
Тем более, что, как и говорилось, можно воспользоваться ПОИСКПОЗ() , а дальше - работать с индексами строк/столбцов.

Впрочем, если действительно хочется собственный алгоритм... Можно сделать так:
- При заполнении source_sheet - сортируйте табличку по type . Еще лучше - сделать уникальные числовые коды для символьных type , и сортировать уже по ним.
- Массив type-coef можно (нужно!) хранить глобально в процессе работы, а не считывать каждый раз. (Пере)создавать его надо только при запуске и после изменений на листе source_sheet .
- Поиск значения в отсортированном массиве проще выполнять методом половинного деления интервала, а не последовательным перебором.
- И вообще, вместо массива можно создавать и хранить коллекцию, а при наличии уникальных идентификаторов - еще и в виде сбалансированного дерева. Соответственно, и поиск выполнять методами самого класса.
...
Рейтинг: 0 / 0
16.08.2012, 17:13
    #37919831
PlanB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
упростить впр макросом.. поржал отдуши
...
Рейтинг: 0 / 0
16.08.2012, 17:19
    #37919842
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
PlanB, угу, так смешно
...
Рейтинг: 0 / 0
16.08.2012, 17:21
    #37919848
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
AndreTM, спасибо за развернутый ответ, попробую поменять свой алгоритм
...
Рейтинг: 0 / 0
16.08.2012, 17:28
    #37919859
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
PlanB , не, ну смысл имеет. Когда формула должна применяться в любых случайных местах листа с расчетами (т.е. простым копированием - надоест), а формул много. Когда диапазон "справочника" динамический. Хотя именованные диапазоны никто не отменял. Когда хочется сэкономить объем файла (то, что ТС подразумевала под "громоздкостью"). Когда, наконец, хочется просто покреативить
...
Рейтинг: 0 / 0
16.08.2012, 17:28
    #37919860
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
> упростить с точки зрения использования в книге

Если функция используется в одном столбце, создайте имя-функцию из формулы AndreTM.
Если в разных местах, то "переведите" формулу на VBA.
...
Рейтинг: 0 / 0
16.08.2012, 17:50
    #37919887
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
Но вообще странно, что при ЛЮБОМ изменении начинается пересчёт... ибо я в упор не вижу Application.Volatile
...
Рейтинг: 0 / 0
16.08.2012, 18:00
    #37919903
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
AndreTM,

а как поможет индексирование, если всё равно поиск идет по названию?
...
Рейтинг: 0 / 0
16.08.2012, 18:49
    #37919984
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
skleppi,

Так ведь каждый индекс будет соответствовать одному конкретному "названию"

И вообще-то, String тоже можно отсортировать, ведь суть-то "половинного интервала" только в том, что мы сравниваем искомое со значением в списке, а для отсортированного списка - мы однозначно можем сделать вывод - передвигаться нам для продолжения поиска к предыдущему интервалу, или к следующему. Просто с числами - проще, быстрее и понятнее.

Да и просто - дайте уж вашу source_sheet , и покажу, как и что можно сделать...
...
Рейтинг: 0 / 0
16.08.2012, 18:56
    #37919992
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
skleppiа как поможет индексирование, если всё равно поиск идет по названию?Раз у вас source_sheet - некий "справочник", то зачем вам на рабочем(их) листе(ах) использовать именно названия, а не их коды? Всё же просто - к справочнику привязывается List/Combo, и юзер выбирает значение из списка. При этом юзеру демонстрируется "наименование", а реально на лист пишется код/индекс. Ну и наименование, если надо...
...
Рейтинг: 0 / 0
17.08.2012, 11:05
    #37920476
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
AndreTM,

вот такой source_sheet
...
Рейтинг: 0 / 0
17.08.2012, 11:06
    #37920477
skleppi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
случайно отправила без файла))
...
Рейтинг: 0 / 0
17.08.2012, 18:56
    #37921313
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Function (VBA) - расчет
А зачем вам одинаковые type с разными коэффициентами? - ведь вы ищете только первые в списке коэффициентов...
А если, действительно, коэффициенты множественные - то по какому же признаку определять, которые из коэффициентов использовать?
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Function (VBA) - расчет / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]