#excel #vba
#excel #vba
Вопрос:
Я пытаюсь создать событие изменения выбора на листе, где, если в ячейке есть значение, затем удалите внутренний цвет этой ячейки до none. Однако, если значение отсутствует, сохраните исходный внутренний цвет таким же. А также, как бы я ограничил событие изменения выбора только определенным столбцом (за вычетом пустых ячеек, конечно). Код vba, который я смог придумать до сих пор, это:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Value <> "" Then
Target.Interior.Color = xlNone
Else
Target.Interior.Color = 13551615
End If
End Sub
Однако, когда я ввожу некоторые данные в ячейку, внутренний цвет не изменился на none. Только когда я щелкаю и щелкаю обратно в эту ячейку, внутренний цвет изменился на none. Что мне нужно сделать, чтобы изменение произошло мгновенно, чтобы мне не приходилось нажимать «Прочь» и «Назад»? Кроме того, как бы записать ограничение, чтобы разрешить это изменение выбора только в определенном столбце, а не во всем листе?
Комментарии:
1. Почему бы не использовать условное форматирование?
2. Потому что я пытаюсь автоматизировать процесс с помощью макроса. Условное форматирование означало бы, что я должен вручную выбрать данные, нажать кнопку условного форматирования и указать условия для форматирования.
Ответ №1:
Когда вы вводите значение в ячейку, ваш выбор не меняется. если вы хотите изменить значение на Interior.Color
основе новых значений, вам необходимо использовать Worksheet.Change
событие.
Прежде всего, относительно ограничения диапазона, в котором изменение выбора должно вступить в силу:
Проверьте, если выделение (цель) и диапазон, в вашем случае несколько ячеек в столбце G Intersect
, тогда, и это необязательно, вносят изменения только тогда, когда выбрана одна ячейка, а не больше.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("G2:G1000")) Is Nothing Then
If Not Target.CountLarge > 1 Then
If Target.Value <> "" Then
Target.Interior.Color = xlNone
Else
Target.Interior.Color = 13551615
End If
End If
End If
End Sub
Чтобы распознать изменения значений ячеек, поместите тот же код во Worksheet.Change
вложенную строку события:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G2:G1000")) Is Nothing Then
If Not Target.CountLarge > 1 Then
If Target.Value <> "" Then
Target.Interior.Color = xlNone
Else
Target.Interior.Color = 13551615
End If
End If
End If
End Sub
На этом этапе вам, вероятно, следует передать код на аутсорсинг одному подразделу и просто вызвать его из подразделов событий.
Комментарии:
1. Спасибо! Это сработало как шарм! Большое спасибо!