Frage

Wir haben ein paar sehr große Excel-Arbeitsmappen (Dutzende Tabs, jeweils über ein MB, sehr komplexe Berechnungen) mit vielen Dutzenden, vielleicht Hunderten von Formeln, die die gefürchtete INDIREKT-Funktion verwenden.Diese Formeln sind über die gesamte Arbeitsmappe verteilt und zielen auf mehrere Datentabellen ab, um nach Werten zu suchen.

Jetzt muss ich die Datenbereiche, auf die diese Formeln abzielen, an einen anderen Ort in derselben Arbeitsmappe verschieben.

(Der Grund ist nicht besonders relevant, aber für sich genommen interessant.Wir müssen diese Dinge in den Excel-Berechnungsdiensten ausführen, und die Latenz beim Laden jeder der recht großen Tabellen einzeln erwies sich als unannehmbar hoch.Wir verschieben die Tabellen in einem zusammenhängenden Bereich, damit wir sie alle auf einmal laden können.)

Gibt es eine Möglichkeit, alle INDIRECT-Formeln zu finden, die derzeit auf die Tabellen verweisen, die wir verschieben möchten?

Ich muss das nicht online erledigen.Ich nehme gerne etwas, dessen Laufzeit 4 Stunden dauert, solange es zuverlässig ist.

Beachten Sie, dass die Methoden .Precedent, .Dependent usw. nur direkte Formeln verfolgen.

(Außerdem das Umschreiben der Tabellen in was auch immer ist für uns keine Option).

Danke!

War es hilfreich?

Lösung

Sie könnten mit vba über die gesamte Arbeitsmappe iterieren (ich habe den Code von @PabloG und @euro-micelli eingefügt):

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

In diesem Beispiel wird jedes Vorkommen von „indirect(D4)“ durch „indirect(C4)“ ersetzt.Sie können die Ersetzungsfunktion problemlos durch etwas ausgefeilteres ersetzen, wenn Sie kompliziertere indirekte Funktionen haben.Die Leistung ist nicht so schlecht, selbst bei größeren Arbeitsmappen.

Andere Tipps

Q:„Gibt es eine Möglichkeit, alle INDIRECT-Formeln zu finden, die derzeit auf die Tabellen verweisen, die wir verschieben möchten?“

Während ich es lese, möchten Sie in den Argumenten von INDIRECT nach Verweisen auf Interessengebiete suchen.OTTOMH Ich würde VBA schreiben, um einen Parser für reguläre Ausdrücke zu verwenden, oder sogar ein einfaches INSTR, um INDIRECT zu finden (vorwärts zum Matching lesen), dann EVALUATE() die darin enthaltene Zeichenfolge, um sie in die tatsächliche Adresse umzuwandeln, und den Vorgang nach Bedarf für mehrere INDIRECT wiederholen (...) ruft die Formel und ihre Übersetzung auf und gibt sie in zwei Spalten in einem Blatt aus.

Sie können in VBA so etwas verwenden:

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

Anstelle von Debug.Print können Sie Code nach Ihrem Geschmack hinzufügen

Leider sind die indirekten Argumente in der Regel komplexer.Hier ist eine tatsächliche Formel aus einer der Blätter, nicht die komplexeste Formel, die wir haben:

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

Hm, Sie könnten einen einfachen Parser schreiben, indem Sie die meisten Zeichen ignorieren und nur nach den relevanten Teilen suchen (in diesem Beispiel:„A..Z“, „0..9“ und „!:“ usw.), aber Sie werden auf Probleme stoßen, wenn die Argumente in „indirect“ Funktionen sind.

Vielleicht wäre es sicherer, jedes Vorkommen von „indirekt“ auf einem dritten Blatt auszudrucken.Sie könnten dann die gewünschte Ausgabe hinzufügen und ein kleines Such- und Ersetzungsprogramm schreiben, um Ihre Änderungen zurückzuschreiben.

Wenn Sie jede Zelle in einer riesigen Tabelle "bekommen", benötigen Sie möglicherweise monströse Mengen an Gedächtnis.Ich bin immer noch bereit, dieses Risiko einzugehen.

PabloGs Methode zur Auswahl des verwendeten Bereichs ist der richtige Weg (habe sie in meinen ursprünglichen Code eingefügt).Die Geschwindigkeit ist recht gut, insbesondere wenn man prüft, ob die aktuelle Zelle eine Formel enthält.Dies hängt natürlich alles von der Größe Ihrer Arbeitsmappe ab.

Ich bin mir nicht sicher, wie die Etikette von SO bezüglich der Erwähnung von Produkten aussieht, mit denen der Autor verbunden ist, aber OAK, das Operis Analysis Kit, ein Excel-Add-In, kann die INDIRECT-Funktionen durch die Zellverweise ersetzen, auf die sie aufgelöst werden.Anschließend können Sie mithilfe der Prüftools von Excel ermitteln, welche Abhängigkeiten die einzelnen Bereiche haben.

Sie würden dies natürlich mit einer temporären Kopie der Arbeitsmappe tun.

Mehr bei

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

Angesichts des Alters dieser Frage haben Sie möglicherweise eine alternative Lösung oder Problemumgehung gefunden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top