从Excel公式中解析和提取单元格引用?

时间:2018-05-27 16:17:33

标签: c# excel excel-vba vsto spreadsheet vba

我希望从Excel公式中解析和提取单元格引用。假设我在单元格=SUM(P1:P4)+Q3 中有以下公式:

P1

我正在寻找公式所涉及的细胞位置的输出以产生答案,即P2P3P4Q3,{ {1}}作为输出(它们的位置/表示形式也可以接受)。

我的问题是,是否有这样的解析器可以实现这一点,如果没有,我应该采用什么技术。也许我列举的公式非常简单,我希望能够涵盖所有可能的公式,甚至可能涵盖其他表和工作簿中的公式。我期望并且真的希望有一个基于VSTO C#的解决方案,但我很难在VSTO库中找到一个甚至相关的功能。

2 个答案:

答案 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

enter image description here

可悲的是,这种简单的方法不适用于所有公式。使用 INDIRECT()和表外引用很容易被愚弄。

修改#1:

它不使用递归下降解析器,而是使用Range对象的属性。这个属性非常好,但不全面。关于在VBA-EXCEL环境中运行此代码:

宏非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,宏将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除宏:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 要使用Excel中的宏:

      1. ALT-F8
      2. 选择宏
      3. 触碰RUN
      4. 要了解有关宏的更多信息,请参阅:

        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

作为起点