当单元格 D 的值发生变化时,需要 VBA 代码来清除单元格 AQ 的内容;Microsoft Excel for Office 365 MSO 32 位

当单元格 D 的值发生变化时,需要 VBA 代码来清除单元格 AQ 的内容;Microsoft Excel for Office 365 MSO 32 位

首先我要说的是,编程不是我的强项,但我会很感激任何帮助。

我尝试使用以下公式来清除单元格 AQ 中的内容,当单元格 D(在同一行)的值发生变化时。目前,只有当单元格 D 中的值更改为 1 时,AQ 中的内容才会被清除(可能是由于“如果目标 = 1,则”这一行所致)。我该用什么来代替“1”,以便所有更改,任意值任何值,都会启动单元格 AQ 的 ClearContents 指令吗?

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

为了确保发生了真正的更改,我们首先将所选单元格的值保存为公共变量。由于您可以一次选择多个单元格,因此我决定使用公共集合。

然后,当发生变化时,我们会将该单元格的新值与集合中的旧值进行比较,并且只有当它们不匹配时,才清除 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

相关内容