繁体   English   中英

MS Excel VBA:查找具有特定公式类型的单元格

[英]MS Excel VBA: Find cells that have a specific formula type

我想自动查找包含仅作为简单参考的公式的单元格。 例如:

=D20='Sheet1'!D20

目的是我想自动对这些单元格进行颜色编码。

VBA 中有没有办法搜索公式类型?

经过一段时间让它沉入其中,我认为这并不是那么简单。 直接单元格引用可以包括简单的引用,例如:

=A1

但是在某些情况下,您可以引用另一个工作表中的另一个单元格、另一个打开的工作簿甚至另一个关闭的工作簿。 虽然这使得使用RIGHTLEFT函数甚至FORMULATEXT等函数变得困难,但您可以做的一件事是检查模式。

任何直接的单元格引用都不能包含任何其他计算,这意味着它必须排除任何不需要的运算符(/、*、-、+)。 就我而言,这意味着如果我们检查一个只有一个Precedent的单元格,则公式不能以数字开头,也不能以上述任何运算符之后的数字结尾。

我们最好的选择是将这些标准放在正则表达式中。 我绝不是 RegEx 专家,但我认为以下方法可以解决问题:

"^=.*[A-Z]+\$*\d+$"
  • 该行的开头是=
  • 后跟任何单词/非单词字符,0-n 次
  • 行尾必须是数字,1-n 次,前面是大写字母字符或与美元符号的组合(用于绝对单元格引用)

只要我们只检查一个.Precedent并检查公式的第二个字符是否不是数字,上述方法就可以工作。 例如,代码示例将如下所示:

Sub FindFormualaType()

Dim rng1 As Range, rng2 As Range, cl As Range
Dim regex As New RegExp
Dim matches As Object
Dim tststr As String

With regex
    .Global = True
    .Pattern = "^=.*[A-Z]+\$*\d+$"
End With

With Sheet1 'Change to your sheet's codename
    Set rng1 = Intersect(.Cells, .Cells.SpecialCells(-4123))
    For Each cl In rng1
        On Error Resume Next
        If cl.Precedents.Count = 1 Then
            If Left(cl.Formula, 2) Like "=#" = False Then
                Set matches = regex.Execute(cl.Formula)
                If matches.Count = 1 Then
                    If Not rng2 Is Nothing Then
                        Set rng2 = Union(rng2, cl)
                    Else
                        Set rng2 = cl
                    End If
                End If
            End If
        End If
        On Error GoTo 0
    Next cl
End With

rng2.Interior.Color = vbGreen

End Sub

解释上面代码中的一些步骤:

  • 要使用RegExp ,您必须设置对它的引用:

    在此处输入图像描述

  • 然后代码使用.SpecialCellsxlCellTypeFormulas ( -4123 ),并通过.Intersect .Range 因此,我们不必循环所有单元格以使用.HasFormula进行检查(希望能节省一些时间)。

  • 接下来是循环遍历新创建.Range object 中的所有单元格,并检查Precendents.Count = 1是否。 我们需要将其封装到On Error Resume Next中,因为如果没有找到先例,它会出错,例如:像="Hello"这样的公式。

  • 当计数等于 1 时,我们使用Like运算符检查我们是否可以保存执行正则表达式并测试使用的模式是否匹配。

  • 因为我宁愿在一个 go 中做一个填充操作,所以我建议创建另一个.Range object (rng2) 并使用Union来设置这个 object。

  • 最后,我们可以使用rng2.Interior.Color = vbGreen类的东西来为所有直接引用一个单元格的单元格着色。

希望有帮助。 我绝不是 RegEx 专家,它可能做得更简单。


关于我为什么使用Like运算符的一些背景信息。 因为我想确保没有对单元格引用进行计算,所以等式中的第一个字符不能是数字。 在 RegEx 中,你得到了一种叫做“lookahead”的东西。 虽然,不幸的是,我无法让表达式与 VBA (不受支持?)一起使用,因此使用Like运算符来确保第二个字符不是数字。

使用公式(.HasFormula)通过所有单元格创建到 go 的循环,将单元格的公式文本作为字符串,获取除第一个字符(RIGHT(文本,(LEN(文本)-1))之外的所有公式文本,然后测试该字符串是否为有效范围。 如果不是,那么单元格中还有更多内容,然后是“只是一个简单的参考”。 祝你好运找出代码:)

Conditional Formatting中使用FORMULATEXT() function 自动突出显示包含您的公式的单元格。 请参阅下面的Conditional Formatting公式

=OR(FORMULATEXT(A1)="=Sheet1!D20",FORMULATEXT(A1)="=D20")

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM