如何检测是不是在多个彼此不相邻的单元格中删除了文本
Posted
技术标签:
【中文标题】如何检测是不是在多个彼此不相邻的单元格中删除了文本【英文标题】:How to detect if texts are deleted in multiple cells that are not adjacent to each other?如何检测是否在多个彼此不相邻的单元格中删除了文本 【发布时间】:2022-01-24 07:20:57 【问题描述】:我想检测是否正在从一些彼此不相邻的单元格中删除文本/值,以便在发生这种情况时执行例程。
以我为例,如果文本已从这些单元格中删除,我想监视单元格 E5、E8、E11 和 E14。因此,如果 E5 已被删除,我想执行子程序 #1。如果 E8 已被删除,我想执行子程序 #2。子程序#1 和#2 不同。所有子例程都是独一无二的,因为我无法将 E5、E8、E11 和 E14 作为一个范围进行监控。
如果我向单元格添加文本,我不想执行例程 - 只有从单元格中删除内容才会触发子例程。
我只能按照以下例程进行 - 它无法正常工作,因为如果我添加文本或删除文本,它不会区分。我也不知道如何在不使用范围的情况下监控多个单元格?
' Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$5" Then
MsgBox "hello"
End If
End Sub
有人可以指点我正确的方向吗?
非常感谢。
【问题讨论】:
请确认您的单元格数与您的子程序数相同。另外,如果一次删除多个单元格会怎样?应该运行更多的子程序吗?此外,子例程将做什么也很重要。他们会改变工作表中的值吗? 【参考方案1】:请尝试下一个方法:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range: Set rng = Range("E5")
If Target.cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Union(rng, rng.Offset(3), rng.Offset(6), rng.Offset(9))) Is Nothing Then
If Target.Value = "" Then
Select Case Target.Address(0, 0)
Case "E5": Debug.Print "E5 is empty" 'mySubrutine1
Case "E8": Debug.Print "E8 is empty"
Case "E11": Debug.Print "E11 is empty"
Case "E14": Debug.Print "E14 is empty"
End Select
End If
End If
End Sub
它只分析指定的单元格,只有当修改的单元格为空时才做一些事情。
在选择多个单元格的情况下退出。但是,它可以很容易地适应也接受多个删除。其实下一个变种应该可以处理这样的情况:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, C As Range: Set rng = Range("E5")
If Not Intersect(Target, Union(rng, rng.Offset(3), rng.Offset(6), rng.Offset(9))) Is Nothing Then
For Each C In Target.cells
If C.Value = "" Then
Select Case C.Address(0, 0)
Case "E5": Debug.Print "E5 is empty" 'mySubrutine1
Case "E8": Debug.Print "E8 is empty" 'mySubrutine2
Case "E11": Debug.Print "E11 is empty" 'mySubrutine3
Case "E14": Debug.Print "E14 is empty" 'mySubrutine4
End Select
End If
Next C
End If
End Sub
【讨论】:
现在它可以工作了,我想了解一下代码......这段代码有什么作用?我不明白偏移位?If Not Intersect(Target, Union(rng, rng.Offset(3), rng.Offset(6), rng.Offset(9))) Is Nothing Then
这很奇怪 - 我用一组不同的单元格对代码进行了实验,比如在这种情况下我试图监控单元格 C11、F11、I11 和 L11,它似乎只适用于单元格 C11 .否则代码没有更改,但它不适用于 F11、I11 和 L11。请问有什么想法吗?
@Tofulover 此行将代码的下一部分限制为仅更改所需的四个单元格。
@Tofulover 您必须了解构建要相交范围的逻辑...在您的示例中,范围具有相同的行,但不同的列。所以你应该使用rng.Offset(0, 3), rng.Offset(0, 6), rng.Offset(0, 9)
... 现在更清楚了吗?它现在使用Offset
将第三、第六和第九列指向右侧。您可以使用 -3、-9 来引用左侧的列...Offset
中的 0 表示同一行。 Offset(3)
与 Offset(3, 0)
相同,表示向下三行。
啊,我开始看到这种模式了。我会多做一些实验。感谢那!!赞赏!以上是关于如何检测是不是在多个彼此不相邻的单元格中删除了文本的主要内容,如果未能解决你的问题,请参考以下文章
在相邻单元格中找到的日期之后的十个工作日(不包括节假日)突出显示相邻单元格