我希望从Excel公式中解析和提取单元格引用。假设我在单元格=SUM(P1:P4)+Q3
中有以下公式:
P1
我正在寻找公式所涉及的细胞位置的输出以产生答案,即P2
,P3
,P4
,Q3
,{ {1}}作为输出(它们的位置/表示形式也可以接受)。
我的问题是,是否有这样的解析器可以实现这一点,如果没有,我应该采用什么技术。也许我列举的公式非常简单,我希望能够涵盖所有可能的公式,甚至可能涵盖其他表和工作簿中的公式。我期望并且真的希望有一个基于VSTO C#的解决方案,但我很难在VSTO库中找到一个甚至相关的功能。
答案 0 :(得分:1)
对于简单公式:
Sub PrettyPoorParser()
Dim r As Range, rr As Range
With Range("D4")
Set r = .DirectPrecedents
msg = r.Count
For Each rr In r
msg = msg & vbCrLf & rr.Address(0, 0)
Next rr
End With
MsgBox msg
End Sub
可悲的是,这种简单的方法不适用于所有公式。使用 INDIRECT()和表外引用很容易被愚弄。
修改#1:强>
它不使用递归下降解析器,而是使用Range对象的属性。这个属性非常好,但不全面。关于在VBA-EXCEL环境中运行此代码:
宏非常易于安装和使用:
如果保存工作簿,宏将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
删除宏:
要使用Excel中的宏:
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
必须启用宏才能使其生效!
多年前,我开始研究一个真正的解析器(作为一个调试工具),但是已经完成了这项任务。
答案 1 :(得分:1)
从公式中查找先例的完整解决方案具有挑战性:即使Excel的先例工具也无法做到这一点。 使用c#尝试https://github.com/spreadsheetlab/XLParser
作为起点