在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)+))
这会:
- search可选的外部链接:
(['].*?['!])?
- search可选的纸张参考:
([[A-Z0-9_]+[!])?
- 按照优先次序执行以下步骤:
- 用行号search范围(和可选$):
\$?[AZ]+\$?(\d)+(:\$?[AZ]+\$?(\d)+)?
- search范围没有行号(和可选的$):
\$?[AZ]+:\$?[AZ]+
- 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”