Excel có thể hiển thị đồng thời một công thức và kết quả của nó không?


10

Tôi biết rằng trong Excel có thể chuyển đổi giữa hiển thị giá trị và hiển thị công thức . Tôi được yêu cầu bật các bài tập cho một lớp thống kê dưới dạng một bảng Excel được in hiển thị cả công thức và kết quả. Ngay bây giờ, người hướng dẫn làm cho chúng ta sao chép công thức và dán nó dưới dạng văn bản bên cạnh giá trị được tính toán, hoặc sao chép giá trị và dán nó bên cạnh công thức. Điều này rất không hiệu quả, dễ bị lỗi (nếu bạn thay đổi công thức hoặc giá trị sau khi thực hiện sao chép-dán) và nói chung là lãng phí thời gian.

Có cách nào để Excel hiển thị công thức giá trị của nó trong cùng một ô không? Nếu không, có chức năng nào sẽ hiển thị công thức từ một ô được tham chiếu dưới dạng văn bản thuần túy, ví dụ như =showformula(A1)sẽ in ra =sum(A2:A5) thay vì 25(nếu đó là công thức và giá trị của ô A1)?

Tôi đang sử dụng Excel 2010, nhưng một câu trả lời chung hoạt động cho mọi phiên bản Excel gần đây sẽ rất hay.

Câu trả lời:


18

Tôi không biết về bất kỳ chức năng tích hợp nào cho việc này. Tuy nhiên, bạn có thể tạo một hàm VB do người dùng định nghĩa để thực hiện những gì bạn muốn.

Nhấn Alt + F11 để mở trình soạn thảo VBA, nhấp chuột phải vào Project Explorer và chọn Chèn -> Mô-đun . Dán đoạn mã sau:

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

Bây giờ bạn có thể sử dụng =GetFormula(A1)để hiển thị công thức của ô đó.


Tôi đã sử dụng thói quen này - Tôi nhận được một lỗi Biến không được xác định Khai báo biến cho getformula là gì?
Prasanna

@Prasanna GetFormulakhông phải là một biến, nó là một hàm. Bạn đang sử dụng phiên bản Excel nào?
Indrek

Excel 2013. Xin lỗi vì sự thiếu hiểu biết của tôi - tôi đã bắt đầu học VBA
Prasanna

2

Đây là một cách để tự động hóa những gì bạn đang làm trước đây. Nó kết hợp những phần hay nhất trong câu trả lời của LonelyKnight cho câu hỏi của anh ấy / cô ấy , câu trả lời của Indrek và câu trả lời của 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

Đối với mọi ô trong phạm vi được chỉ định (ở đây được mã hóa cứng A1:G5), nó sao chép công thức của ô, được bảo vệ bởi dấu nháy đơn, sang một ô được bù cố định. (Xem Làm cách nào để thêm VBA trong MS Office? Để được hướng dẫn sử dụng VBA trong Excel.) Bạn chỉ cần nhớ chạy macro này trước khi in.

Hoặc, thêm một PrintOut , , , Truetuyên bố ngay trước đó Exit Subvà macro này sẽ in trang tính cho bạn. (Bạn chỉ cần nhớ in bằng macro này .) Tham số thứ tư PrintOutXem trước , được đặt thành TrueMicrosoft Excel gọi bản xem trước in trước khi in trang tính (do đó cung cấp cho bạn tùy chọn hủy) hoặc False(hoặc bỏ qua) để in tờ ngay lập tức, vô điều kiện.

Hoặc, nếu bạn thực sự lo lắng về việc quên chạy nó, bạn có thể sử dụng Private Sub Worksheet_Changeđể cập nhật các công thức có thể hiển thị bất cứ khi nào bạn thực hiện bất kỳ thay đổi nào trong bảng tính.


2

Có lẽ đáng chú ý là kể từ Excel 2013, có một hàm riêng cho việc này : FORMULATEXT.

Từ hỗ trợ dot office dot com bài viết về FORMULATEXTchức năng:

Sự miêu tả

Trả về một công thức dưới dạng một chuỗi.

Cú pháp

FORMULATEXT (tham khảo)

Cú pháp hàm FORMULATEXT có các đối số sau:

  • Yêu cầu tham khảo . Một tham chiếu đến một ô hoặc phạm vi của các ô.

Nhận xét

  • Hàm FORMULATEXT trả về những gì được hiển thị trong thanh công thức nếu bạn chọn ô được tham chiếu.

