Excel:列出间接公式的目标范围

Excel:列出间接公式的目标范围,excel,vba,Excel,Vba,我们有一些非常大的Excel工作簿(几十个选项卡,每个选项卡超过1 MB,非常复杂的计算),其中有几十个,也许数百个公式使用可怕的间接函数。这些公式分布在整个工作簿中,并针对多个数据表查找值 现在,我需要将这些公式所针对的数据范围移动到同一工作簿中的不同位置 (原因并不特别相关,但本身就很有趣。我们需要在Excel Calculation Services中运行这些功能,每次加载一个相当大的表的延迟影响高得令人无法接受。我们正在连续移动表,以便一次加载所有表。) 有没有办法找到当前引用我们要移动

我们有一些非常大的Excel工作簿(几十个选项卡,每个选项卡超过1 MB,非常复杂的计算),其中有几十个,也许数百个公式使用可怕的间接函数。这些公式分布在整个工作簿中,并针对多个数据表查找值

现在,我需要将这些公式所针对的数据范围移动到同一工作簿中的不同位置

(原因并不特别相关,但本身就很有趣。我们需要在Excel Calculation Services中运行这些功能,每次加载一个相当大的表的延迟影响高得令人无法接受。我们正在连续移动表,以便一次加载所有表。)

有没有办法找到当前引用我们要移动的表的所有间接公式?

我不需要在网上做这件事。只要它可靠,我很乐意使用需要4小时才能运行的东西

请注意,.preference、.Dependent等方法仅跟踪直接公式

(同样,我们也不能选择以任何方式重写电子表格)


谢谢

您可以使用vba迭代整个工作簿(我已经包含了@PabloG和@euro-i中的代码):


本例用“间接(C4)”替换每次出现的“间接(D4)”。如果有更复杂的间接函数,则可以轻松地将replace函数替换为更复杂的函数。即使对于更大的工作簿,性能也没有那么差。

您可以在VBA中使用如下内容:

Sub ListIndirectRef()

Dim rRng As Range
Dim oSh As Worksheet
Dim oCell As Range

For Each oSh In ThisWorkbook.Worksheets
    Set rRng = oSh.UsedRange
    For Each oCell In rRng
        If InStr(oCell.Formula, "INDIRECT") Then
            Debug.Print oCell.Address, oCell.Formula
        End If
    Next
Next

End Sub
您可以根据自己的喜好添加代码,而不是Debug.Print

不幸的是 间接法通常比间接法更复杂 那个这里有一个实际的公式 一张床单,不是最多的 我们有复杂的公式:

=IF(间接(“”&$B$5&“!”&$O5&“1”)=“,”,间接(“”&$B$5&“!”&$O5&“1”)

嗯,您可以通过忽略大多数字符并只查找相关部分(在本例中为“a..Z”、“0..9”和“!:”等)来编写一个简单的解析器,但是如果“间接”中的参数是函数,您将遇到麻烦

也许更安全的方法是在第三张纸上打印“间接”的每一次出现。然后,您可以添加所需的输出,并编写一个小的搜索和替换程序来写回您的更改

如果你把每一个细胞都放在一个巨大的 您可能最终需要的电子表格 巨大的记忆量。我是 还愿意尝试接受吗 风险

PabloG选择所用范围的方法是正确的(将其添加到我的原始代码中)。速度非常好,特别是如果检查当前单元格是否包含公式。显然,这一切都取决于工作簿的大小。

Q:“有没有办法找到当前引用我们要移动的表的所有间接公式?”

正如我所读到的,您希望查看间接的参数,以查找对感兴趣的区域的引用。
OTTOMH我会编写VBA来使用正则表达式解析器,甚至是一个简单的INSTR来查找间接的(读取到匹配),然后计算()内部的字符串以将其转换为实际地址,根据需要重复多次间接(…)调用并将公式及其翻译转储到一张工作表中的两列。

我不确定SO的礼仪是关于提及作者所连接的产品,但OAK,Operis分析工具包,一个Excel外接程序,可以通过解析到的单元格引用来替换间接函数。然后,您可以使用Excel的审核工具来确定每个范围具有哪些依赖项

当然,您可以对工作簿的临时副本执行此操作

更多

  • http://www.operisanalysiskit.com/oakpruning.htm
  • http://www.operisanalysiskit.com/help/2007/index.html?oakconceptpruning.htm

考虑到这个问题的年龄,你很可能已经找到了另一种解决方案或变通方法。

我接受这个答案,因为这是唯一获得投票的答案,它确实提供了我们找到的唯一已知方法。完整的答案是“否,Excel不支持为您查找间接公式,您必须使用VBA扫描自己。”。很抱歉,我花了两年多的时间…您可以在上面的代码中节省4行(以及一些时间),将第4、5、6行(加上2个匹配的结束If)替换为:对于rRng中的每个j。SpecialCells(xlCellTypeFormulas)对于好奇者,项目已经完成(成功)。手动分析、修改和彻底重新测试所有电子表格(我确实说过它们很大!)花费了100多个工时。嗯,这并不像我刚才说的那么糟糕:不管怎样,我们都会进行广泛的重新测试。
Sub ListIndirectRef()

Dim rRng As Range
Dim oSh As Worksheet
Dim oCell As Range

For Each oSh In ThisWorkbook.Worksheets
    Set rRng = oSh.UsedRange
    For Each oCell In rRng
        If InStr(oCell.Formula, "INDIRECT") Then
            Debug.Print oCell.Address, oCell.Formula
        End If
    Next
Next

End Sub