Excel può mostrare una formula e il suo risultato contemporaneamente?


10

So che in Excel è possibile alternare tra la visualizzazione di valori e la visualizzazione di formule . Sono tenuto a consegnare le assegnazioni per una classe di statistiche come un foglio Excel stampato che mostra sia la formula che il risultato. In questo momento l'istruttore ci fa copiare la formula e incollarla come testo accanto al valore calcolato, oppure copiare il valore e incollarlo accanto alla formula. Questo è molto inefficiente, soggetto a errori (se si modificano la formula o i valori dopo aver eseguito il copia-incolla) e generalmente una perdita di tempo.

Esiste un modo per fare in modo che Excel mostri la formula e il suo valore nella stessa cella? In caso contrario, esiste una funzione che visualizzerà la formula da una cella referenziata come testo normale, ad esempio =showformula(A1)che verrebbe stampata =sum(A2:A5) anziché 25(se quelli fossero la formula e il valore della cella A1)?

Sto usando Excel 2010, ma una risposta generale che funziona per qualsiasi recente edizione di Excel sarebbe buona.

Risposte:


18

Non sono a conoscenza di alcuna funzione integrata per questo. Tuttavia, è possibile creare una funzione VB definita dall'utente per ottenere ciò che si desidera.

Premi Alt + F11 per aprire l'editor VBA, fai clic con il pulsante destro del mouse in Esplora progetti e seleziona Inserisci -> Modulo . Incolla il seguente codice:

Function GetFormula(cell)  
  GetFormula = cell.Formula  
End Function

Ora puoi usare =GetFormula(A1)per mostrare la formula di quella cella.


Ho usato questa routine - Ricevo un errore Variabile non definita Quale dovrebbe essere la dichiarazione della variabile per getformula?
Prasanna,

@Prasanna GetFormulanon è una variabile, è una funzione. Quale versione di Excel stai usando?
Indrek,

Excel 2013. Scusa la mia ignoranza - ho iniziato a studiare VBA
Prasanna l'

2

Ecco un modo per automatizzare quello che stavi facendo prima. Unisce le parti migliori della risposta di LonelyKnight alla propria domanda , alla risposta di Indrek e alla risposta di Billis:

Sub Show_Formulas()
    Dim rng As Range, cell As Range
    row_offset = 10
    col_offset = 0
    Set rng = Range(Cells(1, 1), Cells(5, 7))

    On Error GoTo ErrHandler
    For Each cell In rng
        cell.Offset(row_offset, col_offset) = "'" & cell.Formula
    Next cell
    Exit Sub

ErrHandler:
    MsgBox "The cow jumped over the moon", , "Error!", Err.HelpFile, Err.HelpContext

End Sub

Per ogni cella nell'intervallo specificato (qui codificato come A1:G5), copia la formula della cella, protetta da un apostrofo, in una cella a un offset fisso di distanza. (Vedi Come aggiungere VBA in MS Office? Per indicazioni sull'uso di VBA in Excel.) Devi solo ricordarti di eseguire questa macro prima di stampare.

In alternativa, aggiungi una PrintOut , , , Truedichiarazione poco prima Exit Sube questa macro stamperà il foglio per te. (Devi solo ricordarti di stampare usando questa macro .) Il quarto parametro su PrintOutè Anteprima , impostato per Truefare in modo che Microsoft Excel invochi l'anteprima di stampa prima di stampare il foglio (dandoti così la possibilità di annullare) o False(o omesso) per stampare il foglio immediatamente, incondizionatamente.

Oppure, se siete veramente preoccupati per dimenticare di eseguire questo, è possibile utilizzare Private Sub Worksheet_Changeper aggiornare le formule visualizzabili in qualsiasi momento di effettuare qualsiasi cambiamento nel foglio di lavoro.


2

Forse la pena notare che a partire da Excel 2013, c'è una funzione nativa per questo: FORMULATEXT.

Dall'articolo di dot dot office dot com sulla FORMULATEXTfunzione:

Descrizione

Restituisce una formula come stringa.

Sintassi

FormulaText (riferimento)

La sintassi della funzione FORMULATEXT presenta i seguenti argomenti:

  • Riferimento richiesto. Un riferimento a una cella o intervallo di celle.

Osservazioni

  • La funzione FORMULATEXT restituisce ciò che viene visualizzato nella barra della formula se si seleziona la cella di riferimento.

1
Bello. Costruito è la strada da percorrere. A differenza della soluzione Indreks, questo mostra un errore se il campo non è una formula, puoi facilmente controllare prima con questo: = IF (ISFORMULA (B1); FORMULATEXT (B1); B1)
Peheje


0

Il componente aggiuntivo gratuito, FormulaDesk può farlo per te, oltre a visualizzare la formula in un modo più comprensibile e individuare errori nella formula.

Come puoi vedere nello screenshot qui sotto, puoi visualizzare contemporaneamente il risultato finale della cella, la formula originale e la visualizzazione esplorabile avanzata della formula, come hai chiesto.

[Divulgazione: sono l'autore di FormulaDesk]

inserisci qui la descrizione dell'immagine


1
Grazie per aver rivelato la tua affiliazione. Sembra che tu abbia precedenti contributi su Stack Exchange, il che è fantastico, ma suggerirei di rileggere la politica di autopromozione solo per sicurezza. Non hai fatto nulla di male, ma spesso quando gli utenti vedono qualcuno le cui uniche risposte sul sito promuovono qualcosa che hanno fatto, lo segnalano come spam. Migliorerebbe anche questa risposta se si potesse includere uno screenshot come esempio. Grazie!
Pensa al

Grazie per avermelo fatto notare. Ho modificato la mia risposta per rispondere esattamente alla tua domanda originale.
Gareth Hayter,

0

Conosco molto poco la programmazione e la mia risposta non è elegante. Come futuro ingegnere avevo bisogno di una funzione in Excel che potesse mostrarmi la formula. Il problema che ho riscontrato nella soluzione Indrek è che la sua funzione mi restituisce una formula come questa: "C9 * C9 * pi ()" e volevo che i nomi delle celle nella visualizzazione della formula (C9) fossero cambiati con i valori di quelle cellule; e questo cambierebbe automaticamente ogni volta che quei numeri vengono cambiati nella cella C9 originale.

Il mio codice funziona con formule molto semplici. Non ho mai trovato qualcosa del genere da nessun'altra parte, potrebbe aiutare qualcuno o no. Qualcuno potrebbe essere in grado di migliorare questo a un livello decente. Come ho detto, funziona per me e sono un ragazzo pratico con poche abilità nella programmazione.

La prima funzione non è affatto mia. È stato recuperato da:

/programming/10951687/how-to-search-for-string-in-an-array

Function IsInArray(ar, item$) As Boolean
    Dim delimiter$, list$

    ' Chr(7) is the ASCII 'Bell' Character.
    ' It was chosen for being unlikely to be found in a normal array.
    delimiter = Chr(7)

    ' Create a list string containing all the items in the array separated by the delimiter.
    list = delimiter & Join(ar, delimiter) & delimiter

    IsInArray = InStr(list, delimiter & item & delimiter) > 0
End Function

Function GETFORMULA(cell)

Dim alfabeto As String
Dim alfabetos() As String
Dim formula As String
Dim celda As String
Dim cutter As String
Dim cutterarray() As String


'The formula is taken from the cell
formula = cell.formula


'And alphabet is declared to be compared with the formula
alfabeto = "A,B,C,D,E,F,G,H,I,J,K,L,M,O,P,Q,R,S,T,U,V,W,X,Y,Z"


'An array is declared with the elements of the alphabet string
alfabetos = Split(alfabeto, ",")


'Replacing common functions with a symbol, otherwise the code will crash
formula = Replace(formula, "LOG", "#")
formula = Replace(formula, "SQRT", "?")
formula = Replace(formula, "PI", "ñ")

'MsgBox (formula)
Debug.Print formula

'Symbols to identify where the name of a cell might end are declared
cutter = "*,/,+,-,^,(,)"

'An array is declared with the symbols from the string that has been just declared
cutterarray = Split(cutter, ",")

Dim nuevaformula As String


'For the i position in the lenght of the formula
Dim index As Integer

For i = 1 To Len(formula)
    Debug.Print "Para i iterativo=", i
    Debug.Print "Se tiene el digito", Mid(formula, i, 1)



        'if the i element is not a letter, then add it to the chain of characters
        If IsInArray(alfabetos, Mid(formula, i, 1)) = False Then
        Debug.Print "Que es un numero"
        nuevaformula = nuevaformula + Mid(formula, i, 1)
        Debug.Print nuevaformula


        'if the element is a letter, then it´s necessary to get the name of the cell, found all the numbers
        'of the cell until a symbol to cut appears, like a: "*","/","+","-"
        Else
        Debug.Print "Encontramos una letra"
        'Empezamos a buscar más números
        'Numbers in the cell name are going to be find to isolate the cell number

            For s = 2 To 7
            celda = Mid(formula, i, s)
            Debug.Print "Incrementamos una posición quedando", celda

                If (i + s - 1 = Len(formula)) = False Then



                    'if a symbol to cut is not found in the last increment the last number hasn´t been reached
                    'and it´s necessary to keep loking for it
                    If IsInArray(cutterarray, Right(celda, 1)) = False Then
                    celda = Mid(formula, i, s)
                    Debug.Print "En el incremento no se encontró cutter. La i correcta es", i + s - 1


                    Else

                    'if it´s found the name of the cell is
                    celda = Mid(formula, i, s - 1)
                    Debug.Print "Se encontró un cutter la celda es", celda

                    'the search cycle has to be broken
                    Debug.Print s, i
                    i = i + s - 2
                    Debug.Print "Daremos salto a i=", i
                    Debug.Print celda
                    nuevaformula = nuevaformula + CStr(Range(celda).Value)
                    Exit For
                    End If
                Else
                Debug.Print "se alcanzó la máxima cantidad de iteraciones posibles"
                celda = Mid(formula, i, s)
                Debug.Print "La celda encontrada fue", celda
                nuevaformula = nuevaformula + CStr(Range(celda).Value)
                Debug.Print nuevaformula
                nuevaformula = Replace(nuevaformula, "#", "LOG10")
                nuevaformula = Replace(nuevaformula, "?", "raiz")
                nuevaformula = Replace(nuevaformula, "ñ", "pi")
                ISAAC = nuevaformula
                Debug.Print (nuevaformula)
                Exit Function
                End If


            'MsgBox (nuevaformula)
            Next s
        End If
Next i

nuevaformula = Replace(nuevaformula, "#", "LOG10")
nuevaformula = Replace(nuevaformula, "?", "raiz")
nuevaformula = Replace(nuevaformula, "ñ", "pi")

GETFORMULA = nuevaformula
Debug.Print (nuevaformula)
End Function

-2

È possibile creare una colonna aggiuntiva contenente le formule: = REPLACE (target_cell; 1; 1; "")


Non funziona per me.
tohuwawohu,

Questo non funzionerà.
Alex M,

-2

Ecco una soluzione:

  1. Inserisci un apostrofo ( ') all'inizio della formula
  2. Copialo nella riga sottostante o nella colonna accanto
  3. Torna alla formula originale e rimuovi l'apostrofo

Questo funziona


4
Ciò richiede una nuova copia della formula ogni volta che la modifichi. Quando si cambia frequentemente un foglio di calcolo, sarebbe troppo facile per le formule copiate non sincronizzarsi con le formule reali.
nhinkle,

Questo è l'esatto stato di cose che la domanda sta tentando di risolvere.
Alex M,

-3

Combina testo con un valore Supponi che la cella A1 contenga il numero 9999

="Total: "&TEXT(A1,"$#,##0.00")

Questa formula mostrerà "Totale: 9.999,00 $"

Un altro esempio che utilizza la funzione NOW per visualizzare il testo con la data / ora correnti

="Report printed on: "&TEXT(NOW(),"mmmm d, yyyy at h:mm AM/PM")

2
A meno che non ti fraintenda, questo non ha nulla a che fare con ciò che sto chiedendo.
Pensa al
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.