gpt4 book ai didi

excel - Excel 有内置的公式解析方法吗? (即: to obtain a list of included RANGE references)

转载 作者:行者123 更新时间:2023-12-02 06:36:52 25 4
gpt4 key购买 nike

对于单元格中给定的 Excel 公式,我希望能够解析该公式,以便获取公式中包含的 Excel 范围引用的列表。

例如,如果我有一个包含以下公式的单元格:

= A + 25 + B  

....我希望能够获取公式中包含的 Excel 范围数组,因此在本例中,它将包含 [A] 和 [B]

“你为什么要这样做”?,我可以听到你在问:
我想要这样做的一个例子是查找公式中范围的“标签”......因此,与仅执行 CTRL+~ 来查看工作表中的公式不同,我想要以下选项以编程方式访问公式内的范围引用,以便查找目标范围旁边的标签。

因此,在上面的示例中,我可以编写如下公式:

=Offset(CellFormulaRanges('TheAddressMyFormulaIsIn',1),0,-1)
=Offset(CellFormulaRanges('TheAddressMyFormulaIsIn',2),0,-1)

...这将为我提供公式内第一个和第二个范围左侧的标签。

这样做必须调用 Excel 本身已有的一些功能,因为手动编写公式解析器是一项复杂的任务:
http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html

最佳答案

感谢 @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

(只需谷歌 SplitMultiDelims 即可获得该功能)

关于excel - Excel 有内置的公式解析方法吗? (即: to obtain a list of included RANGE references),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com