Poszukuję rozwiązania skracającego formułę IF


9

Mam długą formułę o następującej strukturze:

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

gdzie ! X! to bardzo długa formuła.

Czy istnieje rozwiązanie pozwalające uniknąć powtarzania! X! dwa razy? Potrzebuję go z dwóch powodów:

  1. Aby formuła była czytelna dla użytkownika arkusza
  2. Aby skrócić czas procesu

Doceniam każdą pomoc.

Dzięki, Dio


1
jeśli chcesz, To reduce the process timeto oczywiście musisz gdzieś zapisać wynik, w przeciwnym razie Excel ponownie przeliczy wartość, gdy warunek się spełni. Podział jest również bardzo kosztowną operacją
phuclv

2
Ciekawe też, czy „grałeś w golfa” tak długo, jak potrafisz? Aby go skrócić, może dodać nazwane zakresy?
BruceWayne

Aby uczynić długą formułę bardziej czytelną, rozdziel argumenty na różne wiersze, używając kombinacji Alt + Return. Jednym minusem jest to, że jeśli użytkownik nie zwiększy wysokości paska formuły, formuła wygląda na niepełną.
Brad Smith

Odpowiedzi:


12

Innym podejściem jest użycie podwójnej inwersji :

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

Jeśli really_long_formula ma wartość 0 , dostaniesz dzielenie przez zero, a IFERROR()będzie go złapać!

Należy pamiętać, że zwykłym (i najlepszym) sposobem spełnienia tego wymogu jest użycie komórki pomocniczej.


7
może to ucierpieć z powodu utraty precyzji z powodu podziału zmiennoprzecinkowego
phuclv

3
@ LưuVĩnhPhúc Masz całkowitą rację! AFH podejście jest najlepszym rozwiązaniem!
Student Gary'ego

To niezła sztuczka. Powstrzymałbym się mocno przed używaniem, ale w ostateczności, kto wie?
André Chalella,

3
UWAGA: to prawda, że może wystąpić utrata precyzji, ale rzadko byłby to istotny problem. Testowałem 1/1/xkilkakrotnie w programie Excel 100 000 liczb losowych i tylko 1,4% czasu występował błąd zaokrąglania. Maksymalny błąd względny, jaki kiedykolwiek znalazłem, wynosił 1,6e-16, co właściwie jest zerowe. Co ciekawe, liczby całkowite nigdy nie wyświetlały błędów zaokrąglania (przetestowano kilka zakresów od 0 do 1e14). Tak więc na tę odpowiedź można się skrzywić z punktu widzenia czystości / czystości, ale nie z praktycznego punktu widzenia obliczeń.
André Chalella,

1
Uważam rozwiązanie Gary'ego za najlepsze. Po pierwsze dlatego, że jest czysty (jak wspomniano również przez André) i czytelny dla innych użytkowników. Po drugie, ponieważ zaspokaja moją potrzebę. Nie mam skomplikowanych ani długich liczb całkowitych. Mam nadzieję, że użytkownicy, którzy wybiorą to podejście, przeczytają komentarze, które będą oczekiwane na temat zalet i wad tego rozwiązania.
Dio

23

Oczywistą odpowiedzią jest umieszczenie formuły w komórce roboczej, z dala od głównego arkusza. Na przykład, jeśli używasz H1, ustaw na:

=!X!

Twoja formuła staje się następnie:

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

Jest to typowe dla tego, co można zrobić w każdym innym języku programowania.


Nie mam możliwości dodania kolumny pomocy. W każdym razie dzięki.
Dio

2
@Dio, jeśli nie powinno być widoczne, po prostu ukryj kolumnę. Możesz nawet nazwać kolumnę / zakres, aby ułatwić czytanie
phuclv,

4
@Dio - OK. Twoja zaakceptowana odpowiedź jest dość sprytna, ale pamiętaj, że z powodu zaokrąglania możesz stracić dokładność ( 1/(1/x)nie zawsze jest dokładnie taka sama jak x), szczególnie jeśli masz do czynienia z danymi liczbowymi całkowitymi. Nie ma również zastosowania bardziej ogólnie (np. Sprawdzanie wartości mniejszej niż zero). (Komentarz skrzyżowany z odpowiedzią @ LưuVĩnhPhúc pod przyjętą odpowiedzią.)
AFH

Dziękuję za porady i komentarze. Pozostawię pytanie otwarte, aby sprawdzić, czy są jeszcze nowe sugestie.
Dio

