感谢@TimWilliams和@brettdj指引我找到了关于这个主题的先前讨论,我可以自信地说:
否,Excel没有解析的方法。
然而,对于我的相当简单的目的,我想出了一些可行的方法,可以处理跨工作表引用,并且可以从UDF中调用。
然而,它非常脆弱,有许多完全合法的公式,我肯定它无法正确处理。
代码很混乱,但可以大大改进,但我只是想把它放在这里,因为我现在要转移到其他事情上了...
编辑
此外,我还发现了这个,看起来非常有趣:
http://www.dailydoseofexcel.com/archives/2009/12/05/formula-tokenizer/
Public Function CellPrecedents(cell As Range) As Variant()
Dim resultRanges As New Collection
If cell.Cells.count <> 1 Then GoTo exit_CellPrecedents
If cell.HasFormula = False Then GoTo exit_CellPrecedents
Dim formula As String
formula = Mid(cell.formula, 2, Len(cell.formula) - 1)
If IsRange(formula) Then
resultRanges.Add Range(formula), 1
Else
Dim elements() As String
'Debug.Print formula & " --> "
formula = Replace(formula, "(", "")
formula = Replace(formula, ")", "")
'Debug.Print formula & " --> "
elements() = SplitMultiDelims(formula, "+-*/\^")
Dim n As Long, count As Integer
For n = LBound(elements) To UBound(elements)
If IsRange(elements(n)) Then
'ACTUALLY JUST DO A REDIM PRESERVE HERE!!!!
count = count + 1
'resultRanges.Add Range(Trim(elements(n))) '<--- Do **NOT** store as a range, as that gets automatically Eval()'d
resultRanges.Add Trim(elements(n))
End If
Next
End If
Dim resultRangeArray() As Variant
ReDim resultRangeArray(resultRanges.count)
Dim i As Integer
For i = 1 To resultRanges.count
resultRangeArray(i) = CStr(resultRanges(i)) '// have to store as a string so Eval() doesn't get invoked (I think??)
Next
CellPrecedents = resultRangeArray
exit_CellPrecedents:
Exit Function
End Function
Public Function IsRange(var As Variant) As Boolean
On Error Resume Next
Dim rng As Range: Set rng = Range(var)
If err.Number = 0 Then IsRange = True
End Function
(只需在Google中搜索SplitMultiDelims即可找到该函数)
NavigateArrows
ж–№жі•жқҘиҜҶеҲ«и·ЁиЎЁж јеј•з”ЁгҖӮжҲ‘еңЁиҝҷйҮҢдҪҝз”ЁдәҶиҝҷз§Қж–№жі•й“ҫжҺҘпјҢеҲқе§Ӣд»Јз Ғзҡ„еҠҹеҠіеҪ’дәҺBill ManvilleгҖӮ - brettdj