Excel 如何仅在单元格值更改时执行指令?

Excel 如何仅在单元格值更改时执行指令?,excel,vba,byval,Excel,Vba,Byval,我有一个ByVal代码来清除表中特定范围的内容,它是有效的。但是如果范围值(内容)发生变化,我需要为指令执行添加一个条件,而不是仅将光标放在上面。 还有人知道如何在VBA中引用表列?现在我使用的是一个估计范围“C1:C999”,但我想使用他的名字“A_u[OPERATION]” 代码如下: Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Application.Intersect(Range(&quo

我有一个ByVal代码来清除表中特定范围的内容,它是有效的。但是如果范围值(内容)发生变化,我需要为指令执行添加一个条件,而不是仅将光标放在上面。

还有人知道如何在VBA中引用表列?现在我使用的是一个估计范围“C1:C999”,但我想使用他的名字“A_u[OPERATION]”

代码如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

   If Not Application.Intersect(Range("C1:C999"), Range(Target.Address)) Is Nothing Then
    
       Range(Selection, Selection.End(xlToRight)).ClearContents

   End If

End Sub

您可以改为使用更改事件

以下是文档的链接:

或者,您可以将目标单元格的值保存在变量中,并在执行清除内容之前检查该值是否更改

对于第二个问题,您可能应该在单独的帖子中询问。

工作表更改
  • 调整表名(
    tName
    )和标题(列)名(
    hName
  • 我已经调整它以清除列后单元格中的内容
  • 如果确实需要清除列的内容,则将
    cel.Offset(,1)
    替换为
    cel
  • 在表格中,如果手动或通过VBA更改列中的值,当前设置将自动清除指定列右侧所有单元格的内容。如果列包含公式,则此操作无效。还支持非连续删除
代码

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Const ProcName As String = "Worksheet_Change"
    On Error GoTo clearError
    
    Const tName As String = "A_"
    Const hName As String = "OPERATION"
    
    Dim rng As Range
    Set rng = Range(tName & "[" & hName & "]")
    Set rng = Intersect(rng, Target)
    If rng Is Nothing Then GoTo ProcExit
    
    Application.EnableEvents = False
    
    With ListObjects(tName).HeaderRowRange
        Dim LastColumn As Long
        LastColumn = .Columns(.Columns.Count).Column
    End With
    Dim cel As Range
    For Each rng In rng.Areas
        For Each cel In rng.Cells
            With cel.Offset(, 1)
                .Resize(, LastColumn - .Column + 1).ClearContents
            End With
        Next cel
    Next rng

CleanExit:
    Application.EnableEvents = True
    GoTo ProcExit

clearError:
    Debug.Print "'" & ProcName & "': " & vbLf _
              & "    " & "Run-time error '" & Err.Number & "':" & vbLf _
              & "        " & Err.Description
    On Error GoTo 0
    GoTo CleanExit

ProcExit:

End Sub

单元格值的更改由
工作表\u change
事件句柄捕获

但是,即使是错误的更改,也会触发此句柄。例如,如果更改前的单元格值为“A”,并且用户刚刚在单元格中再次输入了“A”,则无论如何都会触发更改事件过程

为了避免这种情况,我们可以同时使用
工作表\u更改
工作表\u选择更改

使用
工作表\u selection change
,我们将旧值记录在某个地方,比如
名称
。然后使用
工作表\u Change
,我们可以将用户输入的内容与
名称
进行比较,以查看是否进行了真正的更改

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Nm As Name: Set Nm = ActiveWorkbook.Names("OldValue")
    If Target.Count = 1 Then
        'This only record one old cell value.
        'To record multiple cells old value, use a hidden Worksheet to do so instead of a Name.
        Nm.Comment = Target.Value2
    else
        Nm.Comment = Target.Value2(1, 1)
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Nm As Name: Set Nm = ActiveWorkbook.Names("OldValue")
    If Target.Value2 <> Nm.Comment Then
        Debug.Print "True change"
    Else
        Debug.Print "False change"
    End If
End Sub

也就是说,对于您的情况,它将是
Range(“A”).ListObject.ListColumns(“OPERATION”).DataBodyRange

感谢您的帮助,
Sub Example()
    Dim lo As ListObject
    Dim lc As ListColumn
    Set lo = Range("Table1").ListObject
    Set lc = lo.ListColumns("Column2")
End Sub