1
Đẹp. Được xây dựng trong là cách để đi. Không giống như giải pháp Indreks, điều này hiển thị lỗi nếu trường không phải là công thức, bạn có thể dễ dàng kiểm tra trước với điều này: = IF (ISFORMULA (B1); FORMULATEXT (B1); B1)
Peheje


0

Bổ trợ miễn phí, FormulaDesk có thể làm điều này cho bạn, cũng như hiển thị công thức theo cách dễ hiểu hơn và xác định chính xác các lỗi trong công thức.

Như bạn có thể thấy trong ảnh chụp màn hình bên dưới, bạn có thể xem kết quả cuối cùng của ô và công thức gốc và hiển thị công thức có thể khám phá được tăng cường đồng thời, như bạn đã hỏi.

[Tiết lộ: Tôi là tác giả của FormulaDesk]

nhập mô tả hình ảnh ở đây


1
Cảm ơn bạn đã tiết lộ liên kết của bạn. Có vẻ như bạn có những đóng góp trước đây trên Stack Exchange, điều này thật tuyệt, nhưng tôi khuyên bạn nên đọc lại chính sách tự quảng cáo để đảm bảo an toàn. Bạn đã không làm gì sai, nhưng đôi khi người dùng thấy ai đó chỉ có câu trả lời trên trang web đang quảng cáo thứ gì đó họ đã làm, họ gắn cờ đó là thư rác. Nó cũng sẽ cải thiện câu trả lời này nếu bạn có thể đưa vào ảnh chụp màn hình làm ví dụ. Cảm ơn!
nheo

Cảm ơn bạn đã chỉ ra điều này cho tôi. Tôi đã chỉnh sửa câu trả lời của mình để trả lời chính xác câu hỏi ban đầu của bạn.
Gareth Hayter

0

Tôi biết rất ít về lập trình và câu trả lời của tôi không thanh lịch. Là một kỹ sư tương lai, tôi cần một hàm trong Excel có thể hiển thị cho tôi công thức. Vấn đề tôi tìm thấy trong giải pháp Indrek là hàm của anh ta trả về cho tôi một công thức như thế này: "C9 * C9 * pi ()" và tôi muốn tên của các ô trong màn hình của công thức (C9) được thay đổi thành các giá trị của những tế bào đó; và điều đó sẽ tự động thay đổi bất cứ khi nào những số đó được thay đổi trong ô C9 ban đầu.

Mã của tôi loại công việc với các công thức rất cơ bản. Tôi chưa bao giờ tìm thấy một cái gì đó như thế này ở bất cứ nơi nào khác. Nó có thể giúp đỡ ai đó hoặc không. Ai đó có thể có thể cải thiện điều này đến một mức độ tốt. Như tôi đã nói, nó hiệu quả với tôi và tôi là một chàng trai thực tế với ít kỹ năng lập trình.

Hàm đầu tiên không phải là mỏ của tôi. Nó được lấy từ:

/programming/10951687/how-to-search-for-opes-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

Bạn có thể tạo một cột bổ sung có chứa các công thức: = REPLACE (target_cell; 1; 1; "")


Không làm việc cho tôi.
tohuwawohu

Điều này sẽ không hoạt động.
Alex M

-2

Đây là một giải pháp:

  1. Đặt dấu nháy đơn ( ') ở đầu công thức
  2. Sao chép nó vào hàng bên dưới hoặc cột dọc theo nó
  3. Quay trở lại công thức ban đầu và xóa dấu nháy đơn

Những công việc này.


4
Điều này đòi hỏi phải sao chép lại công thức mỗi khi bạn thay đổi nó. Khi thay đổi bảng tính thường xuyên, sẽ rất dễ để các công thức được sao chép không đồng bộ với các công thức thực.
nhe

Đây là trạng thái chính xác của vấn đề mà câu hỏi đang cố gắng giải quyết.
Alex M

-3

Kết hợp văn bản với một giá trị Giả sử ô A1 chứa số 9999

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

Công thức này sẽ hiển thị "Tổng cộng: $ 9,999.00"

Một ví dụ khác sử dụng chức năng NOW để hiển thị văn bản với ngày / giờ hiện tại

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

2
Trừ khi tôi hiểu lầm bạn, điều này chẳng liên quan gì đến những gì tôi đang hỏi.
nheo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.