Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Ускорение Udf / 23 сообщений из 23, страница 1 из 1
27.08.2018, 13:27
    #39693683
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
Есть 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
27.08.2018, 13:35
    #39693695
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
В данном случае можно ускорить, если забрать в один прием нужные данные в массив и обрабатывать там, а не дергать Cells в цикле.

Кроме того, если хорошо подумать, то тоже можно ускорить.
Например результат вот этого условия как-то изменится, если проверить его 8 раз вместо одного?
maxim863
Код: vbnet
1.
If Diapozon.Value = Cells(31, 3).Value Then
...
Рейтинг: 0 / 0
27.08.2018, 13:39
    #39693697
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
Сам Diapozon.Value нужно тоже присвоить переменной, а не дергать его с листа каждый раз.
Любое обращение к листу работает медленно, количество обращений нужно сводить к минимуму
...
Рейтинг: 0 / 0
27.08.2018, 16:58
    #39693853
ldfanate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
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
27.08.2018, 17:02
    #39693856
ldfanate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
кстати cells в вашем алгоритме берётся с активного листа - т.е. на двух соседних листах формула работать будет по разному, и при переключении между листами тоже.
это так и задумано?

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

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

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

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



Прочитайте внимательно, что Вам пишут.
...
Рейтинг: 0 / 0
29.08.2018, 11:53
    #39694829
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
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
29.08.2018, 12:01
    #39694839
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
maxim863по тому же принципупо какому по тому же? сравниmaxim863
Код: vbnet
1.
Cells(31, 3).Value

maxim863
Код: vbnet
1.
ws.Cells(101, 42 + (m * 21)).Value
...
Рейтинг: 0 / 0
29.08.2018, 12:11
    #39694852
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
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
29.08.2018, 12:12
    #39694854
maxim863
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
Shocker.Pro,
По одинаковому принципу-на каждом листе Udf
...
Рейтинг: 0 / 0
29.08.2018, 12:39
    #39694881
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение Udf
maxim863Shocker.Pro,
По одинаковому принципу-на каждом листе Udf

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

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

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

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

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

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


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