在Excel公式中查找所有使用的引用

下面是在Excel中设置的例子,

[column1] [column2] A1 =C3-C5 A2 =((C4-C6)/C6) A3 =C4*C3 A4 =C6/C7 A5 =C6*C4*C3 

我需要提取公式中使用的参考

例如,

 for "A1", I simply need to get the C3 and C5. for A2, I need to get the C4 and C6. 

这是对以下内容的更新:

将适用于本地工作表参考,但不适用于表外参考。 – brettdj 14年14月14日在11:55

通过使用Larrys方法,只需将objRegEx.Pattern更改为:

 (['].*?['!])?([[A-Z0-9_]+[!])?(\$?[AZ]+\$?(\d)+(:\$?[AZ]+\$?(\d)+)?|\$?[AZ]+:\$?[AZ]+|(\$?[AZ]+\$?(\d)+)) 

这会:

  1. search可选的外部链接: (['].*?['!])?
  2. search可选的纸张参考: ([[A-Z0-9_]+[!])?
  3. 按照优先次序执行以下步骤:
  4. 用行号search范围(和可选$): \$?[AZ]+\$?(\d)+(:\$?[AZ]+\$?(\d)+)?
  5. search范围没有行号(和可选的$): \$?[AZ]+:\$?[AZ]+
  6. search1单元格引用(和可选$): (\$?[AZ]+\$?(\d)+)

造成这种情况:

 Sub testing() Dim result As Object Dim r As Range Dim testExpression As String Dim objRegEx As Object Set r = Cells(1, 2) ' INPUT THE CELL HERE , eg RANGE("A1") Set objRegEx = CreateObject("VBScript.RegExp") objRegEx.IgnoreCase = True objRegEx.Global = True objRegEx.Pattern = """.*?""" ' remove expressions testExpression = CStr(r.Formula) testExpression = objRegEx.Replace(testExpression, "") objRegEx.Pattern = "(([AZ])+(\d)+)" 'grab the address objRegEx.Pattern = "(['].*?['!])?([[A-Z0-9_]+[!])?(\$?[AZ]+\$?(\d)+(:\$?[AZ]+\$?(\d)+)?|\$?[AZ]+:\$?[AZ]+|(\$?[AZ]+\$?(\d)+))" If objRegEx.test(testExpression) Then Set result = objRegEx.Execute(testExpression) If result.Count > 0 Then For Each Match In result Debug.Print Match.Value Next Match End If End If End Sub 

这样做,会给你所有可能的参考值,我可以想到。 (更新这个post,因为我需要解决问题)。

这个函数返回一个逗号分隔的源单元格列表(先例):

函数引用(rngSource作为范围)作为变体
     Dim rngRef As Range
     Dim strTemp As String
    在错误恢复下一步
    对于rngSource.Precedents.Cells中的每个rngRef
         strTemp = strTemp&“,”&rngRef.Address(False,False)
    下一个
    如果Len(strTemp)0则strTemp = Mid(strTemp,3)
    引用= strTemp
结束function

但是,请注意,您不能在工作表中将其用作UDF,因为rngRef.Address不幸会导致循环引用。 但是,您可以在一个小程序中使用它来填充另一列,例如

 Sub ShowPrecedents()
    昏暗的范围
     '将A1:A6的先例粘贴到D1:D6中
    对于范围内的每一个(“D1:D6”)
         rng.Value =参考文献(rng.Offset(,-3))
    下一个
结束小组

只是为您提供一个替代scheme…请注意,如果不止一次调用单元格,这将返回重复的结果

 Sub testing() Dim result As Object Dim r As Range Dim testExpression As String Dim objRegEx As Object Set r = Cells(1, 2) ' INPUT THE CELL HERE , eg cells("A1") Set objRegEx = CreateObject("VBScript.RegExp") objRegEx.IgnoreCase = True objRegEx.Global = True objRegEx.Pattern = """.*""" ' remove expressions testExpression = CStr(r.Formula) testExpression = objRegEx.Replace(testExpression, "") objRegEx.Pattern = "(([AZ])+(\d)+)" 'grab the address If objRegEx.test(testExpression) Then Set result = objRegEx.Execute(testExpression) If result.Count > 0 Then For Each Match In result Debug.Print Match.Value Next Match End If End If End Sub 

结果存储在“Match.Value”