Выделение ячеек для события изменения выбора листа

#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. Спасибо! Это сработало как шарм! Большое спасибо!