Excel bir formülü ve sonucunu aynı anda gösterebilir mi?


10

Excel'de değerleri görüntüleme ve formülleri görüntüleme arasında geçiş yapmanın mümkün olduğunu biliyorum . Bir istatistik sınıfı için ödevleri hem formülü hem de sonucu gösteren yazdırılmış bir Excel sayfası olarak açmam gerekiyor . Şu anda eğitmen formülü kopyalayıp hesaplanan değerin yanına metin olarak yapıştırmamızı veya değeri kopyalayıp formülün yanına yapıştırmamızı sağlıyor. Bu çok verimsizdir, hataya açıktır (kopyala-yapıştır yaptıktan sonra formülü veya değerleri değiştirirseniz) ve genellikle zaman kaybıdır.

Excel'in aynı hücrede formülü ve değerini göstermesinin herhangi bir yolu var mı? Değilse, formülü başvurulan bir hücreden düz metin olarak görüntüleyecek, örneğin =showformula(A1)bunun =sum(A2:A5) yerine yazdırılacak 25(hücrenin formülü ve değeri olsaydı) herhangi bir işlev var A1mı?

Excel 2010 kullanıyorum, ancak Excel'in son sürümlerinde çalışan genel bir cevap güzel olurdu.

Yanıtlar:


18

Bunun için herhangi bir yerleşik fonksiyonun farkında değilim. Ancak, istediğinizi gerçekleştirmek için kullanıcı tanımlı bir VB işlevi oluşturabilirsiniz.

VBA düzenleyicisini açmak için Alt + F11 tuşlarına basın , Proje Gezgini'ni sağ tıklatın ve Ekle -> Modül'ü seçin . Aşağıdaki kodu yapıştırın:

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

Şimdi =GetFormula(A1)bu hücrenin formülünü göstermek için kullanabilirsiniz .


Bu rutini kullandım - bir hata alıyorum Değişken tanımlanmadı Getformula için değişken bildirimi ne olmalı?
Prasanna

@Prasanna GetFormulabir değişken değil, bir işlev. Hangi Excel sürümünü kullanıyorsunuz?
Indrek

Excel 2013. Cehaletimi affedin - VBA öğrenmeye başladım
Prasanna

2

İşte daha önce ne yaptığınızı otomatikleştirmenin bir yolu. LonelyKnight'ın kendi sorusuna , Indrek'in cevabına ve Billis'in cevabına ilişkin en iyi kısımları birleştirir :

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

