EXCEL:测试单元格是否在其公式中使用其他单元格

EXCEL:测试单元格是否在其公式中使用其他单元格

我试图有条件地格式化那些值不依赖于其他任何东西的单元格,所以我认为应用于ISFORMULA每个单元格都可以解决问题,但后来意识到如果一个单元格有类似的东西=10^23,那么它也将是一个公式,即使它的值是恒定的。

带有公式的单元格=10+5会使我所查找的函数返回 FALSE,而带有公式的单元格=A5+3会使我所查找的函数返回 TRUE。

答案1

这是一个在大多数情况下都可以工作的 UDF:

Function HAS_REF(r As Range) As Boolean
    HAS_REF = (r.Formula <> r.FormulaR1C1)
End Function

Formula除非范围包含单元格引用,否则范围的和属性FormulaR1C1恰好相同。

例外:如果单元格包含对命名范围的引用,则两者将相等并且您的单元格将不会突出显示。

更新:

这是一个也检查范围名称的版本:

Function HAS_REF(r As Range) As Boolean
    Dim i As Long

    HAS_REF = (r.Formula <> r.FormulaR1C1)

    If HAS_REF Then Exit Function

    For i = 1 To ThisWorkbook.Names.Count
        If InStr(r.Formula, ThisWorkbook.Names(i).Name) Then
            HAS_REF = True
            Exit Function
        End If
    Next i
End Function

当然,如果您在工作簿中不使用范围名称,那么我之前发布的函数就足够了。

关于Precedents属性:

我尝试使用Precedents范围的属性来检查引用。但似乎不起作用。我尝试了以下方法:

  • 直接r.Precedents在 UDF 中使用来检查范围是否有任何先例。将其分配给范围变量只是分配了r(而不是r.Precedents)。

  • 使用辅助子程序通过从函数调用子程序来进行实际检查。这也不起作用。但是,当您注释掉函数中调用子程序的行时,子程序可以正常工作并正确检查先例。

  • 尝试使用 UDF 和辅助子程序都可以访问的全局变量。没什么区别。

相关内容