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

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

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

как вариант. но интересно, можно ли как-то решить проблему по скорости, ведь внутренние функции excel не вызывают такой задержки
...
Рейтинг: 0 / 0
Function (VBA) - расчет
    #37919667
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Function (VBA) - расчет
    #37919744
skleppi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

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

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

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

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

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

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

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

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

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

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


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