Alla ricerca di una soluzione per abbreviare una formula IF


9

Ho una formula lunga con la seguente struttura:

=IF(!X!<>0,!X!+A1,"")

dove ! X! è una formula molto lunga.

Esiste una soluzione per evitare di ripetere! X! due volte? Ne ho bisogno per due motivi:

  1. Per rendere la formula leggibile per l'utente del foglio
  2. Per ridurre i tempi di processo

Apprezzo qualsiasi aiuto.

Grazie, Dio


1
se vuoi, To reduce the process timeovviamente, devi memorizzare il risultato da qualche parte, altrimenti Excel deve ricalcolare di nuovo il valore quando la condizione corrisponde. La divisione è anche un'operazione molto costosa
— phuclv,

2
Anche solo curioso, hai "giocato a golf" la formula lunga più in basso che puoi? Per renderlo più breve forse aggiungere intervalli denominati?
— BruceWayne,

Per rendere più leggibile una formula lunga, separa gli argomenti su righe diverse usando alt + return. Un aspetto negativo è se l'utente non espande l'altezza della barra della formula, la formula sembra incompleta.
— Brad Smith,

Risposte:


12

Un altro approccio è utilizzare la doppia inversione :

=IFERROR(1/(1/really_long_formula)+A1,"")

Se real_long_formula viene valutato a 0 , otterrai una divisione per zero e la IFERROR()prenderai!

Si noti che il modo normale (e il modo migliore) per gestire questo requisito è con una cella di supporto.


7
ciò potrebbe risentire della perdita di precisione dovuta alla divisione in virgola mobile
— phuclv,

3
@ LưuVĩnhPhúc Hai perfettamente ragione! l' approccio AFH è l'approccio migliore!
— Gary's Student,

Questo è un bel trucco sporco. Vorrei trattenermi pesantemente dall'usarlo, ma, come ultima risorsa, chi lo sa?
— André Chalella,

3
NOTA: è vero che potrebbe esserci una perdita di precisione, ma raramente sarebbe un problema rilevante. Ho provato più 1/1/xdi 100.000 numeri casuali più volte in Excel e solo l'1,4% delle volte si è verificato un errore di arrotondamento. L'errore relativo massimo che abbia mai trovato era 1,6e-16, che è, in effetti, zero. Inoltre, è interessante notare che gli interi non hanno mai mostrato errori di arrotondamento (testati diversi intervalli da 0 a 1e14). Quindi, questa risposta può essere disapprovata dal punto di vista della purezza / purezza, ma non dal punto di vista del calcolo pratico.
— André Chalella,

1
Trovo la soluzione di Gary come la migliore. Innanzitutto perché è pulito (come indicato anche da André) e leggibile da altri utenti. Secondo, perché soddisfa il mio bisogno. Non ho numeri interi complicati o lunghi. Spero che gli utenti, che scelgono questo approccio, leggano i commenti per essere consapevoli dei pro e dei contro di questa soluzione.
— Dio,

23

La risposta ovvia è mettere la formula in una cella di lavoro, lontano dal foglio principale. Ad esempio, se lo usi H1, impostalo su:

=!X!

La tua formula diventa quindi:

=IF(H1<>0,H1+A1,"")

Questo è tipico di ciò che si farebbe in qualsiasi altro linguaggio di programmazione.


Non ho la possibilità di aggiungere una colonna di aiuto. Grazie comunque.
— Dio,

2
@Dio se non dovrebbe essere visto, allora semplicemente nascondi la colonna. Puoi persino nominare la colonna / intervallo per rendere più facile la lettura
— phuclv

4
@Dio - OK. La tua risposta accettata è piuttosto intelligente, ma tieni presente che, a causa dell'arrotondamento, potresti perdere la precisione ( 1/(1/x)non è sempre esattamente la stessa di x), specialmente se hai a che fare con dati interi. Inoltre, non è applicabile più in generale (ad es. Controllo per meno di zero). (Il commento è stato incrociato con la risposta accettata di @LưuVĩnhPhúc.)
— AFH

Grazie per i tuoi consigli e commenti. Lascerò la domanda ancora aperta per vedere se ci sono ancora nuovi suggerimenti.
— Dio,

2
Sarebbe utile vedere la formula lunga. Oltre a una cella di lavoro, è possibile definire un nome in un foglio di lavoro che contiene una formula
— datatoo

