2008-08-29 11 views
5

恐ろしい間接関数を使用する数多くの数式、おそらく何百種類もの数多くの非常に大きなExcelワークブック(数十のタブ、それぞれMB以上の非常に複雑な計算)があります。これらの数式は、ワークブック全体に分散され、いくつかのデータテーブルを対象にして値を参照します。Excel:間接式の対象範囲リスト

ここでは、これらの式の対象となるデータの範囲を同じブックの別の場所に移動する必要があります。

(理由はそれほど重要ではありませんが、Excel Calculation Servicesでこれらの処理を実行する必要があります。また、大規模なテーブルを一度に1つずつロードするレイテンシには許容できないほど高くなります。

私たちが移動したいテーブルを現在参照しているすべての間接式を見つける方法はありますか?いいえ、移動しないでください。

私はこれをオンラインで行う必要はありません。私は喜んでそれが信頼できる限り実行するために4時間かかります。

.Precedent、.Dependentなどのメソッドは直接式だけを追跡することに注意してください。

のスプレッドシートを書き換えても、は私たちの選択肢ではありません)。

ありがとうございます!

+1

不思議なことに、プロジェクトは完了しました(正常に完了しました)。手動ですべてのスプレッドシートを分析、修正、再テストするには100時間を要しました(私は大きかったと言っていました)。まあ、私はちょうどそれを鳴らしたようにそれほど悪くはない:私たちは、関係なく、大規模な再テストを行っただろう。 –

答えて

5

あなたは、VBAを使用して全体のワークブック(私は@PabloGからコードを含め、ユーロ-micelli @き)を反復処理することができます:この例では、と「間接(D4)」のすべての発生をsubstitues

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)」。より複雑な間接関数があれば、replace-functionをより洗練されたものに簡単に交換することができます。大きなワークブックの場合でも、パフォーマンスはそれほど悪くありません。

+0

私はこの回答を受け入れています。なぜなら、投票した唯一の回答であり、私たちが見つけた唯一の既知の方法を提供しているからです。完全な答えは* "いいえ、Excelは間接的な公式を見つけることをサポートしておらず、**自分でVBAを使って自分自身をスキャンする必要があります。申し訳ありませんが、2年以上私にかかってしまいました... –

+1

上記のコードでは、4,5,6行(2つの一致するEnd If)を置き換えて、4行(時間切れ)を保存することができます。For Each j In rRng.SpecialCells (xlCellTypeFormulas) –

0

あなたはVBAでこのようなものを使用することができます。代わりにあなたがコードを追加することができます。Debug.Printの

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 

0

残念なことに、間接 の引数は通常より複雑であるあなたの好みに合うようにその より。ここでは、シートの 1から実際の式ではなく、我々が持っている最も 複雑な式です:

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

HMは、あなたは、文字のほとんどを無視し、ちょうどを探すことにより、簡単なパーサを書くことができます(この例では "A..Z"、 "0..9"、 "!:"など)、間接の引数が関数であれば問題に遭遇します。

より安全なアプローチは、3番目のシートに「間接」のすべての出現を印刷することです。次に、希望の出力を追加し、小さな検索を書き込んでプログラムを置き換えて、変更を書き戻すことができます。

あなたは、メモリの 巨大な量を必要とするに終わるかもしれない巨大な スプレッドシート内のすべてのセルを「取得」した場合。私は まだそれを取ると喜んでしようとしている リスク。

PabloGが使用する範囲を選択する方法は、元のコードに追加する方法です。現在のセルに数式が含まれているかどうかを確認すると、速度はかなり良いです。明らかに、これはすべてあなたのワークブックのサイズに依存します。

1

Q:「現在移動したいテーブルを参照しているすべての間接式を見つける方法はありますか?」

私が読んでいるように、関心のある領域への参照については、INDIRECTの引数を調べたいと思っています。 OTTOMH私は正規表現パーサ、あるいはINDIRECT(一致するものを読み込む)を見つけるための単純なINSTRを使ってVBAを書いて、実際のアドレスに変換するために内部の文字列をEVALUATE()し、複数の間接(...)は、式とその変換を1つのシート内の2つの列に呼び出してダンプします。

0

ライターが接続されている製品の言及に関するSOの礼儀はわかりませんが、オペレーティス分析キットのExcelアドインであるOAKは、間接機能をセル参照で置き換えることができます解決する。その後、Excelの監査ツールを使用して、各範囲の従属先を判断できます。

もちろん、これをワークブックの一時コピーにも行います。

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

この問題の年齢を考えれば、代替の解決法または回避策が見つかった可能性があります。