Funkcja Excel, która ocenia ciąg znaków tak, jakby był formułą?

26

Załóżmy, że mam ciąg tekstowy podobny "11+5"lub nawet "=11+5"przechowywany w komórce. Czy w programie Excel jest funkcja, która pozwoli mi ocenić ten ciąg znaków tak, jakby był formułą?

Byłoby to pomocne w innym projekcie, w którym chciałbym móc pisać formuły „dynamiczne” w programie Excel.

drapkin11
źródło
3
excel miał funkcję EVALUATE (), która właśnie to robi. To było dawno temu i nie jestem zbyt pewny co do nowego programu Excel. Pogrzebię i zobaczę, czy uda mi się znaleźć coś ekwiwalentnego.
aCuria
1
ta funkcja brzmi znajomo, ale z pewnością nie mogę jej znaleźć w programie Excel2007, którego obecnie używam.
drapkin11
Nie mogę znaleźć albo = /
aCuria

Odpowiedzi:

26

EVALUATE jest dostępny w VBA we wszystkich aktualnych wersjach

Możesz dołączyć go do swojego kodu VBA lub zawinąć w prosty UDF, aby udostępnić go jako funkcję arkusza roboczego

Function ev(r As Range) As Variant
    ev = Evaluate(r.Value)
End Function

Zasadniczo traktuje wartość przekazanego parametru jako formułę programu Excel, tak jak gdyby była wprowadzona do komórki

"11+5"i "=11+5"da ten sam wynik

Chris Neilsen
źródło
1
Zapomniałem o funkcjach zdefiniowanych przez użytkownika w Excelu. Dzięki.
drapkin11
Zrobiłem niewielką modyfikację zmieniając parametr Range na String i działa to dobrze ze mną. dzięki
Makah,
17
=evaluate(put_reference[s]_here)

Jest to półfunkcja - może być używana tylko w Menedżerze nazw.

Oto jak możesz go użyć:

  • Wskaż komórkę i otwórz Menedżera nazw (z karty FORMUŁY lub klikając CTRL + F3)

    Oceń przykład

  • Napisz =evaluate(i kliknij wybraną komórkę (najlepiej, aby zachować względne odniesienie).

  • Zakończ formułę za pomocą )
  • Nadaj mu NAZWĘ - (w tym przykładzie po prostu go wywołam eva).
  • Kliknij OK .

Załóżmy teraz, że wybrałeś B1 i sprawiłeś, że wszystkie odnoszą się do A1. W A1 możesz wstawić „ 1 + 1 ”, a w B1 piszesz =eva- po wciśnięciu ENTER wartość B1 wyniesie 2. Ponieważ odwołanie w Name Manager było względne, możesz użyć, =evaaby uzyskać ocenę dowolnej komórki, która pozostała komórka, z której chcesz. (np. w B2, =evazwróci wynik komórki A2)

Laurentiu Mirica
źródło
1
Bardzo dobrze - i miło wiedzieć. Działa nawet w przypadku kolumny tabeli: = EVALUATE (Tablename [@ [kolumna]]) Coś, czego nie można łatwo znaleźć w większości pomocy programu Excel lub w samouczku zaawansowanym
Paschi
1
... i jak zwykle w przypadku formuł programu Excel, jeśli używasz zlokalizowanej kompilacji, musisz użyć zlokalizowanej funkcji - np. w programie Excel 2016 DE nazywa się=auswerten(...)
kiwiwings
6

Istnieje ważne zastrzeżenie ze świetną odpowiedzią @karel i @Laurentiu Mirica: funkcja oceny nie zostanie ponownie obliczona, chyba że komórka, której dotyczy odwołanie, ulegnie zmianie. Na przykład komórka C1 zawiera tekst, "A1+B1"a D1 zawiera funkcję =eval. Jeśli wartości w A1 lub B1 ulegną zmianie, komórka D1 nie zostanie ponownie obliczona .

Demonstracja rzeczywistego problemu

Można to poprawić, wprowadzając funkcję lotną do łańcucha lub komórki ewaluacyjnej. Wymusi to ponowne obliczenie za każdym razem, gdy arkusz zostanie ponownie obliczony. Na przykład komórkę C1 można zastąpić =if(today(),"A1+B1",). Lub D1 można zastąpić =if(today(),eval,). Każda funkcja lotna powinna działać.

Trzecim i być może najprostszym rozwiązaniem jest zmiana półfunkcji w menedżerze nazw na =if(today(),evaluate(c1),)

Jlear
źródło
Dzięki, szukałem takiej sztuczki od pewnego czasu :)
Ben Personick
4
=indirect()

jeśli użyjesz tego w komórce (obok konkatenatu), może to być bardzo przydatne.

Na przykład ta formuła wyświetli wartość komórki B5 w innym arkuszu (którego nazwa jest przechowywana w komórce A2 w tym arkuszu):

=INDIRECT(CONCATENATE(A2,"!B5"))

Aby INDIRECT działał, zewnętrzny arkusz roboczy musi być otwarty.

user206351
źródło
Nie działa, zwraca #REF
SIslam
9
INDIRECT może wykonywać matematykę i funkcje, ale tylko w ramach tworzenia odwołania do komórki. Nie można go używać w ogólnym znaczeniu zadanym w pytaniu.
fixer1234