O Excel pode mostrar uma fórmula e seu resultado simultaneamente?

10

Eu sei que é possível no Excel alternar entre exibir valores e exibir fórmulas . Eu sou obrigado a entregar as tarefas para uma classe de estatísticas como uma folha Excel impressa mostrando tanto a fórmula e o resultado. No momento, o instrutor nos faz copiar a fórmula e colá-la como texto ao lado do valor calculado ou copiar o valor e colá-lo ao lado da fórmula. Isso é muito ineficiente, propenso a erros (se você alterar a fórmula ou os valores depois de copiar e colar) e, geralmente, uma perda de tempo.

Existe alguma maneira de o Excel mostrar a fórmula e seu valor na mesma célula? Caso contrário, existe alguma função que exibirá a fórmula de uma célula referenciada como texto simples, por exemplo, =showformula(A1)que seria impresso em =sum(A2:A5) vez de 25(se essa fosse a fórmula e o valor da célula A1)?

Estou usando o Excel 2010, mas uma resposta geral que funcione para qualquer edição recente do Excel seria legal.

nhinkle
fonte

Respostas:

18

Não conheço nenhuma função interna para isso. No entanto, você pode criar uma função VB definida pelo usuário para realizar o que deseja.

Pressione Alt + F11 para abrir o editor VBA, clique com o botão direito do mouse no Project Explorer e selecione Insert -> Module . Cole o seguinte código:

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

Agora você pode usar =GetFormula(A1)para mostrar a fórmula dessa célula.

Indrek
fonte
Usei essa rotina - estou recebendo um erro Variável não definida Qual deve ser a declaração da variável para getformula?
Prasanna
@ Pasanna GetFormulanão é uma variável, é uma função. Qual versão do Excel você está usando?
Indrek
Excel 2013. Desculpa a minha ignorância - eu comecei a aprender VBA
Prasanna
2

Aqui está uma maneira de automatizar o que você estava fazendo antes. Ele combina as melhores partes da resposta da LonelyKnight para sua própria pergunta , a resposta de Indrek e a resposta 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 célula no intervalo especificado (aqui codificado como A1:G5), ele copia a fórmula da célula, protegida por um apóstrofo, para uma célula com um deslocamento fixo. (Consulte Como adiciono o VBA no MS Office? Para obter orientação sobre o uso do VBA no Excel.) Lembre-se de executar essa macro antes de imprimir.

Ou adicione uma PrintOut , , , Truedeclaração logo antes Exit Sube essa macro imprimirá a folha para você. (Você só precisa se lembrar de imprimir usando essa macro .) O quarto parâmetro para PreviewPrintOut é configurado para que o Microsoft Excel invoque a visualização de impressão antes de imprimir a folha (oferecendo a opção de cancelar) ou (ou omitido) para imprimir o arquivo. folha imediatamente, incondicionalmente.TrueFalse

Ou, se você estiver realmente preocupado em esquecer de executar isso, pode usar Private Sub Worksheet_Changepara atualizar as fórmulas exibidas sempre que fizer alguma alteração na planilha.

G-Man Diz 'Reinstate Monica'
fonte
2

Talvez interessante notar que a partir de Excel 2013, há uma função nativa para isso: FORMULATEXT.

Do artigo de suporte dot office dot com sobre a FORMULATEXTfunção:

Descrição

Retorna uma fórmula como uma sequência.

Sintaxe

FORMULATEXT (referência)

A sintaxe da função FORMULATEXT possui os seguintes argumentos:

  • Referência necessária. Uma referência a uma célula ou intervalo de células.

Observações

  • A função FORMULATEXT retorna o que é exibido na barra de fórmulas se você selecionar a célula referenciada.
Alex M
fonte
11
Agradável. Construído é o caminho a percorrer. Ao contrário solução Indreks, esta mostra um erro se o campo não é uma fórmula, pode fácilmente verificar antes com esta: = IF (ISFORMULA (B1); FormulaText (B1); B1)
Peheje
0

O suplemento gratuito FormulaDesk pode fazer isso por você, além de exibir a fórmula de uma maneira mais compreensível e identificar erros na fórmula.

Como você pode ver na captura de tela abaixo, é possível visualizar o resultado final da célula, a fórmula original e a exibição explorável aprimorada da fórmula simultaneamente, conforme solicitado.

[Divulgação: Eu sou o autor do FormulaDesk]

insira a descrição da imagem aqui

Gareth Hayter
fonte
11
Obrigado por divulgar sua afiliação. Parece que você tem contribuições anteriores no Stack Exchange, o que é ótimo, mas eu sugiro reler a política de autopromoção apenas por segurança. Você não fez nada de errado, mas, muitas vezes, quando os usuários veem alguém cujas únicas respostas no site estão promovendo algo que fizeram, eles o sinalizam como spam. Também melhoraria esta resposta se você pudesse incluir uma captura de tela como exemplo. Obrigado!
Nhinkle
Obrigado por apontar isso para mim. Editei minha resposta para responder exatamente à sua pergunta original.
Gareth Hayter
0

Sei muito pouco sobre programação e minha resposta não é elegante. Como futuro engenheiro, eu precisava de uma função no Excel que pudesse me mostrar a fórmula. O problema que encontrei na solução Indrek é que sua função retorna para mim uma fórmula como esta: "C9 * C9 * pi ()" e eu queria que os nomes das células na exibição da fórmula (C9) fossem alterados para os valores de essas células; e isso mudaria automaticamente sempre que esses números fossem alterados na célula C9 original.

Meu código funciona com fórmulas muito básicas. Eu nunca encontrei algo assim em nenhum outro lugar, pode ajudar alguém ou não. Alguém pode ser capaz de melhorar isso para um nível decente. Como eu disse, funciona para mim e sou um cara prático, com poucas habilidades em programação.

A primeira função não é minha. Foi 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
fonte
-2

Você pode criar uma coluna adicional contendo as fórmulas: = REPLACE (target_cell; 1; 1; "")

András
fonte
Não funciona para mim.
tohuwawohu
Isso não vai funcionar.
Alex M
-2

Aqui está uma solução:

  1. Coloque um apóstrofo ( ') no início da fórmula
  2. Copie-o para a linha abaixo ou a coluna ao lado
  3. Volte para a fórmula original e remova o apóstrofo

Isso funciona.

A conta é
fonte
4
Isso requer a cópia da fórmula sempre que você a altera. Ao alterar uma planilha com freqüência, seria muito fácil para as fórmulas copiadas ficarem fora de sincronia com as fórmulas reais.
Nhinkle 15/10
Este é o estado exato das coisas que a questão está tentando resolver.
Alex M
-3

Combinar texto com um valor Suponha que a célula A1 contenha o número 9999

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

Esta fórmula exibirá "Total: US $ 9.999,00"

Outro exemplo que usa a função NOW para exibir texto com a data / hora atual

="Report printed on: "&TEXT(NOW(),"mmmm d, yyyy at h:mm AM/PM")
mta
fonte
2
A menos que eu esteja entendendo mal você, isso não tem nada a ver com o que estou pedindo.
Nhinkle 9/10