команда Offset замедляет работу
aivella
Дата: Вторник, 07.04.2020, 12:39 |
Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
Добрый день! Есть такой код: [vba]Код
Dim z As Range For Each z In ActiveSheet.Range("E115:E155") If IsEmpty(z.Offset(0, 0)) Then z = z.Offset(0, -2) End If Next z
[/vba] И вот незадача, как только заданный массив (ActiveSheet.Range) превышает 40 строк, таблица тормозит, подвисает минуты на две. В идеале массив должен быть 300 строк (Е30:Е330). Есть ли варианты, как применять команду, не замедляя работу таблицы? Заранее спасибо! Елена.
Добрый день! Есть такой код: [vba]Код
Dim z As Range For Each z In ActiveSheet.Range("E115:E155") If IsEmpty(z.Offset(0, 0)) Then z = z.Offset(0, -2) End If Next z
[/vba] И вот незадача, как только заданный массив (ActiveSheet.Range) превышает 40 строк, таблица тормозит, подвисает минуты на две. В идеале массив должен быть 300 строк (Е30:Е330). Есть ли варианты, как применять команду, не замедляя работу таблицы? Заранее спасибо! Елена. aivella
Сообщение отредактировал Pelena - Вторник, 07.04.2020, 16:48
Ответить
Сообщение Добрый день! Есть такой код: [vba]Код
Dim z As Range For Each z In ActiveSheet.Range("E115:E155") If IsEmpty(z.Offset(0, 0)) Then z = z.Offset(0, -2) End If Next z
[/vba] И вот незадача, как только заданный массив (ActiveSheet.Range) превышает 40 строк, таблица тормозит, подвисает минуты на две. В идеале массив должен быть 300 строк (Е30:Е330). Есть ли варианты, как применять команду, не замедляя работу таблицы? Заранее спасибо! Елена. Автор - aivella Дата добавления - 07.04.2020 в 12:39
Pelena
Дата: Вторник, 07.04.2020, 13:05 |
Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19405
Репутация:
4555
±
Замечаний:
±
Excel 365 & Mac Excel
aivella , оформите код тегами с помощью кнопки # в режиме правки поста.Offset(0, 0) точно можно убрать. И да, менять параметр цикла z в цикле - плохая идея. Думаю, дело не в Offset
aivella , оформите код тегами с помощью кнопки # в режиме правки поста.Offset(0, 0) точно можно убрать. И да, менять параметр цикла z в цикле - плохая идея. Думаю, дело не в OffsetPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Ответить
Сообщение aivella , оформите код тегами с помощью кнопки # в режиме правки поста.Offset(0, 0) точно можно убрать. И да, менять параметр цикла z в цикле - плохая идея. Думаю, дело не в OffsetАвтор - Pelena Дата добавления - 07.04.2020 в 13:05
aivella
Дата: Вторник, 07.04.2020, 14:17 |
Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
Благодарю! Сообщение отредактировала. Если убрать Offset(0,0), то какой будет код? Спасибо еще раз!
Благодарю! Сообщение отредактировала. Если убрать Offset(0,0), то какой будет код? Спасибо еще раз! aivella
Ответить
Сообщение Благодарю! Сообщение отредактировала. Если убрать Offset(0,0), то какой будет код? Спасибо еще раз! Автор - aivella Дата добавления - 07.04.2020 в 14:17
Pelena
Дата: Вторник, 07.04.2020, 15:43 |
Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 19405
Репутация:
4555
±
Замечаний:
±
Excel 365 & Mac Excel
Сообщение отредактировала
не совсем) В режиме редактирования выделите код и нажмите кнопку с изображением # на панели инструментов. Потом сохраните изменения
Сообщение отредактировала
не совсем) В режиме редактирования выделите код и нажмите кнопку с изображением # на панели инструментов. Потом сохраните измененияPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Ответить
Сообщение Сообщение отредактировала
не совсем) В режиме редактирования выделите код и нажмите кнопку с изображением # на панели инструментов. Потом сохраните измененияАвтор - Pelena Дата добавления - 07.04.2020 в 15:43
aivella
Дата: Вторник, 07.04.2020, 16:28 |
Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
Пока попробовала вот-что: [vba]Код
Dim zelle As Range For Each z In ActiveSheet.Range("E150:E250") If IsEmpty(z.Value) = True Then z = z.Offset(0, -2) End If Next z
[/vba] Терпимо работает для интервала в 100 клеток. Больше - тормозит. Но это уже тоже облегчение.
Пока попробовала вот-что: [vba]Код
Dim zelle As Range For Each z In ActiveSheet.Range("E150:E250") If IsEmpty(z.Value) = True Then z = z.Offset(0, -2) End If Next z
[/vba] Терпимо работает для интервала в 100 клеток. Больше - тормозит. Но это уже тоже облегчение. aivella
Сообщение отредактировал Pelena - Вторник, 07.04.2020, 16:49
Ответить
Сообщение Пока попробовала вот-что: [vba]Код
Dim zelle As Range For Each z In ActiveSheet.Range("E150:E250") If IsEmpty(z.Value) = True Then z = z.Offset(0, -2) End If Next z
[/vba] Терпимо работает для интервала в 100 клеток. Больше - тормозит. Но это уже тоже облегчение. Автор - aivella Дата добавления - 07.04.2020 в 16:28
Hugo
Дата: Вторник, 07.04.2020, 18:47 |
Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация:
790
±
Замечаний:
0% ±
365
Отключите обновление экрана, и если Вам не нужно на изменение каждой ячейки где-то получать результат обсчёта этой ячейки формулами - то и пересчёт тоже есть смысл на время работы выключить. Например вот, кардинально выключаем всё: [vba]Код
Dim global_var_calc_state As Integer, global_var_calc_bfr_sv_state As Boolean Sub Kakoetonazvanie() Call uskorenie Dim zelle As Range For Each Z In ActiveSheet.Range("E150:E250") If IsEmpty(Z.Value) = True Then Z = Z.Offset(0, -2) End If Next Z Call neuskorenie End Sub Sub uskorenie() With Application global_var_calc_state = .Calculation global_var_calc_bfr_sv_state = .CalculateBeforeSave .Calculation = xlCalculationManual .ScreenUpdating = False .EnableEvents = False .DisplayStatusBar = False .DisplayAlerts = False End With End Sub Sub neuskorenie() With Application .Calculation = global_var_calc_state ' xlCalculationAutomatic .CalculateBeforeSave = global_var_calc_bfr_sv_state .ScreenUpdating = True .EnableEvents = True .DisplayStatusBar = True .DisplayAlerts = True End With End Sub
[/vba]
Отключите обновление экрана, и если Вам не нужно на изменение каждой ячейки где-то получать результат обсчёта этой ячейки формулами - то и пересчёт тоже есть смысл на время работы выключить. Например вот, кардинально выключаем всё: [vba]Код
Dim global_var_calc_state As Integer, global_var_calc_bfr_sv_state As Boolean Sub Kakoetonazvanie() Call uskorenie Dim zelle As Range For Each Z In ActiveSheet.Range("E150:E250") If IsEmpty(Z.Value) = True Then Z = Z.Offset(0, -2) End If Next Z Call neuskorenie End Sub Sub uskorenie() With Application global_var_calc_state = .Calculation global_var_calc_bfr_sv_state = .CalculateBeforeSave .Calculation = xlCalculationManual .ScreenUpdating = False .EnableEvents = False .DisplayStatusBar = False .DisplayAlerts = False End With End Sub Sub neuskorenie() With Application .Calculation = global_var_calc_state ' xlCalculationAutomatic .CalculateBeforeSave = global_var_calc_bfr_sv_state .ScreenUpdating = True .EnableEvents = True .DisplayStatusBar = True .DisplayAlerts = True End With End Sub
[/vba] Hugo
webmoney: E265281470651 Z422237915069 USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
Сообщение отредактировал Hugo - Вторник, 07.04.2020, 18:51
Ответить
Сообщение Отключите обновление экрана, и если Вам не нужно на изменение каждой ячейки где-то получать результат обсчёта этой ячейки формулами - то и пересчёт тоже есть смысл на время работы выключить. Например вот, кардинально выключаем всё: [vba]Код
Dim global_var_calc_state As Integer, global_var_calc_bfr_sv_state As Boolean Sub Kakoetonazvanie() Call uskorenie Dim zelle As Range For Each Z In ActiveSheet.Range("E150:E250") If IsEmpty(Z.Value) = True Then Z = Z.Offset(0, -2) End If Next Z Call neuskorenie End Sub Sub uskorenie() With Application global_var_calc_state = .Calculation global_var_calc_bfr_sv_state = .CalculateBeforeSave .Calculation = xlCalculationManual .ScreenUpdating = False .EnableEvents = False .DisplayStatusBar = False .DisplayAlerts = False End With End Sub Sub neuskorenie() With Application .Calculation = global_var_calc_state ' xlCalculationAutomatic .CalculateBeforeSave = global_var_calc_bfr_sv_state .ScreenUpdating = True .EnableEvents = True .DisplayStatusBar = True .DisplayAlerts = True End With End Sub
[/vba] Автор - Hugo Дата добавления - 07.04.2020 в 18:47
aivella
Дата: Вторник, 07.04.2020, 18:47 |
Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
не совсем) В режиме редактирования выделите код и нажмите кнопку с изображением # на панели инструментов. Потом сохраните изменения спасибо за дополнительную редакцию и пояснения! буду знать!
не совсем) В режиме редактирования выделите код и нажмите кнопку с изображением # на панели инструментов. Потом сохраните изменения спасибо за дополнительную редакцию и пояснения! буду знать! aivella
Сообщение отредактировал aivella - Вторник, 07.04.2020, 18:47
Ответить
Сообщение не совсем) В режиме редактирования выделите код и нажмите кнопку с изображением # на панели инструментов. Потом сохраните изменения спасибо за дополнительную редакцию и пояснения! буду знать! Автор - aivella Дата добавления - 07.04.2020 в 18:47
aivella
Дата: Вторник, 07.04.2020, 18:50 |
Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
Спасибо за совет, Hugo! "Отключите обновление экрана, и если Вам не нужно на изменение каждой ячейки где-то получать результат обсчёта этой ячейки формулами - то и пересчёт тоже есть смысл на время работы выключить." это обходной путь... надеялась, что есть напрямую через облегчение кода...
Спасибо за совет, Hugo! "Отключите обновление экрана, и если Вам не нужно на изменение каждой ячейки где-то получать результат обсчёта этой ячейки формулами - то и пересчёт тоже есть смысл на время работы выключить." это обходной путь... надеялась, что есть напрямую через облегчение кода... aivella
Ответить
Сообщение Спасибо за совет, Hugo! "Отключите обновление экрана, и если Вам не нужно на изменение каждой ячейки где-то получать результат обсчёта этой ячейки формулами - то и пересчёт тоже есть смысл на время работы выключить." это обходной путь... надеялась, что есть напрямую через облегчение кода... Автор - aivella Дата добавления - 07.04.2020 в 18:50
Hugo
Дата: Вторник, 07.04.2020, 18:52 |
Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация:
790
±
Замечаний:
0% ±
365
Чем же обходной - это самый прямой Код уже добавил выше.
Чем же обходной - это самый прямой Код уже добавил выше. Hugo
webmoney: E265281470651 Z422237915069 USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
Ответить
Сообщение Чем же обходной - это самый прямой Код уже добавил выше. Автор - Hugo Дата добавления - 07.04.2020 в 18:52
Gustav
Дата: Среда, 08.04.2020, 14:36 |
Сообщение № 10
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация:
1161
±
Замечаний:
±
начинал с Excel 4.0, видел 2.1
Можно попробовать сначала отобрать пустые ячейки при помощи метода SpecialCells, а затем уже без условия пройтись в цикле только по ним: [vba]Код
Sub test_zelle_1() Dim z As Range, rngEmp As Range On Error Resume Next Set rngEmp = ActiveSheet.Range("E150:E250").SpecialCells(xlCellTypeBlanks) If Err Then Err.Clear Exit Sub End If On Error GoTo 0 For Each z In rngEmp.Cells z = z.Offset(0, -2) Next z End Sub
[/vba]
Можно попробовать сначала отобрать пустые ячейки при помощи метода SpecialCells, а затем уже без условия пройтись в цикле только по ним: [vba]Код
Sub test_zelle_1() Dim z As Range, rngEmp As Range On Error Resume Next Set rngEmp = ActiveSheet.Range("E150:E250").SpecialCells(xlCellTypeBlanks) If Err Then Err.Clear Exit Sub End If On Error GoTo 0 For Each z In rngEmp.Cells z = z.Offset(0, -2) Next z End Sub
[/vba] Gustav
МОИ: Ник , Tip box: 41001663842605
Ответить
Сообщение Можно попробовать сначала отобрать пустые ячейки при помощи метода SpecialCells, а затем уже без условия пройтись в цикле только по ним: [vba]Код
Sub test_zelle_1() Dim z As Range, rngEmp As Range On Error Resume Next Set rngEmp = ActiveSheet.Range("E150:E250").SpecialCells(xlCellTypeBlanks) If Err Then Err.Clear Exit Sub End If On Error GoTo 0 For Each z In rngEmp.Cells z = z.Offset(0, -2) Next z End Sub
[/vba] Автор - Gustav Дата добавления - 08.04.2020 в 14:36
aivella
Дата: Среда, 08.04.2020, 16:33 |
Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
Огромное спасибо всем помощникам!!! Gustav, спасибо, код рабочий, значительного ускорения не добавил, но добавил оптимизма и желание не сдаваться. Попробовала решение Hugo. Обалденная удача!!! Работает!!! Ура!!! Прям вот первое позитивное событие дня, а то уже собиралась лезть на форумы психологов, узнавать, что со мной и с миром не так... Hugo, Вы меня спасли!!! javascript://
Огромное спасибо всем помощникам!!! Gustav, спасибо, код рабочий, значительного ускорения не добавил, но добавил оптимизма и желание не сдаваться. Попробовала решение Hugo. Обалденная удача!!! Работает!!! Ура!!! Прям вот первое позитивное событие дня, а то уже собиралась лезть на форумы психологов, узнавать, что со мной и с миром не так... Hugo, Вы меня спасли!!! javascript:// aivella
Ответить
Сообщение Огромное спасибо всем помощникам!!! Gustav, спасибо, код рабочий, значительного ускорения не добавил, но добавил оптимизма и желание не сдаваться. Попробовала решение Hugo. Обалденная удача!!! Работает!!! Ура!!! Прям вот первое позитивное событие дня, а то уже собиралась лезть на форумы психологов, узнавать, что со мной и с миром не так... Hugo, Вы меня спасли!!! javascript:// Автор - aivella Дата добавления - 08.04.2020 в 16:33
Gustav
Дата: Среда, 08.04.2020, 16:52 |
Сообщение № 12
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация:
1161
±
Замечаний:
±
начинал с Excel 4.0, видел 2.1
значительного ускорения не добавил
Так у нас же всё общее, симбиотическое. Вы добавьте Call uskorenie / Call neuskorenie от Hugo (надеюсь, он не против) и в мой код - наверное, будет повеселее.
значительного ускорения не добавил
Так у нас же всё общее, симбиотическое. Вы добавьте Call uskorenie / Call neuskorenie от Hugo (надеюсь, он не против) и в мой код - наверное, будет повеселее.Gustav
МОИ: Ник , Tip box: 41001663842605
Ответить
Сообщение значительного ускорения не добавил
Так у нас же всё общее, симбиотическое. Вы добавьте Call uskorenie / Call neuskorenie от Hugo (надеюсь, он не против) и в мой код - наверное, будет повеселее.Автор - Gustav Дата добавления - 08.04.2020 в 16:52
Hugo
Дата: Среда, 08.04.2020, 20:10 |
Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация:
790
±
Замечаний:
0% ±
365
Я не против. Тем более что это и не моё Где позаимствовал - каюсь не записал... Но принцип общеизвестный - если многократно изменяются ячейки листа, то для ускорения нужно отключать все лишние реакции.
Я не против. Тем более что это и не моё Где позаимствовал - каюсь не записал... Но принцип общеизвестный - если многократно изменяются ячейки листа, то для ускорения нужно отключать все лишние реакции. Hugo
webmoney: E265281470651 Z422237915069 USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
Ответить
Сообщение Я не против. Тем более что это и не моё Где позаимствовал - каюсь не записал... Но принцип общеизвестный - если многократно изменяются ячейки листа, то для ускорения нужно отключать все лишние реакции. Автор - Hugo Дата добавления - 08.04.2020 в 20:10
aivella
Дата: Четверг, 09.04.2020, 11:39 |
Сообщение № 14
Группа: Пользователи
Ранг: Новичок
Сообщений: 37
Репутация:
10
±
Замечаний:
20% ±
Excel 2013
Спасибо, ребята! Вы - великолепны!!!
Спасибо, ребята! Вы - великолепны!!! aivella
Ответить
Сообщение Спасибо, ребята! Вы - великолепны!!! Автор - aivella Дата добавления - 09.04.2020 в 11:39