Czy Excel może jednocześnie wyświetlać formułę i jej wynik?

10

Wiem, że w programie Excel można przełączać się między wyświetlaniem wartości a wyświetlaniem formuł . Muszę przekazać zadania dla klasy statystycznej jako wydrukowany arkusz Excela przedstawiający zarówno formułę, jak i wynik. W tej chwili instruktor każe nam albo skopiować formułę i wkleić ją jako tekst obok obliczonej wartości, albo skopiować wartość i wkleić obok formuły. Jest to bardzo nieefektywne, podatne na błędy (jeśli zmienisz formułę lub wartości po wykonaniu operacji kopiuj-wklej) i generalnie strata czasu.

Czy jest jakiś sposób, aby Excel wyświetlał formułę i jej wartość w tej samej komórce? Jeśli nie, to czy jest jakaś funkcja, która wyświetli formułę z komórki, do =showformula(A1)której istnieje odwołanie, jako zwykły tekst, np. Która wydrukowałaby =sum(A2:A5) zamiast 25(gdyby to była formuła i wartość komórki A1)?

Korzystam z programu Excel 2010, ale ogólna odpowiedź, która działa dla każdej najnowszej edycji programu Excel, byłaby miła.

nhinkle
źródło

Odpowiedzi:

18

Nie znam żadnych wbudowanych funkcji do tego. Możesz jednak utworzyć zdefiniowaną przez użytkownika funkcję VB, aby osiągnąć to, co chcesz.

Naciśnij klawisze Alt + F11, aby otworzyć edytor VBA, kliknij prawym przyciskiem myszy w Eksploratorze projektów i wybierz Wstaw -> Moduł . Wklej następujący kod:

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

Teraz możesz użyć =GetFormula(A1)do wyświetlenia formuły tej komórki.

Indrek
źródło
Użyłem tej rutyny - Dostaję błąd Zmienna niezdefiniowane Jaka powinna być deklaracja zmiennej za getformula?
Prasanna,
@Prasanna GetFormulanie jest zmienną, jest funkcją. Jakiej wersji programu Excel używasz?
Indrek
Excel 2013. Przepraszam za moją niewiedzę - zacząłem uczyć się VBA
Prasanna
2

Oto sposób na zautomatyzowanie tego, co robiłeś wcześniej. Łączy najlepsze części odpowiedzi LonelyKnight na jego własne pytanie , odpowiedź Indreka i odpowiedź Billisa:

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

Dla każdej komórki w określonym zakresie (tutaj zakodowanym A1:G5na stałe jako ) kopiuje formułę komórki, chronioną apostrofem, do komórki o ustalonym przesunięciu. (Zobacz Jak dodać VBA w MS Office ?, aby uzyskać wskazówki dotyczące używania VBA w Excelu.) Musisz tylko pamiętać, aby uruchomić to makro przed wydrukowaniem.

Lub dodaj PrintOut , , , Trueinstrukcję tuż przed tym Exit Sub, a to makro wydrukuje arkusz za ciebie. (Trzeba tylko pamiętać, aby drukować przy użyciu tego makra .) Czwarty parametr PrintOutto Preview , ustawiony tak, Trueaby program Microsoft Excel wywoływał podgląd wydruku przed wydrukowaniem arkusza (dając w ten sposób opcję anulowania) lub False(lub pominięto), aby wydrukować arkusz natychmiast, bezwarunkowo.

Lub, jeśli naprawdę martwisz się, że zapomnisz uruchomić to, możesz użyć Private Sub Worksheet_Changedo aktualizacji wyświetlanych formuł za każdym razem, gdy wprowadzisz jakiekolwiek zmiany w arkuszu.

G-Man mówi „Przywróć Monikę”
źródło
2

Być może warto zauważyć, że od Excel 2013, jest rodowitym funkcja to: FORMULATEXT.

Z pomocy dot office dot com artykuł na temat FORMULATEXTfunkcji:

Opis

Zwraca formułę jako ciąg.

Składnia

FORMULATEKST (odniesienie)

Składnia funkcji FORMULATEXT zawiera następujące argumenty:

  • Wymagane referencje . Odwołanie do komórki lub zakresu komórek.

