Funzione Excel che valuta una stringa come se fosse una formula?


26

Supponiamo che io abbia una stringa di testo simile "11+5"o addirittura "=11+5"memorizzata in una cella. Esiste una funzione in Excel che mi permetterà di valutare effettivamente quella stringa come se fosse una formula?

Ciò sarebbe utile per un altro progetto in cui vorrei poter scrivere formule "dinamiche" in Excel.


3
excel aveva questa funzione EVALUATE () che fa esattamente questo. Questo è successo molto tempo fa, e non sono troppo sicuro del nuovo Excel. Frugerà e vedrà se riesco a trovare qualcosa di equivalente.
aCuria

1
questa funzione sembra familiare, ma di certo non riesco a trovarla in Excel2007, che è quello che sto attualmente utilizzando.
drapkin11

Non riesco a trovarlo = /
aCuria

Risposte:


26

EVALUATE è disponibile in VBA in tutte le versioni correnti

Puoi includerlo nel tuo codice VBA o racchiuderlo in un semplice UDF per renderlo disponibile come funzione di foglio di lavoro

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

In sostanza tratta il valore del parametro passato come una formula di Excel, come se fosse inserito in una cella

"11+5"e "=11+5"produrrà lo stesso risultato


1
Ho dimenticato tutto sulle funzioni definite dall'utente in Excel, grazie.
drapkin11

Ho fatto una piccola modifica cambiando il parametro Range su String e funziona bene da parte mia. grazie
Makah

17
=evaluate(put_reference[s]_here)

Questa è una semifunzione: può essere utilizzata solo in Name Manager.

Ecco come puoi usarlo:

  • Puntare su una cella e aprire Gestione nomi (dalla scheda FORMULE o facendo clic su CTRL + F3)

    Valuta l'esempio

  • Scrivi =evaluate(e fai clic sulla cella che desideri (meglio mantenere un riferimento relativo).

  • Termina la formula con )
  • Dagli un NOME - (in questo esempio lo chiamerò semplicemente eva).
  • Clicca OK .

Supponiamo ora di aver selezionato B1 e fatto fare tutto questo riferimento ad A1. In A1 puoi inserire " 1 + 1 " e in B1 scrivi =eva- una volta premuto INVIO, il valore B1 sarà 2. Poiché il riferimento in Name Manager era relativo, è possibile utilizzare =evaper ottenere la valutazione di qualsiasi cella rimasta una cella da dove lo si desidera. (es. in B2, =evarestituirà il risultato della cella A2)


1
Molto bene - e bello da sapere. Funziona anche per una colonna di tabella: = VALUTA (Nome tabella [@ [colonna]]) Qualcosa che non riesci a trovare facilmente nella Guida di Excel o in un tutorial avanzato
Paschi,

1
... e come al solito con le formule Excel, se usi una build localizzata, devi usare la funzione localizzata - ad es. in Excel 2016 DE si chiama=auswerten(...)
kiwiwings

7

C'è un avvertimento importante con la grande risposta di @karel e @Laurentiu Mirica: la funzione di valutazione non verrà ricalcolata a meno che la cella di riferimento non cambi. Ad esempio, la cella C1 contiene il testo "A1+B1"e D1 contiene la funzione=eval . Se i valori in A1 o B1 cambiano, la cella D1 non viene ricalcolata .

Dimostrazione del problema eval

Questo può essere corretto introducendo una funzione volatile nella stringa o nella cella di valutazione. Ciò imporrà un ricalcolo ogni volta che il foglio di lavoro viene ricalcolato. Ad esempio, la cella C1 potrebbe essere sostituita con =if(today(),"A1+B1",). Oppure, D1 potrebbe essere sostituito con =if(today(),eval,). Qualsiasi funzione volatile dovrebbe fare.

Una terza e forse la soluzione più semplice è cambiare la semi-funzione nel gestore dei nomi in =if(today(),evaluate(c1),)


Grazie, ho cercato un trucco come questo e per un po 'di tempo :)
Ben Personick,

4
=indirect()

se lo usi in una cella (insieme a concatenato) può essere molto utile.

Ad esempio, questa formula visualizzerà il valore della cella B5 su un altro foglio di lavoro (il cui nome è memorizzato nella cella A2 su questo foglio di lavoro):

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

Per far funzionare INDIRECT il foglio di lavoro esterno deve essere aperto.


Non funziona, restituisce #REF
SIslam l'

10
INDIRECT può eseguire matematica e funzioni, ma solo come parte della creazione di un riferimento di cella. Non può essere utilizzato nel senso generale richiesto nella domanda.
fixer1234
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.