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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2009, 00:40   #1
nemoomen
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 58
По умолчанию Проблема Worcsheet_Change

Доброй ночи!!!

Господа, прошу совета и разъяснений.
Почему Worcsheet_Change на рабочем листе (по крайней мере в том варианте, который в прилагаемом файле) отрабатывает только при вводе в ячейку каких-то данных, но не при ее очистке "DEL".

Спасибо!
Вложения
Тип файла: rar Проблема Worcsheet_Change.rar (6.0 Кб, 18 просмотров)
nemoomen вне форума Ответить с цитированием
Старый 13.03.2009, 01:02   #2
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

Когда вы вводите число, например, в ячейку В5, то Target.Address будет $B$5, но когда вы нажимаете клавишу Delete на клавиатуре, то Target.Address уже будет $B$5:$C$5 - из-за этого ваша процедура не срабатывала.

Попробуйте так


Код:
Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B3:C3")) Is Nothing Then
        If IsEmpty(Target) Then Exit Sub
        Application.EnableEvents = False 'нужно отключать события Excel, иначе идёт ПОВТОР этой процедуры
        Range("E3") = Range("B3")
    End If
    
    If Not Intersect(Target, Range("B5:C5")) Is Nothing Then
        If IsEmpty(Target) Then Exit Sub
        Application.EnableEvents = False 'нужно отключать события Excel, иначе идёт ПОВТОР этой процедуры
        Range("F3") = Range("B5")
    End If
    
    Application.EnableEvents = True 'а теперь включаем события Excel, чтобы эта процедура работала
End Sub
Мы отлавливаем изменения в нужном диапазоне через метод Intersect и теперь всё правильно срабатывает.

Также вам необходимо знать, когда срабатывает строка Range("E3") = Range("B3") в вашей процедуре, ваша процедура

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
срабатывает СНОВА, т.к. вы снова изменили значение в ячейке (только уже E3, чтобы этого избежать нужно отключать события Excel через строку

Код:
Application.EnableEvents = False
но в конце вашей процедуры её обязательно нужно включать, иначе у вас отключатся все события Excel и второй вызов этой процедуры уже не произойдёт

P.S. Вам нужно научиться пользоваться точками останова (клавиша F9) в редакторе VBA. Тогда ваш код будет выполняться до этой точки останова, а далее будет останавливаться и открывать редактор VBA.
Т.е. для определения, почему не срабатывает ваша процедура при нажатии клавиши "Del" вам было необходимо поставить точку останова на строке

Код:
If Target.Address = "$B$3" Then
и посмотреть, какой адрес в данный момент имеет объект Target (подвести курсор мыши на конструкцию Target.Address) и вам бы всё стало ясно, что это не просто $B$3 или $B$5

Последний раз редактировалось Pavel55; 13.03.2009 в 01:07.
Pavel55 вне форума Ответить с цитированием
Старый 13.03.2009, 01:17   #3
nemoomen
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Pavel55 Посмотреть сообщение
Попробуйте так

Код:
Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B3:C3")) Is Nothing Then
        If IsEmpty(Target) Then Exit Sub
Подскажите как работает первое условие IF
И для чего нужно второе IF

Спасибо!
nemoomen вне форума Ответить с цитированием
Старый 13.03.2009, 02:29   #4
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

По первому IF

If Not Intersect(Target, Range("B3:C3")) Is Nothing Then

Если ячейка Target входит в диапазон B3:C3, То

если совсем дословно, то

Если пересечение диапазона Target и Range("B3:C3") НЕ равно нично, ТО


А по второму IF - это ваш IF, я просто его оставил в своем коде, но по-моему, он совсем не нужен
Pavel55 вне форума Ответить с цитированием
Старый 13.03.2009, 15:41   #5
nemoomen
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 58
По умолчанию

Второе IF

If IsEmpty(Target) Then Exit Sub

я просто скопировал из книги, на основании которой и писал свой код. Там тоже ничего не объясняется. Но я менять не стал, исходя из принципа - "работает-не трож!"

Спасибо за ответы!
nemoomen вне форума Ответить с цитированием
Старый 28.03.2009, 15:58   #6
acorables
 
Регистрация: 04.02.2007
Сообщений: 4
По умолчанию

Цитата:
Сообщение от nemoomen
я просто скопировал из книги, на основании которой и писал свой код. Там тоже ничего не объясняется.
А какая книжка, если не секрет? Меня тоже интересует этот вопрос.
acorables вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37