我们有一些非常大的Excel工作簿(几十个选项卡,每个MB,非常复杂的计算),有许多,可能有数百个使用可怕的INDIRECT函数的公式。这些公式遍布整个工作簿,并针对几个数据表来查找值。
现在我需要将这些公式所针对的数据范围移动到同一工作簿中的不同位置。
(原因并不是特别相关,但它本身很有趣。我们需要在Excel Calculation Services中运行这些东西,并且每次加载一个相当大的表的延迟时间被证明是高得令人无法接受的。我们将表格移动到一个连续的范围内,这样我们就可以一次性加载它们。)
有没有办法找到目前引用我们想要移动的表的所有INDIRECT公式?
我不需要在线完成此操作。只要它可靠,我会高兴地拿走需要4个小时的东西。
请注意。。Precedent,.Dependent等方法只跟踪直接公式。
(另外,重写中的电子表格对我们来说不是一个选项。)
谢谢!
答案 0 :(得分:5)
您可以使用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
此示例将每次出现的“间接(D4)”替换为“间接(C4)”。如果您有更复杂的间接功能,您可以轻松地将替换功能与更复杂的功能交换。即使对于更大的工作簿,性能也不差。
答案 1 :(得分:1)
问:“有没有办法找到目前引用我们想要移动的表的所有INDIRECT公式?”
当我读到它时,你想要查看INDIRECT的参数,以获得对感兴趣区域的引用。 OTTOMH我写VBA使用正则表达式解析器,甚至是一个简单的INSTR来查找INDIRECT(读取前进到匹配),然后EVALUATE()里面的字符串将其转换为实际地址,根据需要重复多个INDIRECT (...)调用并将公式及其转换转储到工作表中的两列。
答案 2 :(得分:0)
你可以在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
答案 3 :(得分:0)
嗯,您可以通过忽略大多数字符并只查找相关部分来编写一个简单的解析器(在此示例中:“A..Z”,“0..9”和“!:”等)但如果“间接”中的参数是函数,你就会遇到麻烦。不幸的是,论点 间接通常比复杂 那。这是一个实际的公式 其中一张,不是最多的 我们有一个复杂的公式:
=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))
也许更安全的方法是在第三张纸上打印“间接”的每一个。然后,您可以添加所需的输出并编写一个小的搜索并替换程序以写回您的更改。
如果你“得到”巨大的每个细胞 您可能最终需要的电子表格 巨大的记忆力。我是 仍然愿意尝试并采取这一点 风险。
PabloG选择使用范围的方法是可行的方法(将其添加到我的原始代码中)。速度非常好,特别是如果检查当前单元格是否包含公式。显然,这一切都取决于工作簿的大小。
答案 4 :(得分:0)
我不确定SO的礼节是关于提及作者所连接的产品的问题,但OAK,Operis分析工具包,Excel插件,可以通过他们解决的单元格引用替换INDIRECT函数至。然后,您可以使用Excel的审计工具来确定每个范围的依赖项。
当然,您可以将此作为工作簿的临时副本。
更多
考虑到这个问题的年龄,您可能已经找到了替代解决方案或解决方法。