Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2010, 18:36   #1
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию Как обработать Worksheet_Change только при ручном редактировании?

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

В коде модуля этой таблицы есть обработчик, проверяющий правильность данных в ячейках и помечающий ошибочную ячейку фоновым цветом.
Код:
Private Sub Worksheet_Change (ByVal Target As Range)
    Application.ScreenUpdating = False
    On Error Resume Next
    If (Target.Column = 1) Then    ' если данные из 1-й колонки
        If (Target.Value  ...условие_ошибки...) Then    ' проверка данных для 1-й колонки
            Cells(Target.Row, Target.Column).Interior.ColorIndex = 3    ' помечаем ячейку красным цветом
        End If
    ElseIf (Target.Column = 7) Then    ' если данные из 7-й колонки
        If (Target.Value  ...условие_ошибки...) Then    ' проверка данных для 7-й колонки
            Cells(Target.Row, Target.Column).Interior.ColorIndex = 6    ' помечаем ячейку желтым цветом
        End If
    ElseIf (Target.Column = 14) Then    ' если данные из 13-й колонки
        If (Target.Value  ...условие_ошибки...) Then    ' проверка данных для 13-й колонки
            Cells(Target.Row, Target.Column).Interior.ColorIndex = 26    ' помечаем ячейку сиреневым цветом
        End If
    End If
    Application.ScreenUpdating = True
End Sub
Проблема в том, что Worksheet_Change отрабатывает не только при ручном редактировании ячеек, а еще и при заполнении всей таблицы макросом. При этом макрос, загружающий данные, сильно тормозит, вся таблица "дергается" и мерцает...

Как отключить обработчик изменения таблицы Worksheet_Change на момент загрузки данных, а включать только при ручном редактировании страницы?

Может, кто подскажет, где подробно почитать про обработку событий Excel?

Заранее благодарю!
Smaragdov вне форума Ответить с цитированием
Старый 07.09.2010, 18:37   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

В начале макроса: application.EnableEvents = false
В конце макроса: application.EnableEvents = true

Ваш макрос можно переписать так: (чуть проще для понимания)
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub    ' изменено несколько ячеек одновременно
    Application.ScreenUpdating = False
    On Error Resume Next
    
    Select Case Target.Column
        Case 1:    ' если данные из 1-й колонки
            If Target.Value = ошибка Then   ' проверка данных для 1-й колонки
                Target.Interior.ColorIndex = 3    ' помечаем ячейку красным цветом
            End If
            
        Case 7:    ' если данные из 7-й колонки
            If Target.Value = ошибка Then   ' проверка данных для 7-й колонки
                Target.Interior.ColorIndex = 6    ' помечаем ячейку желтым цветом
            End If
            
        Case 14:    ' если данные из 14-й колонки
            If Target.Value = ошибка Then   ' проверка данных для 14-й колонки
                Target.Interior.ColorIndex = 26    ' помечаем ячейку сиреневым цветом
            End If
    End Select
End Sub

Последний раз редактировалось EducatedFool; 07.09.2010 в 18:42.
EducatedFool вне форума Ответить с цитированием
Старый 07.09.2010, 19:04   #3
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию

Уважаемый EducatedFool, огромное спасибо!

application.EnableEvents = false/true – это как раз то, что нужно!

Да, несомненно Ваш код куда элегантнее!
А я даже и не знал, что в VBA тоже есть "Select case"...

А как оно по скорости выполнения?
Что быстрее "If () Then ... ElseIf ()" или "Select Case"?
Smaragdov вне форума Ответить с цитированием
Старый 07.09.2010, 19:54   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
А как оно по скорости выполнения?
Что быстрее "If () Then ... ElseIf ()" или "Select Case"?
Разницы нет - если не считать сотые доли миллисекунд.

Время уходит на выделение ячеек, окраску ячеек и изменение их значений.
Временными затратами на проверку условий обычно можно пренебречь.
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отменить UPDATE при редактировании грида? AK BULLETS Общие вопросы Delphi 11 25.03.2010 16:45
Как при редактировании заблокировать запись в БД? Сергей089 Помощь студентам 4 25.03.2010 10:30
Ошибка при редактировании в Query Toky БД в Delphi 8 14.12.2009 16:42
Как обработать ошибки при скачке html-страниц? delphyok Работа с сетью в Delphi 6 14.08.2009 14:06
при ручном наборе некоторые процедуры неработают? zAlexandrz Общие вопросы Delphi 8 10.11.2007 18:43