Слежение за содержимым ячейки
Каким образом можно реализовать в Excel нижеизложенный набор действий?
Исходные данные: три столбца, A - ячейки с цифрами, B - пустые ячейки, некоторым присваивается буква в зависимости от значения С, С - текстовое слово (2 варианта).
Необходимо при введении варианта 1 в одну из ячеек С оставить все без изменений, а при введении варианта 2 в ячейку из столбца С:
- Вставить пустую строку ниже активной;
- Изменить цвет активной строки;
- Присвоить ячейке А в пустой строке значение ячейки А активной строки строки;
- Присвоить ячейке В в пустой строке определенный символ, скажем "Х";
Я написал макросы, выполняющие данные действия при нажатии кнопки на панели, но задача стоит в постоянном сканировании/анализе всего листа/книги на предмет изменения содержимого столбца С.
Требуется помощь
...
задача стоит в постоянном сканировании/анализе всего листа/книги на предмет изменения содержимого столбца С.
Рекомендую воспользоваться событием "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
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
End Sub
Примечание :
Расположить его необходимо только в модуле ThisWorkbook ЭтаКнига, а не в стандартном модуле или тем паче модуле класса.
Учитывая, что в вопросе не было чётко определено, в одном листе необходимо отслеживать подобные манипуляции или во всех, а также то, что полный ответ мною был написан, но уважаемый Dmitrii опубликовал свою версию раньше, добавлю, что можно использовать событие рабочей книги, а именно :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
End Sub
Примечание :
Расположить его необходимо только в модуле ThisWorkbook ЭтаКнига, а не в стандартном модуле или тем паче модуле класса.
Может я вопрос немного некорректно задал, но вроде бы все условия описал. Стоит, наверное, указать что ячейки столбца С по умолчанию пустые и заполняются вручную
-------------------
Именно это я имел ввиду и ничего более
так что не стоит рассматривать мой предыдущий пост как критику, так его основная задача об'яснить почему всё-таки я предложил свой вариант.
Дело в том, что принципиальное различие между двумя предложенными вариантами не относится напрямую к условиям задачи, а заключается в том, что Dmitrii предложил Вам использовать событие рабочего листа, а я аналогичное событие, но рабочей книги. Т.е. если Вы хотите запускать макрос в отдельно взятом рабочем листе, то безусловно стоит воспользоваться советом Dmitrii, а если во всех рабочих листах, то моим. Все промежуточные варинты надо рассматривать отдельно, исходя из каждого конкретного случая.
-------------------
Именно это я имел ввиду и ничего более
так что не стоит рассматривать мой предыдущий пост как критику, так его основная задача об'яснить почему всё-таки я предложил свой вариант.
Спасибо за консультацию. Я не специалист в VBA и программировании вообще, просто захотелось автоматизировать некоторые процессы в целях экономии времени.
А в чем разница между размещением макросов в модулях и в MS Excel Objects?
ByVal Sh As Object, ByVal Target As Excel.Range
Объясните пожалуйста синтаксис этих команд
Sh - это рабочий лист/листы в котором произошло изменение данных в ячейках.
Target - это ячейка/диапазон ячеек где произошло изменение данных.
Примечание :
- Изменение это не только ввод новых данных, но также и удаление старых и переход в режим редактирования (даже без изменения данных)
- Обратите внимание на то, что если Target представляет собой дипазон ячеек (в том числе и об'единённых, несмежных), то свойство Value аргумента Target будет представлять собой массив значений.
P.S.
Вы размещаете событие не в MS Excel Objects, а в программном модуле, который соответствует этому об'екту.
Учитывая, что в вопросе не было чётко определено, в одном листе необходимо отслеживать подобные манипуляции или во всех, а также то, что полный ответ мною был написан, но уважаемый Dmitrii опубликовал свою версию раньше, добавлю, что можно использовать событие рабочей книги, а именно :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
End Sub
Примечание :
Расположить его необходимо только в модуле ThisWorkbook ЭтаКнига, а не в стандартном модуле или тем паче модуле класса.
С контролем на изменение все понятно. А как можно реализовать контроль за введением определенного слова в ячейку, например "Да" - работает, "Нет" - без изменений?
С контролем на изменение все понятно. А как можно реализовать контроль за введением определенного слова в ячейку, например "Да" - работает, "Нет" - без изменений?
If Target.Address = "$C$1" And Target.Value = "да" Then
'...
End If
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
Что не так?
Target.Item(1).Value
По всей видимости аргумент Target представляет собой диапазон ячеек, а это значит, что изменения затрагивают более чем одну ячейку и следовательно свойство .Value представляет собой массив значений. А значит просто использовать Target.Value уже нельзя. Вот один из вариантов решения Вашей проблемы :
Target.Item(1).Value
Если несложно, подскажите поточнее каким образом изменить код с помощью этого варианта?