Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Слежение за содержимым ячейки

10K
18 апреля 2005 года
Welder
8 / / 18.04.2005
Требуется помощь

Каким образом можно реализовать в Excel нижеизложенный набор действий?
Исходные данные: три столбца, A - ячейки с цифрами, B - пустые ячейки, некоторым присваивается буква в зависимости от значения С, С - текстовое слово (2 варианта).
Необходимо при введении варианта 1 в одну из ячеек С оставить все без изменений, а при введении варианта 2 в ячейку из столбца С:
- Вставить пустую строку ниже активной;
- Изменить цвет активной строки;
- Присвоить ячейке А в пустой строке значение ячейки А активной строки строки;
- Присвоить ячейке В в пустой строке определенный символ, скажем "Х";

Я написал макросы, выполняющие данные действия при нажатии кнопки на панели, но задача стоит в постоянном сканировании/анализе всего листа/книги на предмет изменения содержимого столбца С.
405
18 апреля 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by Welder
Требуется помощь
...
задача стоит в постоянном сканировании/анализе всего листа/книги на предмет изменения содержимого столбца С.



Рекомендую воспользоваться событием "Change" рабочего листа. Вот пример макроса, который следит за изменением содержимого любой ячейки столбца C:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then
MsgBox "Изменение в столбце С"
End If
End Sub

Код надо поместить в модуль кода того листа, с которым Вы работаете.

А вот так можно проследить за изменением в конкретной ячейке:
If Target.Address = "$C$1" Then

275
18 апреля 2005 года
pashulka
985 / / 19.09.2004
Учитывая, что в вопросе не было чётко определено, в одном листе необходимо отслеживать подобные манипуляции или во всех, а также то, что полный ответ мною был написан, но уважаемый Dmitrii опубликовал свою версию раньше, добавлю, что можно использовать событие рабочей книги, а именно :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)

End Sub

Примечание :
Расположить его необходимо только в модуле ThisWorkbook ЭтаКнига, а не в стандартном модуле или тем паче модуле класса.
10K
19 апреля 2005 года
Welder
8 / / 18.04.2005
Цитата:
Originally posted by pashulka
Учитывая, что в вопросе не было чётко определено, в одном листе необходимо отслеживать подобные манипуляции или во всех, а также то, что полный ответ мною был написан, но уважаемый Dmitrii опубликовал свою версию раньше, добавлю, что можно использовать событие рабочей книги, а именно :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)

End Sub

Примечание :
Расположить его необходимо только в модуле ThisWorkbook ЭтаКнига, а не в стандартном модуле или тем паче модуле класса.



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

275
19 апреля 2005 года
pashulka
985 / / 19.09.2004
Дело в том, что принципиальное различие между двумя предложенными вариантами не относится напрямую к условиям задачи, а заключается в том, что Dmitrii предложил Вам использовать событие рабочего листа, а я аналогичное событие, но рабочей книги. Т.е. если Вы хотите запускать макрос в отдельно взятом рабочем листе, то безусловно стоит воспользоваться советом Dmitrii, а если во всех рабочих листах, то моим. Все промежуточные варинты надо рассматривать отдельно, исходя из каждого конкретного случая.
-------------------
Именно это я имел ввиду и ничего более
так что не стоит рассматривать мой предыдущий пост как критику, так его основная задача об'яснить почему всё-таки я предложил свой вариант.
10K
19 апреля 2005 года
Welder
8 / / 18.04.2005
Цитата:
Originally posted by pashulka
Дело в том, что принципиальное различие между двумя предложенными вариантами не относится напрямую к условиям задачи, а заключается в том, что Dmitrii предложил Вам использовать событие рабочего листа, а я аналогичное событие, но рабочей книги. Т.е. если Вы хотите запускать макрос в отдельно взятом рабочем листе, то безусловно стоит воспользоваться советом Dmitrii, а если во всех рабочих листах, то моим. Все промежуточные варинты надо рассматривать отдельно, исходя из каждого конкретного случая.
-------------------
Именно это я имел ввиду и ничего более
так что не стоит рассматривать мой предыдущий пост как критику, так его основная задача об'яснить почему всё-таки я предложил свой вариант.



