Я предвосхищу это, сказав, что программирование - не моя сильная сторона, но я был бы признателен за любую помощь.

Я использовал приведенную ниже формулу в попытке очистить содержимое ячейки AQ при изменении значения ячейки D (в той же строке). В настоящее время содержимое очищается только в AQ, когда значение в ячейке D изменяется на 1 (предположительно из-за строки «If Target = 1 Then»). Что я использую вместо "1", чтобы все изменения, начиная с любого значения и заканчивая любым значением, инициировали команду ClearContents для ячейки AQ?

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        If Target = 1 Then
            Range("AQ" & Target.Row).ClearContents
        End If
    End If
End Sub

1 ответ1

0

Чтобы убедиться, что произошло истинное изменение, мы сначала сохраняем значение выбранной ячейки в качестве публичной переменной. Поскольку вы можете выбрать более одной ячейки одновременно, я решил использовать общедоступную коллекцию.

Затем, когда происходит изменение, мы сравниваем новое значение этой ячейки со старым значением в коллекции и только если они не совпадают, очищают содержимое AQ. Что-то вроде:

Public coll As New Collection

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cel As Range
    Set coll = New Collection
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        For Each cel In Target
            coll.Add cel.Value, cel.Address
        Next cel
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        If Not Target.Value = coll(Target.Address) Then
           Range("AQ" & Target.Row).ClearContents
        End If
    End If
End Sub

Редактирование обновлено для работы при выборе нескольких ячеек.

Очевидно, что если вы измените значение в Range("D7:D506") без фактического выбора ячейки, этот код выдаст ошибку.

Если подумать, вы можете редактировать несколько ячеек одновременно, если удаляете значение. Тогда этот код также выдаст ошибку. Но мы можем обойти это, используя тот же подход в Worksheet_Change что и в Worksheet_SelectionChange:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range
    If Not Intersect(Target, Range("D7:D506")) Is Nothing Then
        For Each cel In Target
            If Not cel.Value = coll(cel.Address) Then
                Range("AQ" & cel.Row).ClearContents
            End If
        Next cel
    End If
End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .