Funzione utente personalizzata senza usare VBA


10

È possibile creare una funzione utente personalizzata in Excel senza usare VBA?
Il mio problema è che ho una lunga serie di funzioni Excel standard messe insieme per fare una funzione molto lunga. Questa funzione è utilizzata in 25 diversi fogli di lavoro nella mia cartella di lavoro. Se devo apportare modifiche ad esso, vorrei farlo in un solo posto e fare in modo che le modifiche vengano propagate automaticamente su tutti i fogli.

Ad esempio, un caso semplice e banale sarebbe quello di aggiungerne uno al risultato di SUM (), cioè. SUM (mySeries) +1 e chiamalo una nuova funzione MYSUM ().

Sono titubante nel tradurre la formula lunga in VBA a causa dei potenziali errori che potrebbero sorgere e della complessità aggiunta.


Bella domanda, anche se dubito che troverai una risposta. Penso che un corso migliore sarebbe chiedere aiuto per costruire la funzione richiesta in VBA.
EliadTech,

Risposte:


11

Sì, è possibile se si utilizzano formule con nome Excel .

Ad esempio, supponiamo che sia necessario calcolare la differenza tra le somme di due colonne consecutive ( A5: Ax - B5: Bx ) in diversi punti della cartella di lavoro ( x è l'ultima riga di ogni colonna):

Quindi definisci in A11 un nome chiamato diff (qualsiasi nome può essere usato) come = Sum (A $ 5: A10) -Sum (B $ 5: B10) , supponendo che i dati inizino nella riga 5 fino alla riga precedente. Potrebbe essere qualsiasi cella, non solo A11 , ma la definizione cambia allo stesso modo.

Sfortunatamente, Excel 2010 inserisce prefissi assoluti ( $ ) e prefissi del foglio di lavoro, quindi è necessario cancellare i prefissi, ma mantenendo i punti esclamativi e cancellare la maggior parte dei $ caratteri.

Quando sposti le formule, la maggior parte dei riferimenti sono relativi. Quindi calcola sempre la differenza tra la colonna corrente e la seguente, a partire dalla riga 5 fino alla riga prima della riga totale.

Quindi se hai dati tra C5 e D100 inserisci solo = Diff in C101 e calcola Somma (C5: C100) - Somma (D5: D100) .

Ovviamente, puoi usare nomi locali o globali nelle formule nominate, come hai menzionato nella tua domanda.

Puoi leggere maggiori dettagli in Formule nominate .


2

So che non hai detto VBA, ma fare quanto segue NON richiede in realtà di riscrivere le tue formule, sapere molto su VBA, né mantenere le tue formule in VBA. Puoi scriverlo una volta e dimenticartene.

Creare una funzione definita dall'utente per estrarre la formula da una cella come stringa:

Function GetFormula(Target As Range) As String
    GetFormula = Target.Formula
End Function

Creane un altro per valutare una stringa come una formula:

Function Eval(Ref As String)
    Application.Volatile
    Eval = Evaluate(Ref)
End Function

Se avessi la tua formula principale in sheet1! A1, la inseriresti in ogni cella che deve usarla:

=eval(getformula(sheet1!a1))

Qual è il vantaggio dell'utilizzo di questo metodo rispetto alle formule con nome Excel?
DakotaD,

Questo in realtà definisce una funzione, mentre "Formule con nome" definisce semplicemente un riferimento a un risultato. Ad esempio, se voglio creare una funzione che controllerà se una cella è vuota o solo uno spazio bianco, vorrei chiamarla così =IF(BlankOrWhitespace(A5),true,false). Per le Formule nominate questo non è possibile perché stai facendo riferimento al contenuto della formula di una cella e non stai definendo una nuova funzione
mtalexan,

1
C'è un altro problema che deriva dall'utilizzo di VBA. Sicurezza. La tua cartella di lavoro sarebbe considerata non sicura perché VBA può essere abusato. La tua cartella di lavoro verrebbe scambiata per avere virus.
Akangka,

@Akangkathe motivo per cui evito VBA. È così triste.
Pedro77

0

Questo thread è un po 'vecchio, ma mi sono imbattuto in esso cercando qualcos'altro e ho pensato di condividere una cartella di lavoro che ho creato qualche tempo fa cercando di realizzare questa cosa esatta: https://www.dropbox.com/s/gf5qrjj5q81tpke/ Title_Case_Named_Range_Function.xlsx? dl = 1

In breve, PUOI creare un UDF senza VBA (sorta di) dirottando una delle formule incorporate di Excel con un output di stringa di lunghezza 0 e trovando un metodo per interpretare i dati inseriti tramite la manipolazione di stringhe Named Range, ma è oltre inefficiente per farlo. SEI STATO AVVISATO! :)

METODO:

  1. Nell'esempio, ho usato entrambi = REPT ([riferimento di cella o del testo tra virgolette qui], 0) e = TEXT ([riferimento di cella o del testo tra virgolette qui], ";;;") come punto di partenza da in grado di avere una qualche forma di input dell'utente in una formula integrata che non produrrebbe alcun risultato di testo visibile nella cella stessa.

  2. Quindi ho creato un intervallo denominato che sarebbe l'equivalente del nome UDF ( TCase è l'esempio principale nel foglio, ma ci sono anche diverse altre varianti). Questo intervallo denominato in realtà fa riferimento a tutta una serie di altri nomi nascosti nella cartella di lavoro per estrarre il FormulaText dalla cella in cui è utilizzato e quindi applica una logica ad esso per produrre un output finale come stringa. Vale la pena notare che questo metodo potrebbe restituire solo risultati di testo e non numeri (anche se potrebbe restituire un numero come testo da convertire in una cella separata).

  3. Di per sé, = TCase produce un errore poiché non è presente alcun riferimento cella / stringa da interpretare (nel foglio di esempio, il messaggio di errore è solo un promemoria del formato che deve essere seguito). Ma, combinando TCase con la formula Excel di stringa a lunghezza attesa prevista, gli consente di leggere l'input dalla formula come stringa e applicare la logica ad essa. Alla fine, la formula / output sarebbe simile al seguente. Nota che ho inserito la stringa di testo direttamente nella formula seguente, ma vedrai nel foglio di esempio che può anche interpretare un singolo riferimento di cella.

    FORMULA:
    =TCase&REPT("i want to convert this mIxEd sTRing into A TITLE cAsE string!!!",0)

    PRODUZIONE:

    I Want to Convert This Mixed String Into a Title Case String!!!

Alla fine, non consiglierei di seguire questo metodo per qualcosa di diverso da una morbosa curiosità per vedere a quali limiti si può spingere Excel. VBA è una soluzione UDF molto più semplice ed elegante, ma almeno mi sono divertito a raccogliere la sfida.

NOTA: se vuoi vedere come funziona un po 'più facilmente nel file di esempio, usa la formula di valutazione dalla barra multifunzione Formule ed entra / esci dalla formula in una delle celle in cui ho inserito un esempio. Ho nascosto tutte le gamme nominate sottostanti per ripulire tutto dopo che ho finito, quindi non si presentano in Names Manager a meno che tunon le mostritutte.

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.