Чи може Excel одночасно показувати формулу та її результат?


10

Я знаю, що в Excel можна перемикатися між відображенням значень та відображенням формул . Я повинен включити в завданнях для класу статистики в якості друкованого аркуша Excel , показуючи як формулу і результат. Зараз інструктор змушує нас або скопіювати формулу та вставити її як текст поруч із обчисленим значенням, або скопіювати значення та вставити поруч із формулою. Це дуже неефективно, схильне до помилок (якщо ви змінюєте формулу чи значення після копіювання-вставки) і взагалі марно витрачає час.

Чи є спосіб, щоб Excel показав формулу та її значення в одній клітині? Якщо ні, чи є якась функція, яка відображатиме формулу з посилається на комірку як звичайний текст, наприклад, =showformula(A1)яка виводиться =sum(A2:A5) замість 25(якщо це були формула та значення комірки A1)?

Я використовую Excel 2010, але загальна відповідь, яка працює для будь-якої останньої версії Excel, була б непоганою.

Відповіді:


18

Я не знаю жодних вбудованих функцій для цього. Однак ви можете створити визначену користувачем функцію VB, щоб досягти того, що ви хочете.

Натисніть Alt + F11, щоб відкрити редактор VBA, клацніть правою кнопкою миші в Провіднику проектів і виберіть Вставити -> Модуль . Вставте наступний код:

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

Тепер ви можете використовувати, =GetFormula(A1)щоб показати формулу цієї комірки.


Я використовував цю процедуру - я отримую помилку Змінна не визначена. Якою має бути декларація змінної для getformula?
Прасанна

@Prasanna GetFormulaне є змінною, це функція. Яку версію Excel ви використовуєте?
Індрек

Excel 2013. Вибачте за моє незнання - я почав вивчати VBA
Прасанна

2

Ось спосіб автоматизувати те, що ви робили раніше. Він поєднує в собі найкращі частини відповіді LonelyKnight на власне запитання , відповідь Індрека та відповідь Білліса:

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

Для кожної комірки у вказаному діапазоні (тут жорстко закодовано як A1:G5) вона копіює формулу комірки, захищену апострофом, до комірки з фіксованим зміщенням. (Див. Як додати VBA в MS Office? Для вказівки щодо використання VBA в Excel.) Ви просто повинні запам'ятати, щоб запустити цей макрос перед друком.

Або додайте PrintOut , , , Trueзаяву безпосередньо раніше Exit Sub, і цей макрос надрукує аркуш для вас. (Вам просто потрібно запам'ятати для друку за допомогою цього макросу .) Четвертий параметр PrintOut- Preview , призначений для того, Trueщоб Microsoft Excel викликав попередній перегляд друку перед друком аркуша (таким чином, ви можете скасувати) або False(або пропущено) для друку аркуша аркуш негайно, беззастережно.

Або якщо ви дійсно стурбовані тим, що забудете запустити це, ви можете використовувати Private Sub Worksheet_Changeдля оновлення формул, що відображаються, будь-коли, коли ви внесете будь-які зміни в робочий аркуш.


2

Можливо , варто відзначити , що за станом на Excel 2013, є рідна функція для цього: FORMULATEXT.

Стаття про FORMULATEXTфункцію від dot office dot com про функцію:

Опис

Повертає формулу у вигляді рядка.

Синтаксис

ФОРМУЛАТЕКСТ (довідник)

Синтаксис функції FORMULATEXT має такі аргументи:

  • Довідка обов'язкова. Посилання на клітинку або діапазон комірок.

Зауваження

  • Функція FORMULATEXT повертає те, що відображається на панелі формул, якщо ви вибираєте посилальну клітинку.

1
Приємно. Вбудований - це шлях. На відміну від рішення Indreks, це показує помилку, якщо поле не є формулою, ви можете легко перевірити заздалегідь це: = IF (ISFORMULA (B1); FORMULATEXT (B1); B1)
Peheje


0

Безкоштовна надбудова, FormulaDesk може це зробити для вас, а також відобразити формулу більш зрозумілим способом і точно визначити помилки у формулі.

Як ви бачите на скріншоті нижче, ви можете одночасно переглянути кінцевий результат клітини та оригінальну формулу та покращене відображення формули, як ви просили.

[Розкриття інформації: я автор FormulaDesk]

введіть тут опис зображення


1
Дякуємо, що розкрили свою приналежність. Схоже, у вас є попередні внески на обмін стеками, що чудово, але я б запропонував перечитати політику самореклами лише для того, щоб бути безпечним. Ви нічого не зробили неправильно, але часто, коли користувачі бачать когось, чиї лише відповіді на сайті рекламують щось зроблене, вони позначають це як спам. Це також покращило б цю відповідь, якби ви могли включити скріншот як приклад. Дякую!
nhinkle

Дякую, що мені це вказали. Я відредагував свою відповідь, щоб точно відповісти на ваше первісне запитання.
Гарет Хейтер

0

Я дуже добре знаю про програмування, і моя відповідь не є елегантною. Як майбутньому інженеру мені потрібна була функція в Excel, яка могла б показати мені формулу. Проблема, яку я знайшов у рішенні Індрека, полягає в тому, що його функція повертає мені формулу на зразок такої: "C9 * C9 * pi ()", і я хотів, щоб імена комірок у відображенні формули (C9) були змінені на значення ці клітини; і це автоматично змінюватиметься кожного разу, коли ці числа будуть змінені в початковій комірці C9.

Мій вид коду працює з дуже базовими формулами. Я ніде більше ніде не знаходив подібного, це може комусь допомогти чи ні. Хтось, можливо, зміг би покращити це до гідного рівня. Як я вже говорив, це працює для мене, і я практичний хлопець з невеликими навичками програмування.

Перша функція зовсім не моя. Отримано з:

/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

Ви можете створити додатковий стовпець, що містить формули: = ЗАМОВИТИ (target_cell; 1; 1; "")


Не працює для мене.
tohuwawohu

Це не вийде.
Алекс М

-2

Ось таке рішення:

  1. Покладіть апостроф ( ') на початок формули
  2. Скопіюйте його в рядок нижче або стовпець поруч
  3. Поверніться до початкової формули і видаліть апостроф

Це працює.


4
Це вимагає перекопіювання формули кожного разу, коли ви її змінюєте. Коли часто змінюєте електронну таблицю, скопійованим формулам було б занадто просто вийти з синхронізації з реальними формулами.
nhinkle

Це саме той стан справ, який намагається вирішити.
Алекс М

-3

Об'єднайте текст зі значенням Припустимо, комірка A1 містить число 9999

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

Ця формула відображатиме "Всього: 9 999,00 доларів"

Ще один приклад, який використовує функцію NOW для відображення тексту з поточною датою / часом

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

2
Якщо я вас не розумію, це взагалі не має нічого спільного з тим, про що я прошу.
nhinkle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.