Domanda

Abbiamo alcune cartelle di lavoro Excel molto grandi (dozzine di schede, più di un MB ciascuna, calcoli molto complessi) con molte dozzine, forse centinaia di formule che utilizzano la temuta funzione INDIRETTO.Queste formule sono distribuite in tutta la cartella di lavoro e sono destinate a diverse tabelle di dati per la ricerca di valori.

Ora devo spostare gli intervalli di dati presi di mira da queste formule in una posizione diversa nella stessa cartella di lavoro.

(Il motivo non è particolarmente rilevante, ma di per sé interessante.Dobbiamo eseguire queste operazioni in Servizi di calcolo Excel e il problema di latenza derivante dal caricamento di ciascuna delle tabelle piuttosto grandi una alla volta si è rivelato inaccettabilmente elevato.Stiamo spostando le tabelle in un intervallo contiguo in modo da poterle caricare tutte in un colpo solo.)

Esiste un modo per individuare tutte le formule INDIRETTE che attualmente si riferiscono alle tabelle che vogliamo spostare?

Non ho bisogno di farlo online.Prenderò volentieri qualcosa che impiega 4 ore per funzionare purché sia ​​affidabile.

Tieni presente che i metodi .Precedent, .Dependent, ecc. tengono traccia solo delle formule dirette.

(Inoltre, riscrivendo i fogli di calcolo in Qualunque cosa non è un'opzione per noi).

Grazie!

È stato utile?

Soluzione

Potresti scorrere l'intera cartella di lavoro utilizzando vba (ho incluso il codice di @PabloG e @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

Questo esempio sostituisce ogni occorrenza di "indirect(D4)" con "indirect(C4)".Puoi facilmente scambiare la funzione di sostituzione con qualcosa di più sofisticato, se hai funzioni indirette più complicate.Le prestazioni non sono poi così male, anche per le cartelle di lavoro più grandi.

Altri suggerimenti

Q:"Esiste un modo per individuare tutte le formule INDIRETTE che attualmente si riferiscono alle tabelle che vogliamo spostare?"

Mentre lo leggo, vuoi cercare all'interno degli argomenti di INDIRETTO riferimenti ad aree di interesse.OTTOMH Scriverei VBA per utilizzare un parser di espressioni regolari, o anche un semplice INSTR per trovare INDIRECT (leggi in avanti fino alla corrispondenza), quindi EVALUATE() la stringa all'interno per convertirla nell'indirizzo effettivo, ripetere come richiesto per più INDIRECT (...) chiama e scarica la formula e la sua traduzione su due colonne di un foglio.

Puoi usare qualcosa di simile in 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

Invece di Debug.Print puoi aggiungere codice secondo i tuoi gusti

Sfortunatamente, gli argomenti di indiretto sono generalmente più complessi di così.Ecco una formula reale da uno dei fogli, non il più formula complessa che abbiamo:

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

hm, potresti scrivere un semplice parser ignorando la maggior parte dei caratteri e cercando solo le parti rilevanti (in questo esempio:"A..Z", "0..9" e "!:" ecc.), ma potresti avere problemi se gli argomenti in "indiretto" sono funzioni.

forse l'approccio più sicuro sarebbe stampare ogni occorrenza di "indiretto" in un terzo foglio.potresti quindi aggiungere l'output desiderato e scrivere un piccolo programma di ricerca e sostituzione per riscrivere le modifiche.

Se "ottieni" ogni cella in un enorme foglio di calcolo potresti finire per aver bisogno di mostruose quantità di memoria.Sono ancora disposto a provare a correre questo rischio.

Il metodo di PabloG per selezionare l'intervallo utilizzato è la strada da percorrere (aggiunto nel mio codice originale).La velocità è abbastanza buona, soprattutto se controlli se la cella corrente contiene una formula.Ovviamente tutto dipende dalle dimensioni della cartella di lavoro.

Non sono sicuro di quale sia l'etichetta di SO riguardo alla menzione dei prodotti a cui è connesso lo scrittore, ma OAK, Operis Analysis Kit, un componente aggiuntivo di Excel, può sostituire le funzioni INDIRETTE con i riferimenti di cella a cui si risolvono.È quindi possibile utilizzare gli strumenti di controllo di Excel per determinare quali dipendenze ha ciascun intervallo.

Ovviamente lo faresti su una copia temporanea della cartella di lavoro.

Più a

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

Data l'età di questa domanda potresti aver trovato una soluzione alternativa o una soluzione alternativa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top