如何检测是不是在多个彼此不相邻的单元格中删除了文本

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) 相同,表示向下三行。 啊,我开始看到这种模式了。我会多做一些实验。感谢那!!赞赏!

以上是关于如何检测是不是在多个彼此不相邻的单元格中删除了文本的主要内容,如果未能解决你的问题,请参考以下文章

单击单元格文本时如何从单元格中删除文本

如何查找单元格中是不是包含部分文本并引用另一列数据

在相邻单元格中找到的日期之后的十个工作日(不包括节假日)突出显示相邻单元格

在电子表格的相邻单元格中为 Google 表单的每个答案添加时间戳

检测哪个按钮需要更改单元格中的文本

自定义单元格中的多个按钮。单击了哪一行中的哪个按钮?