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