Excel VBA:比较两个单元格的公式/公式结构

时间:2018-04-19 10:05:13

标签: excel vba excel-vba excel-formula

我正在尝试编写一个代码,我测试两个单元格中的公式/公式结构是否具有可比性。该代码的目的是检查一个单元格中的公式是否已从例如左边的单元格或上面的单元格。因此,我需要测试公式的结构是否相同,如果绝对单元格引用是相同的,并且相对单元格引用的更改与复制单元格时相同。

例:
假设Sheet2中的Cell B5包含公式“= Sheet1! B3 + $ A $ 1/10”。然后我想检查单元格C5是否包含公式“= Sheet1! C3 + $ A $ 1/10”并且结果为true / false。

我知道发布您在这里工作的代码是习惯做法,但我不确定这种情况是否有益或者只是令人困惑。到目前为止,我尝试了三种方法:

  1. 跟踪原始单元格的直接先例(假设上面的例子中的B5),偏移它们并在从B5中提取的公式中替换它们,并检查公式是否等于C5中的公式。 不起作用,因为跟踪先例无法处理表外引用。

  2. 使用RegExp获取公式中的所有单元格引用。偏移这些参考并将其替换为从B5中提取的公式,并测试该公式是否等于C5。如果我能够完成它,这种方法可能会有效,但它将是一个非常庞大和复杂的子,有大量的文本处理和大量的工作,我怀疑有一个更容易的方法。

  3. 使用“帮助”表格,我将单元格B5复制到C5,并检查公式是否等于单元格C5中的原始公式。它会工作,但如果我想检查一个大范围/表,需要花很多时间。

  4. 有人有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这样的东西
Option Explicit

Sub test()
    Debug.Print SameFormula(Range("B8"), Range("C8"))
End Sub

Public Function SameFormula(ByVal rng1 As Range, ByVal rng2 As Range) As Boolean
    If rng1.HasFormula And rng2.HasFormula Then
        SameFormula = rng1.FormulaR1C1 = rng2.FormulaR1C1
    Else
        SameFormula = False
    End If
End Function

B8的=Sheet1!B3+$A$1/10和C8的=Sheet1!C3+$A$1/10。你可以调整这个想法。

没有早期版本的HasFormula:

Public Function SameFormula2(ByVal rng1 As Range, ByVal rng2 As Range) As Boolean
    If Left$(rng1.Formula, 1) = "=" And Left$(rng2.Formula, 1) = "=" Then
        SameFormula2 = rng1.FormulaR1C1 = rng2.FormulaR1C1
    Else
        SameFormula2 = False
    End If
End Function