3

Hai davvero bisogno che il risultato sia ""nel caso falso? Se hai solo bisogno che la cella appaia vuota (ad esempio non userai qualcosa di simile =ISNUMBER()in seguito), puoi usare la formattazione condizionale per nascondere i contenuti nel caso falso.

Il formato condizionale che applicherai alla cella in modo che non visualizzi nulla è il formato personalizzato "", in questo modo (è in portoghese ma ottieni l'idea):

formato personalizzato per celle vuote

La formula nella cella sarà, come previsto, semplicemente =!X!+A1.

La formula di formattazione condizionale potrebbe essere =!X!=0, ma ciò costringerebbe il ricalcolo di !X!, che non vuoi (il tuo "Punto 2"). È meglio sfruttare la cella stessa usando =B1=A1(supponendo che la nostra cella sia B1 ) - ciò implicherebbe !X! = 0.

Anche se è necessario che il contenuto della cella sia effettivamente "", in genere è possibile apportare piccole modifiche al foglio di lavoro in modo da poter utilizzare questo approccio. In tal caso, lascia un commento che descriva la situazione.


1

Non ho la possibilità di aggiungere una colonna di aiuto. Grazie comunque.

Se non riesci ad aggiungere una colonna di supporto , perché non aggiungere un intero foglio di lavoro? Ci sono diversi vantaggi in questo:

  • La tua cella di supporto non occupa spazio che potrebbe altrimenti essere utilizzato, poiché si trova in un foglio di lavoro separato.
  • Puoi nominare la cella quindi indirizzarla per nome, ad es=IF(X<>0,X+A1,"")
  • Se è necessario farlo in più di una cella, è possibile:
    1. Rinomina il foglio di lavoro dell'helper "helper"
    2. Inserisci l'equazione di aiuto nella stessa cella dell'equazione principale (chiamiamola D5.
    3. Indirizza la cella come helper!D5nel foglio principale.
  • È possibile nascondere il foglio di supporto, se necessario.
  • È più veloce della valutazione due volte.
  • Non perde precisione.

Gli svantaggi che posso vedere sono:

  • Devi fare riferimento a celle senza nome nel foglio principale come sheetname!D5anziché come D5.
  • Ora la formula è divisa in due parti anziché in una.
  • Proliferazione del foglio di lavoro.

Valutando i vantaggi e gli svantaggi, penso che per molti casi d'uso questa sia una buona soluzione. Esistono situazioni in cui non è ottimale, anche se al momento non riesco a pensarci.


1
Bella risposta. Gli svantaggi che vedo sono: 1. Non aiuta molto a rendere il calcolo più semplice per l'utente, poiché ora la formula grande è nascosta. 2. Molte cartelle di lavoro sono già affollate di fogli. Anche se lo nascondi, potresti dover passare attraverso molti fogli nascosti per scoprirlo. A parte questo, è una buona soluzione.
— André Chalella,

@ AndréNeves Grazie per quello! Quella prima mi è venuta in mente, ma l'ho dimenticata quando stavo scrivendo la sezione degli svantaggi .
— wizzwizz4,

1

un'opzione non ancora suggerita è quella di creare una funzione definita dall'utente. Dovresti attivare la scheda Sviluppatore nella barra dei menu (google it) e creare un modulo.

 public function udf_myCalc(ValueToAdd as double)
    dim myvar as double
    dim udf_myCalc as double
    myvar = .. put the logic of !X! in here

    if myvar<>0 then 
        udf_myCalc = myvar + ValueToAdd
    else
        udf_myCalc = ValueToAdd
    end if
 end function

Nella barra della formula lo faresti

=udf_myCalc(A1)

NOTA: questo ora diventa un file .xlsx (con macro) e potrebbe essere necessario disporre di autorizzazioni aggiuntive in una rete aziendale poiché le macro possono essere utilizzate per scopi dannosi e alcuni filtri e-mail li bloccano. Le funzioni non sono documentate, quindi dovrai fornire note su ciò che le tue funzioni stanno facendo e trovo utile chiamare tutte le mie funzioni udf_xxxxx in modo che sia chiaro che non è una funzione integrata

Esistono anche altri GOTCHA con UDF. Vedi questo link per alcuni buoni consigli http://www.decisionmodels.com/calcsecretsj.htm

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.