2008-08-29 68 views
5

我們有幾個非常大的Excel工作簿(數十個選項卡,每個超過一個MB,非常複雜的計算)與許多數十個,也許數百個使用可怕的INDIRECT函數的公式。這些公式分散在整個工作簿中,並針對幾個數據表來查找值。Excel:由INDIRECT公式定位的列表範圍

現在我需要將這些公式的目標數據範圍移動到同一工作簿中的不同位置。

(原因並不特別相關,但它本身很有趣,我們需要在Excel Calculation Services中運行這些功能,並且每次加載每個相當大的表的延遲時間被證明是高得令人無法接受的。我們將表移動到一個連續的範圍內,這樣我們就可以一次性加載它們。)

有什麼方法可以找到所有目前指向我們要移動的表的INDIRECT公式嗎?

我不需要這樣在線。只要可靠,我會高興地採取需要4個小時才能運行的事情。

請注意,.precedent,.dependent等方法僅跟蹤直接公式。

(此外,重寫的電子表格不管是不是我們的選擇)。

謝謝!

+1

爲了好奇,該項目已完成(成功)。它需要100多個工時來手動分析,修改和重新測試所有的電子表格(我確實說他們很大!)。好吧,這並不像我聲稱的那麼糟糕:無論如何,我們都會進行大量的重新測試。 – 2011-01-12 21:46:01

回答

5

你可以遍歷使用VBA整個工作簿(我已經包括從@PabloG和@歐元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)」。如果您有更復雜的間接函數,您可以輕鬆地將替換函數替換爲更復雜的東西。性能並不差,即使是更大的工作簿。

+0

我接受這個答案,因爲它是得到選票的唯一答案,它提供了我們發現的唯一已知方法。完整的答案是*「不,Excel不支持爲您定位間接公式,您必須**使用VBA掃描自己。」*。對不起,我花了兩年時間... – 2011-01-12 21:37:46

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,你可以添加代碼,以滿足您的口味

0

不幸的是, 間接的論點通常較爲複雜比 。下面是從紙張的 一個實際的公式,而不是最 複雜的公式,我們有:

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

HM,你可以通過忽略大多數字符寫一個簡單的解析器,只是尋找相關部分(在本例中爲「A..Z」,「0..9」和「!:」等),但如果「間接」中的參數是函數,則會遇到麻煩。

也許更安全的方法是在第三張紙上打印「間接」的每一個出現。然後您可以添加所需的輸出並編寫一個小型搜索並替換程序,以便將更改寫回。

如果你「獲得」在一個巨大的電子表格 每一個細胞,你可能最終需要 滔天的內存。我 仍然願意嘗試,並採取 風險。

PabloG選擇使用範圍的方法是要走的路(將其添加到我的原始代碼中)。速度非常好,特別是如果您檢查當前單元格是否包含公式。顯然,這一切都取決於你的工作簿的大小。

1

問:「有沒有辦法找到所有目前引用我們要移動的表的INDIRECT公式?」

當我讀到它時,你想看看INDIRECT的參數來引用感興趣的區域。我寫VBA使用正則表達式解析器,甚至是一個簡單的INSTR來查找INDIRECT(向前讀取匹配),然後EVALUATE()裏面的字符串將其轉換爲實際地址,根據需要重複多次INDIRECT(...)調用並將公式轉換爲表格中的兩列。

0

我不確定SO的禮儀是關於提及作者所連接的產品的,但OAK,Operis分析工具包(Excel插件)可以通過單元格引用替換INDIRECT函數解決。然後,您可以使用Excel的審計工具來確定每個範圍都有哪些依賴項。

當然,您會這樣做到工作簿的臨時副本。

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

鑑於此問題的年齡,您可能已找到替代解決方案或解決方法。