Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Excel公式解析和提取单元格引用?_C#_Excel_Vba_Vsto - Fatal编程技术网

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

C# 从Excel公式解析和提取单元格引用?,c#,excel,vba,vsto,C#,Excel,Vba,Vsto,我希望从Excel公式中解析和提取单元格引用。假设我在单元格P5中有以下公式: 我正在寻找公式生成答案所涉及单元格位置的输出,即P1、P2、P3、P4、Q3,因为它们以其他形式的位置/表示也是可以接受的 我的问题是,是否有这样的解析器可以实现这一点,如果没有,我应该采用什么技术。也许我作为例子列出的公式非常简单,理想情况下,我希望涵盖所有可能的公式,甚至是那些在其他工作表和工作簿中有参考的公式。我期望并且非常希望得到一个基于VSTO C的解决方案,但在VSTO库中找到一个或甚至相关的功能却非常困

我希望从Excel公式中解析和提取单元格引用。假设我在单元格P5中有以下公式:

我正在寻找公式生成答案所涉及单元格位置的输出,即P1、P2、P3、P4、Q3,因为它们以其他形式的位置/表示也是可以接受的

我的问题是,是否有这样的解析器可以实现这一点,如果没有,我应该采用什么技术。也许我作为例子列出的公式非常简单,理想情况下,我希望涵盖所有可能的公式,甚至是那些在其他工作表和工作簿中有参考的公式。我期望并且非常希望得到一个基于VSTO C的解决方案,但在VSTO库中找到一个或甚至相关的功能却非常困难。

对于简单的公式:

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
遗憾的是,这种简单的方法不能适用于所有公式。它很容易被间接引用和表外引用所愚弄

编辑1:

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

宏非常易于安装和使用:

ALT-F11将显示VBE窗口 ALT-I ALT-M打开一个新模块 粘贴内容并关闭VBE窗口 如果保存工作簿,宏将与工作簿一起保存。 如果在2003年以后使用Excel版本,则必须保存 文件的格式为.xlsm而不是.xlsx

要删除宏,请执行以下操作:

如上所述打开VBE窗口 清除代码 关闭VBE窗口 要使用Excel中的宏,请执行以下操作:

ALT-F8 选择宏 触跑 要了解有关宏的更多信息,请参阅:

必须启用宏才能使其工作

几年前,我开始使用一个真正的解析器作为调试工具,但最终完成了任务。

对于简单公式:

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
遗憾的是,这种简单的方法不能适用于所有公式。它很容易被间接引用和表外引用所愚弄

编辑1:

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

宏非常易于安装和使用:

ALT-F11将显示VBE窗口 ALT-I ALT-M打开一个新模块 粘贴内容并关闭VBE窗口 如果保存工作簿,宏将与工作簿一起保存。 如果在2003年以后使用Excel版本,则必须保存 文件的格式为.xlsm而不是.xlsx

要删除宏,请执行以下操作:

如上所述打开VBE窗口 清除代码 关闭VBE窗口 要使用Excel中的宏,请执行以下操作:

ALT-F8 选择宏 触跑 要了解有关宏的更多信息,请参阅:

必须启用宏才能使其工作


几年前,我开始研究一个真正的解析器作为调试工具,但最终完成了这项任务。

从公式中寻找先例的完整解决方案是一项挑战:即使是Excel的先例工具也不能很好地完成这项工作。
对于使用c try的起点来说,从公式中寻找先例的完整解决方案是一个挑战:即使是Excel的先例工具也不能很好地完成这项工作。
要了解使用c的起点,请尝试

谢谢您的回答。你能给你的VBA代码添加一些解释吗?我不是一个VBA的人,我更希望有一个C的解决方案,所以这将有助于我进行下去!此外,我们还将感谢您为我们指出如何克服解决方案的局限性。@Zeruno请参阅我的编辑1感谢您的回答。你能给你的VBA代码添加一些解释吗?我不是一个VBA的人,我更希望有一个C的解决方案,所以这将有助于我进行下去!此外,对于如何克服解决方案局限性的指点,我们也将不胜感激。@Zeruno请参阅我的EDIT1