Combinazione automatica della formula di più celle in una cella


1

Ho un foglio Excel che ha usato molte celle per calcolare il risultato finale. Vedo che quei risultati intermedi potrebbero essere stati utili quando è stata creata la formula. Ora vorrei sbarazzarmi dei risultati intermedi e avere una sola formula in una cella.

So come farlo manualmente, ad esempio come descritto in questa domanda e risposta . Tuttavia, vorrei sapere se esiste un modo automatico per farlo .

Sembra che Excel sappia già da dove provengono i valori quando uso la funzione trace:

Traccia al precedente

Di solito nasconderei semplicemente le righe per renderle invisibili. In questo caso, non posso farlo perché ci sono valori in altre colonne che sono importanti.

Risposte:


2

La risposta di Charl Pretorius è stata utile. Dopo aver risolto 2 problemi, il Macro ha funzionato per me. Ho aggiunto commenti in cui ho cambiato lo script.

Si noti che la macro deve essere eseguita tutte le volte che si desidera effettuare sostituzioni. Sarebbe possibile eseguire tutte le sostituzioni, ma forse dovrebbe rimanere l'ultimo riferimento a una cella.

Sub CombineFormula()

    Dim FormulaCell As Range
    Set FormulaCell = ActiveCell

    Dim StrTemp As String
    StrTemp = FormulaCell.Formula

    'Do not replace the $ sign in absolute addresses.
    'It may be used in text, e.g. in a formula like ="US$"&A1
    'Instead, use different adressing modes in the replacement loop
    '! StrTemp = Replace(StrTemp, "$", "")

    Dim RangeRef As Range

    On Error Resume Next

    Dim ReplaceBy As String
    For Each RangeRef In FormulaCell.Precedents.Cells
        'Add in parentheses to maintain correct order of evaluation, e.g. in cases of addition before multiplication
        ReplaceBy = "(" + Replace(RangeRef.Formula, "=", "") + ")"
        'The order of the following is important
        'Replace absolute ranges first, because A$1 is also contained in $A$1
        StrTemp = Replace(StrTemp, RangeRef.Address(True, True), ReplaceBy)
        StrTemp = Replace(StrTemp, RangeRef.Address(True, False), ReplaceBy)
        StrTemp = Replace(StrTemp, RangeRef.Address(False, False), ReplaceBy)
        StrTemp = Replace(StrTemp, RangeRef.Address(False, True), ReplaceBy)
    Next

    FormulaCell.Value2 = StrTemp
End Sub

+1 per le modifiche. Inizialmente avevo la stessa idea per le modalità di indirizzamento nel ciclo di sostituzione, ma ho incasinato l'ordine e non ho considerato i "$" come testo usato in una formula.
ChP

1

Non sono sicuro che tu sia felice di usare le macro nei tuoi fogli di lavoro, ma di seguito è una semplice macro per ottenere ciò che desideri. Basta copiare il codice sul tuo VBA, selezionare la cella che vuoi ripulire ed eseguire la macro, puoi anche creare un tasto di scelta rapida per esso se hai molto da fare. Fai solo attenzione, se esegui una macro, tutta la cronologia degli annullamenti verrà eliminata.

Sub CombineFormula()

Dim FormulaCell As Range
Set FormulaCell = ActiveCell

Dim StrTemp As String
StrTemp = FormulaCell.Formula
StrTemp = Replace(StrTemp, "$", "")


Dim RangeRef As Range

On Error Resume Next

For Each RangeRef In FormulaCell.Precedents.Cells
    StrTemp = Replace(StrTemp, RangeRef.Address(False, False), Replace(RangeRef.Formula, "=", ""))
Next


FormulaCell.Value2 = StrTemp

End Sub

Hmm, va nella giusta direzione, ma ha dei problemi, ad esempio non rispetta l'ordine delle operazioni.
Thomas Weller,

Inoltre, la sostituzione di $ può causare problemi se $ non fa parte di un intervallo ma, ad esempio, del testo.
Thomas Weller,

0

Non esiste un modo diretto per affrontarlo a partire da quello che so, ma penso che la funzione FORMULATEXT potrebbe esserti utile. la funzione FORMULATEXT (numero di cella) restituirà la formula come testo che può essere utilizzata per alcune modifiche come

A3 = FORMULATEXT (A1) + FORMULATEXT (A2) o qualcosa del genere per raggiungere il tuo obiettivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.