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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2009, 21:14   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Событие ввода данных в ячейку

Можно ли (и как) отловить событие ввода данных в определенную ячейку?
Вводом данных считаем:
1) Ввод текста на прямую.
2) Выбор значения из списка.

Пока нашел способ отловить событие ввода данных в любую ячейку.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.05.2009, 21:23   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Есть 2 основных варианта (одинаковых по сути):
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = [d8].Address Then
        ' изменена ячейка D8
        MsgBox Target.Value
    End If
End Sub
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, [d8]) Is Nothing Then
        ' изменена ячейка D8
        MsgBox Target.Value
    End If
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 12.05.2009, 21:39   #3
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Есть 2 основных варианта (одинаковых по сути):
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Эээ.. глупый и идиотский вопрос: "Куда это нужно писать?"
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.05.2009, 21:48   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Правой кнопкой на ярлычке листа, выбираем пункт ИСХОДНЫЙ ТЕКСТ.
Так мы попадаем в модуль кода выбранного листа
Туда и вставляем этот код.

PS: Для каждого листа - свой модуль кода.

Кроме того, есть модуль кода книги - аналогичный макрос в этом модуле книги отлавливает события всех листов:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' этот код уже надо вставлять в модуль книги (называется модуль ЭтаКнига)
    MsgBox "На листе " & Sh.Name & " изменена ячейка " & Target.Address
End Sub
Для отображения окна объектов нажмите Ctrl + R в редакторе VBA

Последний раз редактировалось EducatedFool; 12.05.2009 в 21:50.
EducatedFool вне форума Ответить с цитированием
Старый 12.05.2009, 21:52   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Правой кнопкой на ярлычке листа, выбираем пункт ИСХОДНЫЙ ТЕКСТ.
Так мы попадаем в модуль кода выбранного листа
Туда и вставляем этот код.

PS: Для каждого листа - свой модуль кода.

Кроме того, есть модуль кода книги - аналогичный макрос в этом модуле книги отлавливает события всех листов:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
' этот код уже надо вставлять в модуль книги (называется модуль ЭтаКнига)
    MsgBox "На листе " & Sh.Name & " изменена ячейка " & Target.Address
End Sub
Для отображения окна объектов нажмите Ctrl + R в редакторе VBA
Спасибо! Заработало... Теперь попробуем не много по колдовать....
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.05.2009, 22:03   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

И ещё: если надо выполнять различные действия при изменении разных ячеек, можете использовать такой код (в модуле листа):

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Address
        Case [d8].Address: [e4] = 123       ' изменена ячейка D8
        Case [d6].Address: [d4] = 123       ' изменена ячейка D6
        Case [e3].Address: [e5] = 123       ' изменена ячейка E3
        Case Else: MsgBox Target.Value    ' изменена другая ячейка
    End Select
End Sub
Если надо временно отключить сработку этого обработчика событий (чтобы при изменении ячеек макрос не запускался),
используйте команду Application.EnableEvents = False
Но потом не забудьте включить обработку событий снова: Application.EnableEvents = True

Последний раз редактировалось EducatedFool; 12.05.2009 в 22:05.
EducatedFool вне форума Ответить с цитированием
Старый 13.05.2009, 13:44   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
Плохо

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Address
        Case [d8].Address: [e4] = 123       ' изменена ячейка D8
        Case Else: MsgBox Target.Value    ' изменена другая ячейка
    End Select
End Sub
Предположим:
Код:
    www=Q21
    Select Case Target.Address
        Case [www].Address: [e4] = 123       ' изменена ячейка D8
        Case [d6].Address: [d4] = 123       ' изменена ячейка D6
        Case [e3].Address: [e5] = 123       ' изменена ячейка E3
        Case Else: MsgBox Target.Value    ' изменена другая ячейка
    End Select
Выдает ошибку... Пробовал в разных вариациях.
Можно ли использовать в даном месте переменные или константы?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 13.05.2009, 14:55   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Можно ли использовать в даном месте переменные или константы?
Можно. Но это ещё не значит, что можно полностью игнорировать синтаксис VB...

Попробуйте так:
Код:
    www = "Q21"
    Select Case Target.Address
        Case Range(www).Address: [e4] = 123
Или так:
Код:
Dim www As Range: Set www = [Q21]
    Select Case Target.Address
        Case www.Address: [e4] = 123
Ну или так:
Код:
    Select Case Target.Address
        Case [Q21].Address: [e4] = 123
Можно ещё как-нибудь попробовать записать тот же код, но, если Вы изобретаете новые синтаксические конструкции для своей программы, не удивляйтесь, что они работать не будут...
EducatedFool вне форума Ответить с цитированием
Старый 06.08.2012, 11:43   #9
stray_
Новичок
Джуниор
 
Регистрация: 06.08.2012
Сообщений: 2
По умолчанию

Сделал, как здесь описано.
сообщение при изменении ячейки не выдается, событие не ловится.
в чем может быть проблема??
stray_ вне форума Ответить с цитированием
Старый 06.08.2012, 13:14   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
сообщение при изменении ячейки не выдается, событие не ловится.
в чем может быть проблема??
Может, макросы в Excel не включены?

Как включить макросы - показано здесь:
http://excelvba.ru/articles/EnableMacros/Excel
EducatedFool вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++: обработка ввода данных kAND Помощь студентам 8 30.04.2009 18:33
Контроль ввода данных в классе oleg kutkov Общие вопросы C/C++ 1 14.04.2008 22:19
обработка ситуации неверного ввода данных Sweta Помощь студентам 0 22.11.2007 17:13
проверка ввода данных в форму @Simpson JavaScript, Ajax 1 12.11.2007 02:17