Belirtilen aralıktaki (burada sabit kodlanmış olarak A1:G5) her hücre için, kesme işareti ile korunan hücrenin formülünü sabit bir ofset uzaktaki bir hücreye kopyalar. ( Excel'de VBA kullanma konusunda yardım için MS Office'te VBA'yı nasıl ekleyebilirim? ) Yazdırmadan önce bu makroyu çalıştırmayı unutmayın.

Veya daha PrintOut , , , Trueönce bir ifade ekleyin; Exit Subbu makro sayfayı sizin için yazdırır. (Sadece yazdırmak için hatırlamak zorunda bu makro kullanarak dördüncü parametre.) PrintOutOlduğu Önizleme ayarlı, True(böylece size iptal etme seçeneğini sunan) sayfasını yazdırmadan önce baskı önizleme çağırmak Microsoft Excel olması veya Falseyazdırmak için (veya atlanmış) koşulsuz olarak derhal.

Gerçekten bu çalışmasına unutmadan endişe ediyoruz Ya da, kullanabileceğiniz Private Sub Worksheet_Changegörüntülenebilir formülleri Yaptığınız zaman güncellemek için herhangi çalışma sayfasında değişiklik.


2

Excel 2013'ten itibaren, bunun için yerli işlev var olduğunu belirterek Belki değer: FORMULATEXT.

FORMULATEXTFonksiyona ilişkin destek dot office dot com makalesinden :

Açıklama

Formülü dize olarak döndürür.

Sözdizimi

FORMULATEXT (referans)

FORMULATEXT işlevinin söz diziminde aşağıdaki bağımsız değişkenler bulunur:

  • Referans Gerekli. Bir hücreye veya hücre aralığına başvuru.

Uyarılar

  • FORMULATEXT işlevi, başvurulan hücreyi seçerseniz formül çubuğunda görüntülenenleri döndürür.

1
Güzel. Yerleşik gitmek için bir yoldur. Indreks çözümünün aksine, alan bir formül değilse, bir hatayı gösterir, daha önce bununla yavaşça kontrol edebilirsiniz: = IF (ISFORMULA (B1);
FORMULATEXT


0

Ücretsiz eklenti FormulaDesk bunu sizin için yapabilir ve formülü daha anlaşılır bir şekilde görüntüleyebilir ve formüldeki hataları saptayabilir.

Aşağıdaki ekran görüntüsünde görebileceğiniz gibi, hücrenin nihai sonucunu ve orijinal formülü ve formülün gelişmiş patlatılabilir görüntüsünü istediğiniz gibi görüntüleyebilirsiniz.

[Açıklama: FormulaDesk'in yazarıyım]

resim açıklamasını buraya girin


1
Üyeliğinizi açıkladığınız için teşekkür ederiz. Stack Exchange'de daha önceki katkılarınız var gibi görünüyor, bu harika, ancak kendi kendini geliştirme politikasını sadece güvenli olmak için tekrar okumanızı öneririm . Yanlış bir şey yapmadınız, ancak çoğu zaman kullanıcılar sitede yalnızca yanıtları yaptıkları bir şeyi tanıtan birini gördüklerinde, spam olarak işaretlerler. Örnek olarak bir ekran görüntüsü ekleyebilirseniz bu yanıtı da geliştirir. Teşekkürler!
nhinkle

Bunu bana gösterdiğin için teşekkürler. Orijinal sorunuzu tam olarak cevaplamak için cevabımı düzenledim.
Gareth Hayter

0

Programlama hakkında çok az şey biliyorum ve cevabım zarif değil. Gelecekteki bir mühendis olarak Excel'de bana formülü gösterebilecek bir işleve ihtiyacım vardı. Indrek çözümünde bulduğum problem, işlevinin bana böyle bir formül döndürmesi: "C9 * C9 * pi ()" ve formül (C9) ekranındaki hücre adlarının değerlerine değiştirilmesini istedim bu hücreler; orijinal C9 hücresinde bu sayılar her değiştirildiğinde otomatik olarak değişir.

Benim kod tür çok temel formüllerle çalışır. Başka hiçbir yerde böyle bir şey bulamadım, Birine yardım edebilir ya da etmeyebilir. Birisi bunu iyi bir seviyeye geliştirebilir. Dediğim gibi, bu benim için çalışıyor ve ben programlama konusunda çok az bilgiye sahip pratik bir adamım.

İlk işlev hiç benim değil. Şuradan alındı:

/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

Formülleri içeren ek bir sütun oluşturabilirsiniz: = REPLACE (target_cell; 1; 1; "")


Benim için çalışmıyor.
tohuwawohu

Bu işe yaramayacak.
Alex M

-2

İşte bir çözüm:

  1. 'Formülün başına kesme işareti ( ) koyun
  2. Aşağıdaki satıra veya yanındaki sütuna kopyalayın
  3. Orijinal formüle geri dönün ve kesme işaretini kaldırın

Bu çalışıyor.


4
Bunun için formülü her değiştirdiğinizde yeniden kopyalanması gerekir. Bir e-tabloyu sık sık değiştirirken, kopyalanan formüllerin gerçek formüllerle senkronize olmaması çok kolay olacaktır.
nhinkle

Sorunun çözmeye çalıştığı kesin durum budur.
Alex M

-3

Metni bir değerle birleştirin A1 hücresinin 9999 sayısını içerdiğini varsayalım

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

Bu formülde "Toplam: 9,999,00 $" görüntülenecektir

Geçerli tarih / saate sahip metni görüntülemek için NOW işlevini kullanan başka bir örnek

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

2
Seni yanlış anlamadığım sürece, bunun istediğim şeyle hiçbir ilgisi yok.
nhinkle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.