2
Przydałoby się zobaczyć długą formułę. Oprócz komórki
roboczej

3

Czy naprawdę potrzebujesz wyniku ""w fałszywym przypadku? Jeśli potrzebujesz tylko komórki, aby wyglądała pusto (np. Nie będziesz używać czegoś takiego =ISNUMBER()na niej później), możesz użyć formatowania warunkowego, aby ukryć zawartość w fałszywym przypadku.

Format warunkowy zastosowany do komórki, aby nic nie wyświetlał , jest formatem niestandardowym "", takim jak ten (jest w języku portugalskim, ale masz pomysł):

niestandardowy format pustych komórek

Formuła w komórce będzie, zgodnie z oczekiwaniami, po prostu =!X!+A1.

Formuła formatowania warunkowego mogłaby być =!X!=0, ale wymusiłoby to ponowne obliczenie !X!, którego nie chcesz (twój „punkt 2”). Lepiej jest wykorzystać samą komórkę za pomocą =B1=A1(zakładając, że nasza komórka to B1 ) - to by oznaczało !X! = 0.

Nawet jeśli rzeczywiście potrzebujesz zawartości komórki "", zwykle można wprowadzić niewielkie zmiany w arkuszu, aby można było zastosować to podejście. Jeśli tak jest, zostaw komentarz opisujący sytuację.


1

Nie mam możliwości dodania kolumny pomocy. W każdym razie dzięki.

Jeśli nie możesz dodać kolumny pomocnika , dlaczego nie dodać całego arkusza? Ma to kilka zalet:

  • Twoja komórka pomocnicza nie zajmuje miejsca, które w innym przypadku mogłoby zostać wykorzystane, ponieważ znajduje się w osobnym arkuszu.
  • Możesz nazwać komórkę, a następnie zaadresować ją według nazwy, np=IF(X<>0,X+A1,"")
  • Jeśli musisz to zrobić w więcej niż jednej komórce, możesz:
    1. Zmień nazwę arkusza pomocnika „pomocnik”
    2. Umieść równanie pomocnika w tej samej komórce, co równanie główne (nazwijmy to D5.
    3. Zaadresuj komórkę jak helper!D5w głównym arkuszu.
  • W razie potrzeby możesz ukryć arkusz pomocnika.
  • Jest szybszy niż dwukrotna ocena.
  • Nie traci precyzji.

Wady, które widzę to:

  • Musisz odwoływać się do nienazwanych komórek w głównym arkuszu jako sheetname!D5zamiast tak jak D5.
  • Teraz formuła składa się z dwóch części zamiast jednej.
  • Rozprzestrzenianie się arkusza roboczego.

Biorąc pod uwagę zalety i wady, myślę, że w wielu przypadkach jest to dobre rozwiązanie. Istnieją sytuacje, w których nie jest to optymalne, choć w tej chwili nie mogę o tym myśleć.


1
Świetna odpowiedź. Wady, które widzę to: 1. Nie pomaga to w uproszczeniu obliczeń dla użytkownika, ponieważ teraz duża formuła jest ukryta. 2. Wiele skoroszytów jest już zatłoczonych arkuszami. Nawet jeśli go ukryjesz, być może będziesz musiał przejrzeć wiele ukrytych arkuszy, aby je odkryć. Poza tym jest to dobre rozwiązanie.
André Chalella,

@ AndréNeves Dzięki za to! Ten pierwszy przyszedł mi do głowy, ale zapomniałem o nim, pisząc rozdział o wadach .
wizzwizz4

1

opcją jeszcze nie zasugerowaną jest utworzenie funkcji zdefiniowanej przez użytkownika. Musisz włączyć kartę Deweloper na pasku menu (google it) i utworzyć moduł.

 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

Następnie możesz zrobić na pasku formuły

=udf_myCalc(A1)

UWAGA: Staje się teraz plikiem .xlsx (z makrami) i może wymagać dodatkowych uprawnień w sieci firmowej, ponieważ makra mogą być wykorzystywane do szkodliwych celów, a niektóre filtry poczty e-mail je blokują. Funkcje są nieudokumentowane, więc będziesz musiał podać notatki o tym, co robią twoje funkcje i uważam, że przydatne jest wywoływanie wszystkich moich funkcji udf_xxxxx, aby było jasne, że nie jest to funkcja wbudowana

Istnieją również inne GOTCHA z UDF. Zobacz ten link, aby uzyskać kilka dobrych wskazówek http://www.decisionmodels.com/calcsecretsj.htm

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.