题
我们有一些非常大的Excel工作簿(几十个标签,在一个MB的每一个,非常复杂的计算)与许多几十人,也许数百名的公式,使用的可怕的间接的功能。这些公式散布在整个工作簿和目标的几个表中的数据来看看-为值。
现在我需要移动范围的数据,目标是通过这些公式不同的位置,在同样的工作手册。
(因为不特别相关,但是有趣的在其自己的。我们需要运行这些东西在Excel的计算服务和延迟命中装载的每一个相当大的表一个在一段时间证明是高得无法接受。我们正在表在一系列相邻,所以我们可以载入所有中一枪。)
是否有任何办法找到所有间接的公式,目前参照表,我们要移动?
我不需要这样做。我将愉快地带的东西,需要4个小时运行,只要它是可靠的。
要知道的.先例.依赖等方法只有轨道的直接公式。
(此外,重写电子表格中 不管 是不是一种选择对于美国)。
谢谢!
解决方案
你可以循环整个工作簿的使用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
这个例子substitues每次发生的"间接(D4)"与"间接(C4)".你可以很容易地交换更换功能与一些更复杂的,如果你有更多的复杂间接的功能。表现不是那么糟糕,甚至更大的工作簿。
其他提示
问:"有没有办法找到所有间接的公式,目前参照表,我们要移动?"
因为我读它,你想看看里面的辩论的间接引用感兴趣的领域。OTTOMH我会写VBA使用一个定期表达式分析器,或者甚至一个简单的仪表,以找到间接的(阅读前的匹配),然后评估()串的内部转换到实际地址,重复所需的多种间接的(...)电话和倾倒式及其翻译为两个列表。
你可以用这样的事情在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
而不是调试。打印的你可以添加码到适合你的口味
不幸的是,论据的 间接通常是复杂得多 那。这是一个实际的公式 一个表,不大 复杂的公式,我们有:
=IF(INDIRECT("'"&$B$5&"'!"&$O5&"1")="","",INDIRECT("'"&$B$5&"'!"&$O5&"1"))
嗯,你可以写一个简单的分析器通过忽视大多数人物和我只是在寻找的相关部分(在这个例子:"A..Z"、"0..9"和"!:" 等等)。 但是你将遇到麻烦,如果辩论在"间接"的功能。
也许比较安全的做法是将打印的每一个发生的"间接"在第三片。你可以再添加所需要的输出和编写一个小的搜索和替代程序编写更改回来。
如果你的"搞定"每个细胞都在一个巨大的 电子表格你可能会需要 可怕量的存储器。我 仍然愿意尝试采取这 风险。
PabloG的选择方法的使用范围的方式去(加入到我原来的码)。速度是相当不错,尤其是如果你检查是否是当前的单元包含一个公式。显然,这一切都取决于你的工作簿。
我不确定什么样的礼节的所以是关于提及的产品,其作者是连接,但橡,Operis分析工具、Excel程序中,可代替的间接功能的细胞引用他们的决心。然后可以使用Excel的审计工具,以确定受抚养者的每一个范围。
你会的,当然,这样做是为一个临时的复制的工作簿。
更多
- http://www.operisanalysiskit.com/oakpruning.htm
- http://www.operisanalysiskit.com/help/2007/index.html?oakconceptpruning.htm
鉴于时代的这个问题,你可能已经找到一个替代解决方案或解决方法。