Excel 从公式中提取单元格地址

Excel 从公式中提取单元格地址,excel,vba,excel-formula,Excel,Vba,Excel Formula,我正在寻找一种从公式中提取地址/范围的方法。我在下面创建了一个示例公式 =SUMIFS(Worksheet_Name!$C$3:$C$20, Worksheet_Name!$A$3:$A$20, "Blue", Worksheet_Name!$B$3:$B$20, "Green") 我试图得到某种VBA例程,我可以把公式分离出来 我想得到如下范围: Worksheet_Name!$C$3:$C$20 Worksheet_Name!$A$3:$A$20 Worksheet_Name!$B$3

我正在寻找一种从公式中提取地址/范围的方法。我在下面创建了一个示例公式

=SUMIFS(Worksheet_Name!$C$3:$C$20, Worksheet_Name!$A$3:$A$20, "Blue", Worksheet_Name!$B$3:$B$20, "Green")
我试图得到某种VBA例程,我可以把公式分离出来

我想得到如下范围:

Worksheet_Name!$C$3:$C$20

Worksheet_Name!$A$3:$A$20

Worksheet_Name!$B$3:$B$20

因此,我可以单独访问这些内容。

下面如何,这将以一个单元格作为输入,然后它将去掉括号外的任何内容,并用逗号将公式的其余部分拆分为一个数组,然后它将显示在Msgbox中,但您可以根据需要进行调整:

Sub Get_Ranges_In_Formula()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
'declare the worksheet you are working with
Dim rngs As String
Dim arrayofRngs

cellvalue = ws.Range("A1").Formula
'get the formula from the cell

openingParen = InStr(cellvalue, "(")
closingParen = InStrRev(cellvalue, ")")
rngs = Mid(cellvalue, openingParen + 1, closingParen - openingParen - 1)
'strip anything outside the brackets

arrayofRngs = Split(rngs, ",")
'split by comma into array

For i = LBound(arrayofRngs) To UBound(arrayofRngs)
    If InStr(arrayofRngs(i), "!") > 0 Then MsgBox arrayofRngs(i)
Next
End Sub
使用正则表达式从公式中提取单元格引用的解决方案:

Sub Get_Ranges_In_Formula()
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
    Dim xRetList As Object
    Dim xRegEx As Object
    Dim I As Long
    Dim xRet As String
    Dim Rg As Range

    Set Rg = ws.Range("A1")
    Application.Volatile
    Set xRegEx = CreateObject("VBSCRIPT.REGEXP")
    With xRegEx
        .Pattern = "('?[a-zA-Z0-9\s\[\]\.]{1,99})?'?!?\$?[A-Z]{1,3}\$?[0-9]{1,7}(:\$?[A-Z]{1,3}\$?[0-9]{1,7})?"
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
    End With
    Set xRetList = xRegEx.Execute(Rg.Formula)
    If xRetList.Count > 0 Then
        For I = 0 To xRetList.Count - 1
            MsgBox xRetList.Item(I)
        Next
    End If
End Sub
试试这个

Sub Test()
    Dim e, s As String
    s = MyArguments(Range("A1"))
    For Each e In Split(s, ",")
        If InStr(e, "!") Then Debug.Print Trim(e)
    Next e
End Sub

Function MyArguments(rng As Range) As String
    MyArguments = Split(Split(rng.Formula, "(")(1), ")")(0)
End Function

是的,你已经解决了一些公式,比如例子sumifs。是的,你已经解决了一些公式,比如例子sumifs。然而,我永远不知道我在使用什么样的公式;例如,它可以是:=Sum(A1:A2)+Sum(A3:A4),这将不起作用。此外,它可能是索引匹配等。因此,在拆分“,”时可能不需要这样做solution@JamesGTaylor我的更新解决方案现在应该适用于两个公式示例,…)如果您有office 365,请查看
FORMULATEXT
。查看