Excel:由INDIRECT公式定位的列表范围

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

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

(其原因并不特别相关,但本身就很有趣,我们需要在Excel Calculation Services中运行这些东西,并且每次加载每个相当大的表的延迟时间被certificate是高得令人无法接受的。表格在一个连续的范围内,所以我们可以一次加载它们。)

有没有办法find所有目前引用我们要移动的表的INDIRECT公式?

我不需要在网上做这个。 只要可靠,我会乐意接受需要4个小时才能运行的东西。

请注意,.precedent,.dependent等方法只跟踪直接的公式。

(另外,重写电子表格不pipe是我们的select)。

谢谢!

你可以遍历整个工作簿使用vba(我已经包含@PabloG和@ euro-micelli的代码):

Sub iterateOverWorkbook() For Each i In ThisWorkbook.Worksheets Set rRng = i.UsedRange For Each j In rRng If (Not IsEmpty(j)) Then If (j.HasFormula) Then If InStr(oCell.Formula, "INDIRECT") Then j.Value = Replace(j.Formula, "INDIRECT(D4)", "INDIRECT(C4)") End If End If End If Next j Next i End Sub 

这个例子用“间接(C4)”代替“间接(D4)”的每一次出现。 如果你有更复杂的间接函数,你可以很容易地把replace函数换成更复杂的东西。 性能并不差,即使是更大的工作簿。

问:“有没有办法find所有目前引用我们要移动的表的INDIRECT公式?

当我阅读它的时候,你想看看INDIRECT的参数来引用感兴趣的领域。 OTTOMH我写VBA使用正则expression式分析器,甚至是一个简单的INSTR来查找INDIRECT(向前读取匹配),然后EVALUATE()里面的string将其转换为实际地址,根据需要重复多个INDIRECT (…)调用并将公式转换成表格中的两列。

你可以在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,你可以添加代码来适应你的口味

不幸的是,INDIRECT的论点通常比这更复杂。 以下是其中一个表单的实际公式,而不是我们所拥有的最复杂的公式:

=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))

嗯,你可以写一个简单的parsing器忽略大部分的字符,只是寻找相关的部分(在这个例子中:“A..Z”,“0..9”和“!:”等),但你会如果“间接”的论据是function,就会遇到麻烦。

也许更安全的方法是在第三张纸上打印“间接”的每一个发生。 你可以添加所需的输出,并写一个小的search和replace程序来写回你的修改。

如果你“获得”一个庞大的电子表格中的每个单元格,你可能最终需要巨大的内存量。 我仍然愿意尝试冒这个险。

PabloGselect使用范围的方法是要走的路(将其添加到我的原始代码中)。 速度是相当不错的,特别是如果您检查当前单元格是否包含公式。 显然,这一切都取决于你的工作簿的大小。

我不确定SO的礼节是关于作者所连接产品的提及,但OAK,Operis分析工具包(一个Excel加载项)可以通过他们parsing的单元格引用replaceINDIRECTfunction。 然后,您可以使用Excel的审计工具来确定每个范围的依赖关系。

当然,你会这样做的工作簿的临时副本。

更多

鉴于这个问题的年龄,你可能已经find了替代解决scheme或解决方法。