powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение Udf
23 сообщений из 23, страница 1 из 1
Ускорение Udf
    #39693683
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть UDF , которая работает хорошо , но медленно .
Я знаю как ускорять Sub :
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Подойдет ли это для Function ?
Если нет , то как ускорить Udf ?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Function Fav(Diapozon As Range) As Long
Application.Volatile

Dim n As Long

For x = 1 To 4
   For y = 0 To 1
   
     If Diapozon.Value = Cells(31, 3).Value Then
      n = 0
      Exit For
     End If
     
       If Diapozon.Value = Cells(x + 29, y + 10).Value Or Diapozon.Offset(0, 1).Value = Cells(x + 29, y + 10).Value Then
          n = 1
       End If
       
   Next y
Next x

Fav = n

End Function
...
Рейтинг: 0 / 0
Ускорение Udf
    #39693695
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае можно ускорить, если забрать в один прием нужные данные в массив и обрабатывать там, а не дергать Cells в цикле.

Кроме того, если хорошо подумать, то тоже можно ускорить.
Например результат вот этого условия как-то изменится, если проверить его 8 раз вместо одного?
maxim863
Код: vbnet
1.
If Diapozon.Value = Cells(31, 3).Value Then
...
Рейтинг: 0 / 0
Ускорение Udf
    #39693697
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам Diapozon.Value нужно тоже присвоить переменной, а не дергать его с листа каждый раз.
Любое обращение к листу работает медленно, количество обращений нужно сводить к минимуму
...
Рейтинг: 0 / 0
Ускорение Udf
    #39693853
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) поднять выше цикла - зачем крутить 4х2=8 раз одну и ту же статичную проверку?
If Diapozon.Value = Cells(31, 3).Value Then
n = 0
Exit For
End If

2) неэффективный (медленный) поячеечный поиск совпадения в цикле - заменить на два программных вызова функции рабочего листа ЕОШИБКА(ПОИСКПОЗ)
If Diapozon.Value = Cells(x + 29, y + 10).Value Or Diapozon.Offset(0, 1).Value = Cells(x + 29, y + 10).Value Then
n = 1
End If

3) отказаться от программной функции рабочего листа, и пп.1-2 реализовать в виде обычных формул на листе - это самый быстрый по скорости способ.
...
Рейтинг: 0 / 0
Ускорение Udf
    #39693856
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати cells в вашем алгоритме берётся с активного листа - т.е. на двух соседних листах формула работать будет по разному, и при переключении между листами тоже.
это так и задумано?

м.б. всётаки надо Diapozon.parent.cells( ... ) везде - чтобы подсчёт в формуле шёл ровно по тому листу, на котором ваш Diapozon ?
...
Рейтинг: 0 / 0
Ускорение Udf
    #39693920
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
предлагал уже...
21649253
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694153
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,
Это специально , потому что у меня 14 листов с этой функцией . Каждый лист должен вычисляться отдельно .
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694155
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,
Спасибо , так и сделаю
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694432
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто специально , потому что у меня 14 листов с этой функцией . Каждый лист должен вычисляться отдельно.

Так в итоге все 14 листов будут вычисляться ровно по тому единственному листу, на котором ты в данный момент стоишь.

Просто ты не видишь содержимое неактивных листов, но они всёравно пересчитаются. Стяни формулами результат с тех 14ти листов на 1 лист (или окна в экселе расположи "плиткой" чтобы сразу несколько листов видеть), - и увидишь, что формула на всех 14ти посчитает чёрти-что, т.к. Cells.value будут все с текущего листа (ActiveSheet) браться.

Если хочешь чтобы каждая считала по тому листу, который подставляется во входной параметр Diapazon, нужно именно явно указывать Diapozon.parent.cells(...).value.
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694786
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ldfanate,
Так я же специально для этого использую
Код: vbnet
1.
Application.Volatile
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694791
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863ldfanate,
Так я же специально для этого использую
Код: vbnet
1.
Application.Volatile



Прочитайте внимательно, что Вам пишут.
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694829
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy,
Стоп ! Я не то написал . Конкретно эту функцию я использовать не буду , ее заменю функциями Excel . Но у меня есть 2 проги , работающие по тому же принципу . И они вроде норм работают .
Код: 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.
Function дляппр15(Diapozon As Range) As Long
'для ситуации
Application.Volatile
Dim n As Long
Dim C As Range
Dim m As Long
Dim ws As Worksheet

Set ws = Application.Caller.Worksheet

m = -1
n = 0
For Each C In Diapozon.Rows

If C.Value = 1 Then
m = m + 1
   If ws.Cells(101, 42 + (m * 21)).Value = 1 And C.Offset(0, 1).Value = 1 Then
     n = n + 1
   End If
End If
Next C

дляппр15 = n
End Function




Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Function дляппр15(Diapozon As Range) As Long
'для ситуации
Application.Volatile
Dim n As Long
Dim C As Range
Dim m As Long

n = 0
For Each C In Diapozon.Rows

   If C.Value = 1 And C.Offset(0, 1).Value = 1 Then
     n = n + 1
   End If

Next C

дляппр15 = n
End Function
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694839
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863по тому же принципупо какому по тому же? сравниmaxim863
Код: vbnet
1.
Cells(31, 3).Value

maxim863
Код: vbnet
1.
ws.Cells(101, 42 + (m * 21)).Value
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694852
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
в этой я не сомневаюсь . А вот во второй ,после ваших замечаний , начинаю сомневаться .
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Function дляппр15(Diapozon As Range) As Long
'для ситуации
Application.Volatile
Dim n As Long
Dim C As Range
Dim m As Long

n = 0
For Each C In Diapozon.Rows

   If C.Value = 1 And C.Offset(0, 1).Value = 1 Then
     n = n + 1
   End If

Next C

дляппр15 = n
End Function
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694854
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
По одинаковому принципу-на каждом листе Udf
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694881
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863Shocker.Pro,
По одинаковому принципу-на каждом листе Udf

Если внимательно перечитать весь топик, то можно найти ответы на Ваши вопросы и даже больше.
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694884
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy,
А если не перечитывать ?
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694890
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863iMrTidy,
А если не перечитывать ?

Полагаю, если нет желания перечитывать, то не стоило и просить о помощи.
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694896
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863в этой я не сомневаюсьв этой всё делается относительно Diapozon, следовательно лист будет нужный.

и, блин, "диапАзон"!!!!
у меня уже глаз выпал это читать которую неделю
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694897
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy,
Никакой просьбы и не было
...
Рейтинг: 0 / 0
Ускорение Udf
    #39694909
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863iMrTidy,
Никакой просьбы и не было

Так Вы сюда пишете "так поговорить"?

maxim863Подойдет ли это для Function ?
Если нет , то как ускорить Udf ?
Т.е. вот это просьбой о помощи не считается?
...
Рейтинг: 0 / 0
Ускорение Udf
    #39695373
maxim863
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy,
В этом топике был только один адекватный ответ ,который я и использовал (большое спасибо автору)
Все остальное - переливание воды , в основном исходящее от вас
И просьбу от вопроса вы отличить ,видимо, не в состоянии
...
Рейтинг: 0 / 0
Ускорение Udf
    #39695381
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxim863iMrTidy,
В этом топике был только один адекватный ответ ,который я и использовал (большое спасибо автору)
Все остальное - переливание воды , в основном исходящее от вас
И просьбу от вопроса вы отличить ,видимо, не в состоянии

Прекрасно, в будущем Вы знаете, что мои сообщения лучше игнорировать. И нет, я не способен понять разницу, я ж неадекватный.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение Udf
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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