Excel-VBA - 如何识别目标范围(超过 1 个单元格)在 Worksheet_Change 函数中被删除?
Excel-VBA - How to identify Target range (more than 1 cell) is deleted in a Worksheet_Change function?
我正在尝试查找是否用户删除了 B 列中某些单元格中的值,然后使用 worksheet_change 函数也删除了 X 列中相同行中的单元格。
当我只删除 B 列中的一个单元格时,IsEmpty(Target) returns true 并且我能够清除 X 列中的同一行单元格。
但是,当 select 列 B 中的多个单元格并按下删除按钮时,IsEmpty(Target) returns False。现在这里的目标是多个单元格的范围。我只是找不到一种方法来查找用户是否同时删除了 B 列中的值范围。任何帮助将非常感激。
以下代码在删除一个单元格时有效,但在删除一系列单元格时无效。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
If Target.Columns.Count > 1 Then Exit Sub
If IsEmpty(Target) Then
Application.EnableEvents = False
ActiveSheet.Range("X" & Target.Row & ":X" & Target.Row + Target.Rows.Count - 1).ClearContents
Application.EnableEvents = True
End If
End Sub
谢谢
乌塔姆
将有问题的列复制到隐藏工作表 (workSheet.Visible = xlVeryHidden
),然后使用 WorksheetFunction.CountA
比较可见工作表列和 'shadow' 隐藏工作表的列。如果包含内容的单元格数量减少(即内容已被删除),这将快速通知您。
如果是,则获取观察列的.UsedRange
,找到其中的第一个空单元格,并检查影子列中对应的单元格是否也为空。如果是,继续下一个空单元格;如果没有,你就知道单元格内容已经被删除了,你可以删除你'column X'.
中对应的单元格内容
在每个 Worksheet_Change
事件之后,您需要制作另一个 'shadow' 副本。
您误解了函数 IsEmpty 的用途。
我想您真正要找的是不包含值的单元格(空白单元格)。以下行将为您提供包含值的单元格数。如果那等于零那么它们都是空白的。
Target.SpecialCells(xlCellTypeConstants).Count
然而,如果所有单元格都为空,上述代码行将导致错误。因此,您必须按如下方式调整代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
If Target.Columns.Count > 1 Then Exit Sub
Dim bolIsEmpty As Boolean
On Error GoTo AllAreEmpty
bolIsEmpty = Target.SpecialCells(xlCellTypeConstants).Count = 0
On Error GoTo 0
If bolIsEmpty Then
' ... your code here ...
End If
Exit Sub
AllAreEmpty:
bolIsEmpty = True
Resume Next
End Sub
我正在尝试查找是否用户删除了 B 列中某些单元格中的值,然后使用 worksheet_change 函数也删除了 X 列中相同行中的单元格。
当我只删除 B 列中的一个单元格时,IsEmpty(Target) returns true 并且我能够清除 X 列中的同一行单元格。
但是,当 select 列 B 中的多个单元格并按下删除按钮时,IsEmpty(Target) returns False。现在这里的目标是多个单元格的范围。我只是找不到一种方法来查找用户是否同时删除了 B 列中的值范围。任何帮助将非常感激。
以下代码在删除一个单元格时有效,但在删除一系列单元格时无效。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
If Target.Columns.Count > 1 Then Exit Sub
If IsEmpty(Target) Then
Application.EnableEvents = False
ActiveSheet.Range("X" & Target.Row & ":X" & Target.Row + Target.Rows.Count - 1).ClearContents
Application.EnableEvents = True
End If
End Sub
谢谢 乌塔姆
将有问题的列复制到隐藏工作表 (workSheet.Visible = xlVeryHidden
),然后使用 WorksheetFunction.CountA
比较可见工作表列和 'shadow' 隐藏工作表的列。如果包含内容的单元格数量减少(即内容已被删除),这将快速通知您。
如果是,则获取观察列的.UsedRange
,找到其中的第一个空单元格,并检查影子列中对应的单元格是否也为空。如果是,继续下一个空单元格;如果没有,你就知道单元格内容已经被删除了,你可以删除你'column X'.
在每个 Worksheet_Change
事件之后,您需要制作另一个 'shadow' 副本。
您误解了函数 IsEmpty 的用途。
我想您真正要找的是不包含值的单元格(空白单元格)。以下行将为您提供包含值的单元格数。如果那等于零那么它们都是空白的。
Target.SpecialCells(xlCellTypeConstants).Count
然而,如果所有单元格都为空,上述代码行将导致错误。因此,您必须按如下方式调整代码:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
If Target.Columns.Count > 1 Then Exit Sub
Dim bolIsEmpty As Boolean
On Error GoTo AllAreEmpty
bolIsEmpty = Target.SpecialCells(xlCellTypeConstants).Count = 0
On Error GoTo 0
If bolIsEmpty Then
' ... your code here ...
End If
Exit Sub
AllAreEmpty:
bolIsEmpty = True
Resume Next
End Sub