Uwagi

  • Funkcja FORMULATEXT zwraca to, co jest wyświetlane na pasku formuły, jeśli wybierzesz komórkę, do której istnieje odwołanie.
Alex M.
źródło
1
Miły. Wbudowana to droga. W przeciwieństwie do rozwiązania Indreks, to pokazuje błąd, jeśli pole nie jest formułą, można sprawdzić przed easely z tego: = IF (ISFORMULA (B1); FORMULATEXT (B1); B1)
Peheje
0

Darmowy dodatek FormulaDesk może to zrobić za Ciebie, a także wyświetlać formułę w bardziej zrozumiały sposób i wskazywać błędy w formule.

Jak widać na zrzucie ekranu poniżej, możesz zobaczyć końcowy wynik komórki, oryginalną formułę i ulepszone wyświetlanie formuły jednocześnie, zgodnie z zapytaniem.

[Ujawnienie: Jestem autorem FormulaDesk]

wprowadź opis zdjęcia tutaj

Gareth Hayter
źródło
1
Dziękujemy za ujawnienie swojej przynależności. Wygląda na to, że masz wcześniejszy wkład w Stack Exchange, co jest świetne, ale sugeruję ponowne przeczytanie polityki autopromocji, aby być bezpiecznym. Nie zrobiłeś nic złego, ale często, gdy użytkownicy widzą kogoś, kogo jedyne odpowiedzi w witrynie promują coś, co zrobili, oflagują to jako spam. Poprawiłoby to również tę odpowiedź, gdybyś mógł podać zrzut ekranu jako przykład. Dzięki!
nhinkle
Dziękuję za zwrócenie mi na to uwagi. Zredagowałem swoją odpowiedź, aby dokładnie odpowiedzieć na twoje pierwotne pytanie.
Gareth Hayter
0

Wiem bardzo niewiele o programowaniu, a moja odpowiedź nie jest elegancka. Jako przyszły inżynier potrzebowałem funkcji w Excelu, która mogłaby wyświetlić mi formułę. Problem, który znalazłem w rozwiązaniu Indreka, polega na tym, że jego funkcja zwraca mi taką formułę: „C9 * C9 * pi ()” i chciałem, aby nazwy komórek na wyświetlaczu formuły (C9) zostały zmienione na wartości te komórki; i to zmienia się automatycznie, ilekroć te liczby zostaną zmienione w oryginalnej komórce C9.

Mój rodzaj kodu działa z bardzo podstawowymi formułami. Nigdzie indziej nie znalazłem czegoś takiego, może komuś pomóc, czy nie. Ktoś może to poprawić do przyzwoitego poziomu. Jak powiedziałem, działa dla mnie i jestem praktycznym facetem z niewielkimi umiejętnościami w programowaniu.

Pierwsza funkcja wcale nie jest moja. Został pobrany z:

/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
źródło
-2

Możesz utworzyć dodatkową kolumnę zawierającą formuły: = REPLACE (cel_komórka; 1; 1; "")

András
źródło
Nie działa dla mnie.
tohuwawohu
To nie zadziała.
Alex M
-2

Oto rozwiązanie:

  1. Umieść apostrof ( ') na początku formuły
  2. Skopiuj go do wiersza poniżej lub kolumny obok niego
  3. Wróć do oryginalnej formuły i usuń apostrof

To działa.

Bill jest
źródło
4
Wymaga to ponownego skopiowania formuły przy każdej zmianie. Podczas częstej zmiany arkusza kalkulacyjnego kopiowanie formuł byłoby zbyt łatwe, aby zsynchronizować się z prawdziwymi formułami.
nhinkle
Jest to dokładny stan rzeczy, który pytanie próbuje rozwiązać.
Alex M
-3

Połącz tekst z wartością Załóżmy, że komórka A1 zawiera liczbę 9999

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

Ta formuła wyświetli „Razem: 9 999,00 $”

Kolejny przykład wykorzystujący funkcję NOW do wyświetlania tekstu z bieżącą datą / godziną

="Report printed on: "&TEXT(NOW(),"mmmm d, yyyy at h:mm AM/PM")
mta
źródło
2
O ile cię nie zrozumiem, nie ma to nic wspólnego z tym, o co proszę.
nhinkle