5

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

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

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

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

我不需要在线执行此操作。只要它可靠,我会很乐意接受需要 4 个小时才能运行的东西。

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

(此外,以我们无法选择的方式重写电子表格) 。

谢谢!

4

5 回答 5

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

此示例将每次出现的“indirect(D4)”替换为“indirect(C4)”。如果您有更复杂的间接函数,您可以轻松地将替换函数替换为更复杂的函数。性能还不错,即使对于更大的工作簿也是如此。

于 2008-08-29T16:53:09.723 回答
1

问:“有什么方法可以找到当前引用我们要移动的表的所有 INDIRECT 公式?”

当我阅读它时,您想查看 INDIRECT 的参数内部以获取对感兴趣领域的引用。OTTOMH 我会编写 VBA 来使用正则表达式解析器,甚至是一个简单的 INSTR 来查找 INDIRECT(向前读取匹配),然后 EVALUATE() 里面的字符串将其转换为实际地址,根据需要重复多个 INDIRECT (...) 调用并将公式及其翻译转储到工作表中的两列。

于 2008-09-15T21:39:09.500 回答
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 您可以添加代码以满足您的口味

于 2008-08-29T17:03:21.883 回答
0

不幸的是,INDIRECT 的论点通常比这更复杂。这是其中一张纸的实际公式,而不是我们拥有的最复杂的公式:

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

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

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

如果您“获取”巨大电子表格中的每个单元格,您最终可能需要大量内存。我仍然愿意尝试并承担这个风险。

PabloG 选择使用范围的方法是可行的方法(将其添加到我的原始代码中)。速度相当不错,尤其是在检查当前单元格是否包含公式时。显然,这一切都取决于您的工作簿的大小。

于 2008-08-29T19:01:03.613 回答
0

我不确定 SO 的礼仪是关于提及与作者连接的产品的,但 OAK,Operis 分析工具包,一个 Excel 插件,可以用它们解析的单元格引用替换 INDIRECT 函数。然后,您可以使用 Excel 的审计工具来确定每个范围有哪些依赖项。

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

更多在

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

考虑到这个问题的年代久远,您很可能已经找到了替代解决方案或解决方法。

于 2009-09-15T19:34:07.110 回答