Страницы: 1
RSS
Исключить запуск процедуры Chage при изменении ячеек кодом
 
Здравствуйте, необходимо выполнять некоторый код (х1, х2) каждый раз, когда меняются данные в ячейках с проверкой данных (тип список). Так же есть "главная" ячейка "B11". Необходимо, что бы после изменения информации в этой ячейке, все остальные ячейки с проверкой данных принимали значение "" (то есть в них для удобства восприятия информации происходил сброс с ранее заполненных данных). Написал вот такой код:
Код
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("B11:B25")) Is Nothing Then
x1 'вызываемые процедуры, которые обрабатывают и меняют информацию в ячейках
x2
End If

Dim xCount As Integer
If Not Intersect(Target, Range("B11")) Is Nothing Then
xCount = 0
Do While xCount <> 15
Worksheets("Layer").Cells(12 + xCount, 2) = ""
xCount = xCount + 1
Loop
End If

End Sub

Проблема следующая - каждый раз, после срабатывания основных процедур на первую ячейку "B11", происходит очистка остальных ячеек (за каждый этап цикла по 1 разу судя по всему), что приводит к повторному запуску процедур х1 и х2, что замедляет процесс обсчета данных на порядок. Как можно это исправить?
Изменено: cheka282 - 20.01.2020 05:36:36
 
М.б. это? (https://habr.com/ru/post/112458/ )

"...Часто макросы требуют долгого времени выполнения, которое можно значительно сократить. В начале и в конце каждой ресурсоёмкой функции вызвать Prepare и Ended.
Код
Public Sub Prepare()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
End Sub
Код
Public Sub Ended()
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
End Sub
По порядку:
1. Отключить перерисовку объектов на экране, чтобы ничего не мигало.
2. Выключить расчет. Внимание, если макрос прервался посреди работы, то расчет так и останется в ручном режиме!
3. Не обрабатывать события.
4. Отображение границ страниц, тоже почему-то помогает.
5. В статусной строке выводятся различные данные, что замедляет работу, отключаем.
6. Это если нужно. Выключает сообщения Экселя. Например, мы делаем Workbook.Close, Эксель хочет спросить сохранить ли изменения. При выключении этого параметра все ответы будут даны автоматически (изменения не сохранятся).
..."
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Спасибо! Время выполнения программы сократилось в 2 раза.
 
Еще быстрее будет, если замените это:
Код
xCount = 0
Do While xCount <> 15
Worksheets("Layer").Cells(12 + xCount, 2) = ""
xCount = xCount + 1
Loop
на это:
Код
Worksheets("Layer").Cells(12, 2).Resize(15).value = ""
Изменено: Дмитрий(The_Prist) Щербаков - 20.01.2020 10:41:10
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх