¿Puede Excel mostrar una fórmula y su resultado simultáneamente?

10

Sé que es posible en Excel alternar entre mostrar valores y mostrar fórmulas . Estoy obligado a entregar las tareas para una clase de estadísticas como una hoja de Excel impresa que muestra tanto la fórmula como el resultado. En este momento, el instructor nos hace copiar la fórmula y pegarla como texto junto al valor calculado, o copiar el valor y pegarlo junto a la fórmula. Esto es muy ineficiente, propenso a errores (si cambia la fórmula o los valores después de copiar y pegar), y generalmente es una pérdida de tiempo.

¿Hay alguna manera de que Excel muestre la fórmula y su valor en la misma celda? Si no, ¿hay alguna función que muestre la fórmula de una celda referenciada como texto sin formato, por ejemplo, =showformula(A1)que se imprima en =sum(A2:A5) lugar de 25(si esa fuera la fórmula y el valor de la celda A1)?

Estoy usando Excel 2010, pero una respuesta general que funcione para cualquier edición reciente de Excel sería buena.

nhinkle
fuente

Respuestas:

18

No conozco ninguna función incorporada para esto. Sin embargo, puede crear una función VB definida por el usuario para lograr lo que desea.

Presione Alt + F11 para abrir el editor de VBA, haga clic con el botón derecho en el Explorador de proyectos y seleccione Insertar -> Módulo . Pegue el siguiente código:

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

Ahora puede usar =GetFormula(A1)para mostrar la fórmula de esa celda.

Indrek
fuente
Utilicé esta rutina: obtengo un error Variable no definida ¿Cuál debería ser la declaración de variable para getformula?
Prasanna
@Prasanna GetFormulano es una variable, es una función. ¿Qué versión de Excel estás usando?
Indrek
Excel 2013. Disculpe mi ignorancia: comencé a aprender VBA
Prasanna
2

Aquí hay una manera de automatizar lo que estaba haciendo antes. Combina las mejores partes de la respuesta de LonelyKnight a su propia pregunta , la respuesta de Indrek y la respuesta de 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

Para cada celda en el rango especificado (aquí codificado como A1:G5), copia la fórmula de la celda, protegida por un apóstrofe, a una celda a un desplazamiento fijo de distancia. (Consulte ¿Cómo agrego VBA en MS Office? Para obtener orientación sobre el uso de VBA en Excel). Solo debe recordar ejecutar esta macro antes de imprimir.

O bien, agregue una PrintOut , , , Truedeclaración justo antes Exit Sub, y esta macro imprimirá la hoja por usted. (Solo debe recordar imprimir usando esta macro ). El cuarto parámetro PrintOutes Vista previa , configurado para Trueque Microsoft Excel invoque la vista previa de impresión antes de imprimir la hoja (lo que le da la opción de cancelar) o False(u omitir) para imprimir hoja de inmediato, incondicionalmente.

O, si está realmente preocupado por olvidarse de ejecutar esto, puede usarlo Private Sub Worksheet_Changepara actualizar las fórmulas visualizables cada vez que realice algún cambio en la hoja de trabajo.

G-Man dice 'restablecer a Mónica'
fuente
2

Tal vez la pena señalar que a partir de Excel 2013, hay una función nativa para esto: FORMULATEXT.

Desde el artículo de soporte dot office dot com sobre la FORMULATEXTfunción:

Descripción

Devuelve una fórmula como una cadena.

Sintaxis

FORMULATEXT (referencia)

La sintaxis de la función FORMULATEXT tiene los siguientes argumentos:

  • Referencia requerida Una referencia a una celda o rango de celdas.

Observaciones

  • La función FORMULATEXT devuelve lo que se muestra en la barra de fórmulas si selecciona la celda referenciada.
Alex M
fuente
1
Agradable. Construido es el camino a seguir. A diferencia de la solución de Indreks, esto muestra un error si el campo no es una fórmula, puede verificar fácilmente antes con esto: = IF (ISFORMULA (B1); FORMULATEXT (B1); B1)
Peheje
0

El complemento gratuito, FormulaDesk puede hacer esto por usted, así como mostrar la fórmula de una manera más comprensible y detectar errores en la fórmula.

Como puede ver en la captura de pantalla a continuación, puede ver el resultado final de la celda, la fórmula original y una visualización explorable mejorada de la fórmula simultáneamente, como lo solicitó.

[Divulgación: soy el autor de FormulaDesk]

ingrese la descripción de la imagen aquí

Gareth Hayter
fuente
1
Gracias por revelar su afiliación. Parece que tiene contribuciones previas en Stack Exchange, lo cual es genial, pero sugeriría releer la política de autopromoción solo para estar seguro. No ha hecho nada malo, pero a menudo cuando los usuarios ven a alguien cuyas únicas respuestas en el sitio están promocionando algo que hicieron, lo marcan como spam. También mejoraría esta respuesta si pudiera incluir una captura de pantalla como ejemplo. ¡Gracias!
nhinkle
Gracias por señalarme esto. He editado mi respuesta para responder exactamente su pregunta original.
Gareth Hayter
0

Sé muy poco sobre programación y mi respuesta no es elegante. Como futuro ingeniero, necesitaba una función en Excel que me mostrara la fórmula. El problema que encontré en la solución de Indrek es que su función me devuelve una fórmula como esta: "C9 * C9 * pi ()" y quería que los nombres de las celdas en la pantalla de la fórmula (C9) se cambiaran a los valores de esas celdas; y eso cambiaría automáticamente cada vez que esos números se cambien en la celda C9 original.

Mi código funciona con fórmulas muy básicas. Nunca encontré algo así en ningún otro lado, podría ayudar a alguien o no. Alguien podría mejorar esto a un nivel decente. Como dije, funciona para mí y soy un tipo práctico con pocas habilidades en programación.

La primera función no es mía en absoluto. Fue recuperado de:

/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
ISAAC DELGADO
fuente
-2

Puede crear una columna adicional que contenga las fórmulas: = REPLACE (target_cell; 1; 1; "")

András
fuente
No funciona para mi
tohuwawohu
Esto no funcionará.
Alex M
-2

Aquí hay una solución:

  1. Pon un apóstrofe ( ') al comienzo de la fórmula
  2. Cópielo en la fila de abajo o en la columna a su lado
  3. Regrese a la fórmula original y elimine el apóstrofe

Esto funciona.

Billis
fuente
44
Esto requiere volver a copiar la fórmula cada vez que la cambie. Al cambiar una hoja de cálculo con frecuencia, sería demasiado fácil que las fórmulas copiadas no estuvieran sincronizadas con las fórmulas reales.
nhinkle
Este es el estado exacto de las cosas que la pregunta intenta resolver.
Alex M
-3

Combinar texto con un valor Suponga que la celda A1 contiene el número 9999

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

Esta fórmula mostrará "Total: $ 9,999.00"

Otro ejemplo que usa la función AHORA para mostrar texto con la fecha / hora actual

="Report printed on: "&TEXT(NOW(),"mmmm d, yyyy at h:mm AM/PM")
mta
fuente
2
A menos que te esté malentendiendo, esto no tiene nada que ver con lo que te pido.
nhinkle