Poniżej spisuję, jak są wyliczane wyrażenia excelowe. To, co tu opisuję, testowałem na wersji 2010. Podejrzewam, że poniższy opis nie jest pełny i miejscami nie jest prawdziwy - może z czasem, jak się więcej dowiem, ulepszę go. Poprawnym wyrażeniem w Excelu jest pojedynczy literał lub wyrażenie złożone, przed którym postawiono znak równości (znak "="). Przed znakiem równości, który oznacza, że wyrażenie jest wyrażeniem złożonym, nie mogą stać żadne znaki - w tym żadne białe znaki. Po tym znaku równości może stać dowolna liczba spacji lub enterów. Wielkość liter w wyrażeniach nie ma znaczenia. Wyrażenia złożone mogą być ewaluowane na dwa sposoby: normalny i tablicowy. Sposób ewaluacji zależy od tego, jak zatwierdzimy wpisane wyrażenie. Wyrażenia zatwierdzone enterem ewaluują się normalnie, wyrażenia zatwierdzone przez shift+ctrl+enter są ewaluowane tablicowo. Poniższy opis zawiera najpierw opis ewaluacji normalnej, a potem, pod koniec, będzie opisane, czym się różni ewaluacja tablicowa. Wyrażenie złożone składa się z literałów połączonych operatorami, przepuszczanych przez funkcje i grupowanych nawiasami (zwykłymi, okrągłymi). Wszystkie operatory są jednym lub dwoma znakami nie będącymi literami. Są operatory unarne i binarne, nie ma operatorów więcejargumentowych (na przykład nie ma operatora trynarnego). Operatorów binarnych używa się zawsze tak: argument operator argument Na przykład: =3*7 Operatorów unarnych używa się zawsze tak: operator argument Na przykład: =+A1 Argumentami dla operatora mogą być literały lub wyrażenia. Między operatorem a jego argumentami może stać dowolna liczba spacji lub enterów. Przykładowo, oba poniższe wyrażenia dadzą ten sam wynik: =3*7 =3 * 7 Nawiasów używa się do grupowania, w zwykły matematyczny sposób. Z obu stron nawiasów może stać dowolna liczba spacji lub enterów. Przykładowo, oba poniższe wyrażenia dadzą ten sam wynik: =(3*5)+7 = ( 3 * 5 ) + 7 Funkcji używa się zawsze tak: nazwa(argument;argument;argument) Argumentów może być różna ilość - ile ich ma być, to zależy od funkcji. Na przykład: =suma(3;5;7) Między nazwą funkcji a nawiasem nie może być spacji. Przykładowo, takie wyrażenie jest niepoprawne składniowo: =suma (3;5;7) Dookoła argumentów może być dowolna liczba spacji. Przykładowo, oba poniższe wyrażenia dadzą ten sam wynik: =suma(3;5;7) =suma( 3 ; 5 ; 7 ) W wyrażeniach występują różne typy. Jest dużo typów skalarnych, typ "tablica" i typ "zakres". Są takie typy skalarne: 1. Liczba. Literały liczb można zapisywać na dwa sposoby: a) ciąg cyfr, a potem nieobowiązkowo przecinek i ciąg cyfr - na przykład "36,5" b) taki literał jak w poprzednim punkcie, a po nim znak procenta (znak "%") - na przykład "36,5%" Wewnątrz literału liczby nie można używać żadnych innych znaków, w tym białych znaków. 2. Napisy. Literały napisów zapisujemy w podwójnych ciapkach. Jeśli wewnątrz napisu chcemy uzyć podwójnego ciapka, eskejpujemy go przez napisanie go podwójnie. Na przykład: ="Eliza Orzeszkowa napisała ""Nad Niemnem""" 3. Wartości logiczne. Wartości logiczne mają dwa literały: "prawda" i "fałsz". 4. Błędy. Literały błędów wyglądają tak: #jakaśnazwa! lub #jakaśnazwa? Na przykład: =(#N/D!*#ADR!)/#DZIEL/0! =#NAZWA?*7 Są takie błędy: #ADR! #ARG! #DZIEL/0! #NAZWA? #N/D! 5. Typ "nic", którego jedyną możliwą wartością jest "nic". Ta wartość nie ma literału. Jedyny sposób, żeby ją uzyskać, to nie wpisać nic w komórkę. Jedyny sposób, żeby użyć jej w wyrażeniu, to użyć w wyrażeniu jednokomórkowy zakres wskazujący na taką pustą komórkę - taki zakres (zgodnie z zasadą, którą opiszę za chwilę) zewaluuje się do wartości "nic". Wynikiem ewaluacji wyrażenia nie może być wartość "nic" - gdyby tak wychodziło, ta wartość zostanie przerobiona na liczbę zgodnie z zasadami, które opiszę zaraz. Jest też typ "tablica". Tablica to prostokątna tablica składająca się z wierszy i kolumn, w których siedzą wartości. Literał tablicy wygląda tak: {literał\literał;literał\literał;literał\literał}. Jak widać, średnik (znak ";") to separator wierszy, a bekslesz (znak "\") to separator pól w wierszu. Każdy wiersz musi mieć tyle samo pól, inaczej jest błąd składniowy. Tablice jednowymiarowe tworzy się tak: {literał\literał\literał} lub tak: {literał;literał;literał}. Literałów w nawiasach klamrowych może być dowolna większa od zera ilość. Dookoła literałów mogą stać spacje, ale Excel i tak usuwa je z wyrażenia, kiedy tylko je zobaczy. Nie każdego literału można użyć w tablicy, a tylko literału liczby bez znaku procenta, literału błędu, wartości logicznej lub napisu. Wartość typu "tablica" nie może być wynikiem ewaluacji wyrażenia. Jeśli by tak wychodziło, to tablica zostaje przerobiona na skalar tak, że wynikiem przerobienia jest pierwsza wartość z pierwszego wiersza z tablicy. Tak samo jest przerabiana tablica na skalara również w innych sytuacjach, kiedy musi być przerobiona na skalara. Jest też typ "zakres". Zakres reprezentuje zbiór komórek - przy tym pojedyncza komórka to ten sam typ co kilka komórek. Literał zakresu jak wygląda, każdy wie. Wartość typu "zakres" nie może być wynikiem ewaluacji wyrażenia. Jeśli by tak wychodziło, to zakres zostaje przerobiony na skalar tak, że: a) Jeśli zakres składa się z jednej komórki, to wynikiem przerobienia jest wartość tej komórki. a) Jeśli zakres składa się z kilku kolumn, to wynikiem przerobienia jest błąd #ARG!. b) W przeciwnym wypadku wynikiem przerobienia jest ta wartość z zakresu, która leży w tym samym wierszu, w którym leży komórka, w której jest wpisane ewaluowane wyrażenie. Jeśli żadna komórka zakresu nie leży w tym wierszu, wynikiem przerobienia jest błąd #ARG!. Przykładowo, jeśli w komórki A3:A5 wpiszemy odpowiednio liczby 3, 5 i 7, a w komórkę B4 wpiszemy formułę: =A1:A100 to jej wynikiem będzie liczba 5. Tak samo jest przerabiany zakres na skalara również w innych sytuacjach, kiedy musi być przerobiony na skalara. Każdy operator i każda funkcja ma określone, jakiego typu mają być jego argumenty. Jeśli podamy argumenty innego typu, zostaną one przerobione na ten typ co trzeba według zasad, które opiszę za chwilę. Operatory matematyczna - plus (znak "+"), minus (znak "-"), razy (znak "*") i podzielić (znak "/") - spodziewają się, że dostaną liczby, błędy lub tablice. Jeśli dostaną coś innego, to coś jest przerabiane na liczbę według poniższych zasad. Napisy są przerabiane na liczby tak, że jeśli napis zawiera liczbę zapisaną w sposób zrozumiały dla Excela, z ewentualnie dodanymi z boków spacjami (ale enterami już nie), wynikiem przerobienia jest ta liczba. Zapisy, które rozumie Excel, to nie tylko te literały liczb, które możemy używać w wyrażeniach, ale wszystko, co moglibyśmy wpisać w komórkę, a Excel to by zrozumiał. Poza literałami liczb Excel rozumie liczby zapisane w sposób, w jaki liczbę wyświetla dowolne z formatowań - nawet liczby zapisane jako daty lub godziny. Wartości logiczne są przerabiane na liczby tak, że prawda zmienia się w 1, a fałsz w 0. Wartość "nic" przerobiona na liczbę daje w wyniku liczbę 0. Zakresy są przerabiane najpierw na skalary - według zasad, które opisywałem wcześniej - a potem otrzymany skalar albo jest liczbą, albo zostaje przerobiony na liczbę według opisanych już zasad. Przykładowo, taka formuła: =3*{"5 zł"\7} da w wyniku 15. Wynikiem działania operatorów matematycznych jest to, co każe matematyka. W niektórych sytuacjach komórce zawierającej to wyrażenie Excel zmienia formatowanie w zależności od tego, jak były zapisane literały liczb. Przykładowo, jeśli w komórkę wpiszemy formułę: =15%+12% Excel zmieni jej formatowanie na procentowe. Ale tym nie będę się tu zajmował. Na razie interesuje nas tylko wynik formuły, a nie to, jak ten wynik zostanie sformatowany. Błędy są poprawnymi argumentami dla operatorów matematycznych. Jeśli jeden z argumentów jest błędem, wynikiem operatora jest ten błąd. Jeśli oba argumenty są błędami, wynikiem jest ten błąd, który stoi na lewo od operatora. Jeśli oba argumenty operatora matematycznego były tablicami, wtedy operator bierze parami wartości z tych zakresów lub tablic, wykonuje na tych parach swoje działanie i tworzy z nich nową tablicę, i to jest wynikiem formuły. Jeśli jeden z zakresów ma mniej wierszy niż drugi, to co się stanie, zależy od tego, czy ta tablica, która ma mniej wierszy, ma wiersz jeden czy więcej. Jeśli tablica, który ma mniej wierszy, ma jeden wiersz, to ten wiersz zostaje rozmnożony, żeby stało się tyle samo wierszy. Jeśli tablica, która ma mniej wierszy, ma więcej niż jeden wiersz, to zostaje dopełniona wierszami dopełnionymi błedami #N/D!, żeby stało się tyle samo wierszy. Tak samo jest robione z kolumnami. Jeśli jeden argument jest tablicą a drugi skalarem, to jest tak, jakby ten skalar był tablicą o rozmiarach jeden na jeden. Jeśli wynik operatora, którego choć jeden z argumentów jest tablicą, ma być potem przerobiony na skalara, to Excel - w ramach chyba optymalizacji - przerabia oba argumenty na skalary przed wykonaniem operacji, bo przecież w taki sposób wynik wyjdzie i tak taki sam. Są takie operatory porównywania: >, <, >=, <=, <> i =. Spodziewają się one, że ich argumentami będą liczby, napisy lub błędy. Jeśli oboma argumentami są liczby lub napisy, są one porównane w odpowiedni sposób, a wynikiem wyrażenia jest wartość logiczna. Jeśli oba argumenty są liczbami, są one porównywane liczbowo. Jeśli oba argumenty są napisami, są one porównywane słownikowo. Jeśli lewy argument jest napisem a prawy liczbą, liczba jest przerobiona na napis i argumenty zostają porównane słownikowo. Przykładowo, wyrażenie: ="9" > 11 daje w wyniku prawdę. Jeśli lewy argument jest liczbą a prawy napisem, wynik porównania jest taki, jakby lewy argument był mniejszy od prawego - niezależnie od tego, jaka to liczba i jaki napis. Przykładowo, wynikiem wyrażenia: =9="9" jest fałsz. Jeśli jeden z argumentów jest błędem, wynikiem porównania jest ten błąd. Jeśli oba argumenty są błędami, wynikiem jest ten błąd, który stoi na lewo od operatora porównania. Jedyny operator działający na napisach to operator konkatenacji, czyli znak "&". Spodziewa się on, że jego argumenty będą napisami lub błędami. Jeśli argumenty są innego typu, zostają przerobione na napis według poniższych zasad. Liczba przerobiona na napis daje w wyniku napis z liczbą zapisaną tak, jakby wyświetliło ją formatowanie "ogólne". Wartość logiczna przerobiona na napis daje w wyniku słowo PRAWDA lub słowo FAŁSZ. Wartość "nic" przerobiona na napis daje w wyniku pusty napis. Jeśli jeden z argumentów jest błędem, wynikiem konkatenacji jest ten błąd. Jeśli oba argumenty są błędami, wynikiem jest ten błąd, który stoi na lewo od operatora konkatenacji. Żeby przewidzieć, jak się zachowa funkcja, kiedy przekażemy jej coś tam, musimy wiedzieć, jakiego typu argumenty spodziewa się dostać i co policzy, kiedy przekażemy jej argumenty właściwych typów. Jeśli przekażemy jej argumenty innych typów, możemy wywnioskować, co zrobi, bo wiemy, jak jedne typy są konwertowane na inne. Przykładowo, funkcje suma, średnia, max, min, oraz i lub działają bardzo podobnie. Przyjmują dowolną liczbę argumentów będących zakresami, tablicami lub dowolnymi skalarami. Potem robią tak: wszystkie skalary konwertują na liczby lub wartości logiczne (oraz i lub na wartości logiczne, pozostałe na liczby), ze wszystkich tablic i zakresów biorą wartości komórek i te, które są czymś innym niż nic lub błąd konwertują na liczby, a wartości nic wyrzucają. W ten sposób powstaje ciąg liczb i błędów, z których jest wyliczona odpowiednio suma, średnia, maksimum, minimum oraz albo lub. Jeśli otrzymana lista wartości jest pusta, funkcje oraz i lub dają w wyniku błąd #ARG!, a funkcje suma, średnia, max i min dają w wyniku 0. A funkcja złącz.teksty działa inaczej: spodziewa się dostać dowolną liczbę argumentów będących napisami. Więc jeśli w komórkach A1, A2 i A3 mam odpowiednio napisy "bolek", "lolek" i "tola", a w B2 wpiszę formułę: =ZŁĄCZ.TEKSTY(A1:A3) to najpierw ten zakres zostanie przerobiony na skalara - co da napis "lolek" - a potem funkcja złącz.teksty skonkatenuje ten pojedynczy napis "lolek", co w wyniku da napis "lolek". A nie, jak mogliśmy się spodziewać, napis "boleklolektola". Funkcje oraz i lub przerabiają swoje wartości na wartości logiczne. To przerobienie działa tak, że liczba 0 zostaje przerobiona na fałsz, każda inna liczba zostaje przerobiona na prawdę, a wszystko inne zostaje przerobione na błąd #ARG!. Wszystkie funkcje , w tym oraz i lub, ewaluują się zachłannie. Jeśli wyrażenie wpisane w komórkę zatwierdzimy przez shift-ctrl-enter, jest ono ewaluowane trochę inaczej - co opisuję poniżej. Wynik wyrażenia może być tablicą lub zakresem. Jeśli takie wyrażenie jest wpisane w wiele komórek, poszczególne wartości wyniku trafiają do poszczególnych komórek. Jeśli formuła jest wpisana w mniej komórek, niż jest wartości w wyniku, niektóre wartości wyniku nie są widoczne. Jeśli formuła jest wpisana w więcej komórek, niż jest wartości w wyniku, w niektórych komórkach pojawia się błąd #N/D!. Przykładowo, jeśli w komórki A1:B3 wpiszę liczby od 1 do 6, a w komórki C4:E5 wpiszę formułę: =A1:B3 i zatwierdzę ją przez shift-ctrl-enter, w obszarze C4:D5 pojawią się liczby 1, 2, 3 i 4, a w obszarze E4:E5 pojawią się błędy #N/D!. Jeśli wynikiem formuły jest zakres zawierający nice, te nice zostają przerobione na liczby. W formułach zatwierdzonych przez shift-ctrl-enter operatorom oprócz skalarów i tablic można podawać też zakresy. Na zakresach operatory działają wtedy analogicznie, jak na tablicach.