Спасибо за консультацию. Я не специалист в VBA и программировании вообще, просто захотелось автоматизировать некоторые процессы в целях экономии времени.
А в чем разница между размещением макросов в модулях и в MS Excel Objects?

10K
19 апреля 2005 года
Welder
8 / / 18.04.2005
ByVal Target As Range\
ByVal Sh As Object, ByVal Target As Excel.Range
Объясните пожалуйста синтаксис этих команд
275
19 апреля 2005 года
pashulka
985 / / 19.09.2004
Аргументы :
Sh - это рабочий лист/листы в котором произошло изменение данных в ячейках.
Target - это ячейка/диапазон ячеек где произошло изменение данных.

Примечание :
- Изменение это не только ввод новых данных, но также и удаление старых и переход в режим редактирования (даже без изменения данных)
- Обратите внимание на то, что если Target представляет собой дипазон ячеек (в том числе и об'единённых, несмежных), то свойство Value аргумента Target будет представлять собой массив значений.

P.S.
Вы размещаете событие не в MS Excel Objects, а в программном модуле, который соответствует этому об'екту.
10K
20 апреля 2005 года
Welder
8 / / 18.04.2005
Цитата:
Originally posted by pashulka
Учитывая, что в вопросе не было чётко определено, в одном листе необходимо отслеживать подобные манипуляции или во всех, а также то, что полный ответ мною был написан, но уважаемый Dmitrii опубликовал свою версию раньше, добавлю, что можно использовать событие рабочей книги, а именно :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)

End Sub

Примечание :
Расположить его необходимо только в модуле ThisWorkbook ЭтаКнига, а не в стандартном модуле или тем паче модуле класса.



С контролем на изменение все понятно. А как можно реализовать контроль за введением определенного слова в ячейку, например "Да" - работает, "Нет" - без изменений?

405
20 апреля 2005 года
Dmitrii
554 / / 16.12.2004
Цитата:
Originally posted by Welder
С контролем на изменение все понятно. А как можно реализовать контроль за введением определенного слова в ячейку, например "Да" - работает, "Нет" - без изменений?



If Target.Address = "$C$1" And Target.Value = "да" Then
'...
End If

10K
25 апреля 2005 года
Welder
8 / / 18.04.2005
Цитата:
Originally posted by Dmitrii
If Target.Address = "$C$1" And Target.Value = "да" Then
'...
End If



Помогите, вылетает ошибка Run-time error "13"

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 15 And Target.Value = "Cut out" Then
ActiveCell.EntireRow.Insert
ActiveCell.Offset(rowOffset:=0, columnOffset:=0).Activate
numRows = Selection.Rows.Count
numColumns = Selection.Columns.Count
Selection.Resize(numRows, numColumns + 19).Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
End If
End Sub

Что не так?

275
25 апреля 2005 года
pashulka
985 / / 19.09.2004
По всей видимости аргумент Target представляет собой диапазон ячеек, а это значит, что изменения затрагивают более чем одну ячейку и следовательно свойство .Value представляет собой массив значений. А значит просто использовать Target.Value уже нельзя. Вот один из вариантов решения Вашей проблемы :

 
Код:
Target(1).Value
Target.Item(1).Value
10K
26 апреля 2005 года
Welder
8 / / 18.04.2005
Цитата:
Originally posted by pashulka
По всей видимости аргумент Target представляет собой диапазон ячеек, а это значит, что изменения затрагивают более чем одну ячейку и следовательно свойство .Value представляет собой массив значений. А значит просто использовать Target.Value уже нельзя. Вот один из вариантов решения Вашей проблемы :

 
Код:
Target(1).Value
Target.Item(1).Value



Если несложно, подскажите поточнее каким образом изменить код с помощью этого варианта?

275
26 апреля 2005 года
pashulka
985 / / 19.09.2004
 
Код:
If Target.Column = 15 And Target.Item(1).Value = "Cut out" Then
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог