Campionatul Mondial de #Excel #FMWC – 2023

Acest articol este o scurtă descriere a experienței mele la Campionatul mondial de Excel, ediția 2023.

Informația pe scurt: A fost super, chiar dacă nu am reușit să mă calific pe tabloul principal de 128. Poate anul viitor.

În urmă cu mai bine de 1 an, undeva prin august, un prieten m-am provocat să mă înscriu și eu în această competiție, organizată de FMWC – Financial Modeling World Cup https://www.fmworldcup.com/, o asociere de companii din domeniul financiar, software și consultanță, care au reușit să creeze un concept foarte interesant de eSports din rezolvarea unor probleme prin utilizarea Microsoft Excel.

Am participat la calificările din 2022 dar a fost foarte bizar pentru că lipsit de experiență, nici nu știam unde să dau răspunsurile.

Ediția 2023 în schimb a fost mult mai interesantă pentru că s-a transformat într-o competiție pe o perioadă mai lungă de timp. În fiecare lună s-a organizat câte o rundă de calificare, din care erau aleși doar primii 5. În fiecare rundă era prezentat un caz diferit.

Formatul unei runde

Pentru a putea participa, ca la orice competiție sportivă trebuie să te înscrii prin plata taxei de participare. Prețul este de 20$ fără TVA.

Competițiile sunt anunțate pentru fiecare lună dinainte și pot fi la 5PM GMT sau 7 AM GMT.

Înainte cu câteva minute de ora de start, se primește un email în există un link către un site web de unde se descarcă fișierul de lucru și în care trebuie să dai răspunsurile în timp ce rezolvi.

Fiecare fișier de lucru are 5 niveluri de dificultate, de la Very Easy sau Easy pana la Hard sau Very Hard. Pe lângă cele 5 niveluri cu scor diferit fiecare mai există de obicei 3 întrebări bonus. În final poți obține maximum 1250 de puncte.

Pe măsură ce rezolvi un nivel completezi întrebările din pagina web deschisă.

Fiecare rundă durează 30 de minute.

La finalul rundei trebuie salvat modelul pe care ai lucrat și încărcat în pagina de examen. Fără acel fișier, rezultatele din pagină nu sunt luate în calcul.

După finalizarea celor 30 de minute se intră în live-uri, în care sunt invitați de obicei 4 jucători (din top 20-50) pentru a rezolva live cazul. Există de asemenea moderatori care comentează live evenimentul pentru urmăritorii de pe Youtube.

Rezultatele se publică la câteva ore de la finalizarea rundei pe https://www.fmworldcup.com/excel-esports/road-to-las-vegas-2023-rankings/

În medie la fiecare din cele 9 runde au participat cam 120 de jucători, eu reușind să obțin punctaj de fiecare dată. Ce e drept puțin, dar a fost. Runda 5 a fost cea în care am obținut cel mai bun punctaj de peste 500.

Precalificările

În Weekend au fost organizate sesiunile de precalificări pentru tabloul principal… unde au participat peste 500 de oameni din întreaga lume. În 2022 au participat 526 de oameni din întreaga lume.

Din cei 500, aproape 150 nu au reușit să trimită fișierul cu rezolvările… eu reușind în ultima secundă din ultimul minut să încarc fișierul.

Rezultatele centralizate aici: https://www.fmworldcup.com/excel-esports/mewc-2023-rankings/

Personal nu sunt mulțumit de rezultatul obținut, dar sunt super încântat de cât de mult am reușit să învăț. Un pic mai mult antrenament și aș fi putut obține un scor și mai bun.

La una din probleme am reușit să o rezolv dintr-o singură funcție, exact în stilul celor pe care-i urmăresc pe diferite canale. În funcție parsez textul pas cu pas și-l transfer între tabele intermediare totul într-o sigură formulă.

Una din probleme este că nici nu lucrez Excel zi de zi, iar ceea ce se face la facultate… este la nivel începător. Un alt aspect este dat de faptul că nu mi-am permis financiar să-mi cumpăr un pachet de instruire / antrenament… care poate ajunge la câteva sute de dolari.

Una peste alta, deja m-am înscris pentru ediția 2024!

Pentru cei care doresc să vadă live-ul din calificări: https://www.youtube.com/@FMWC

O descriere mai pe larg despre experiența mea în competiție, găsiți meet-up-ul organizat de Romania Power BI & Modern Excel User Group. Înregistrarea evenimentului aici: https://www.youtube.com/watch?v=aDjghQvt_f4&t=2925s&ab_channel=SSBICentral

E clar când nu ești sub presiunea timpului ai timp și de artificii.

Mi-ar plăcea să văd cât mai mulți români în competiție și să ne „antrenăm” împreună! De asemenea, este și competiție pentru studenți… dar cu un pic mai multă orientare spre zona de financiar.

Mie mi-a plăcut și mai ales mă bucur că o astfel de competiție te scoate din zona de confort și te pune serios pe învățat.

Calcule cu funcții dinamice pe tabele merged în #Excel

În articolul trecut, expuneam problemele pe care le putem avea dacă păstrăm datele într-un tabel cu celule unite (merged). Articolul curent este mai mult un exercițiu de prezentare a unor funcții dinamice pentru rezolvarea problemei de însumare a valorilor dintr-un tabel cu merged cells. Atenție! Nivelul de dificultate poate fi considerat prea ridicat, dar încerc să explic pas cu pas.

În imagine este prezentat tabelul original, coloanele A:D și raportul final în coloanele T:U.

 

Formula din T3 este:

=LET(tc; TOCOL(B2:B100);

        coln; SCAN(0;tc;LAMBDA(a;v;IF(a=0;v;IF(v=0;a;v))));

        ft; HSTACK(coln; D2:D100);

        un; UNIQUE(TAKE(ft;;1));

        suma; BYROW(un;LAMBDA(r; SUM(FILTER(TAKE(ft;;-1);TAKE(ft;;1)=r))));

        HSTACK(un; suma))

 

Ca să ajungem gradual la această formulă, în coloana G avem formula: =TOCOL(B2:B17)

Rezultatul formulei este un array care conține valorile specifice din tabelul cu date, înlocuind celulele din merged cells cu 0. Notam în articolul precedent că în merged cells, valoarea afișată se află doar în prima celulă din bloc, restul fiind vide. TOCOL() realizează automat umplerea cu 0 a celulelor blank.

Ca să pot completa automat valorile 0 cu numele celui din blocul de celule, propun în coloana I, funcția =SCAN(0;G2#;LAMBDA(a;v;IF(a=0;v;IF(v=0;a;v)))) , în care:

0 este valoarea curentă de la care pornește scanarea. În fapt ea este imput pentru parametrul a (acumulator) din LAMBDA(). G2# este referința către rezultatul funcției TOCOL() din etapa precedentă. Esența în rezolvare este funcția LAMBDA() care trebuie să aibă în SCAN() doi parametri: a – acumulat, v – valoare curentă. Normal, acești parametri se pot chema și altfel, dar am văzut că mulți utilizatori de Excel preferă acest format. SCAN-ul evaluează fiecare valoare din sursa de date (G2#) și pe baza execuției din LAMBDA afișează o valoare la fiecare linie. În momentul în care începe execuția LAMBDA() parametrul a are valoarea 0. Dacă ea este 0 atunci se afișează valoarea curentă din blocul de date. De asemenea, a preia automat valoarea curentă a lui V care este valoarea de linie. La următoarea linie, dacă v nu era 0, a devine primul nume, deci la rândul următor a nu va mai fi 0 IF-ul intr-înd pe FALSE. Aici, dacă V-ul este 0 se preia valoarea acumulator ceea ce înseamnă valoarea de deasupra. Dacă V nu este 0 atunci se preia noul V. Pare complicat, dar în fapt sunt doar două IF-uri, care trebuie să returneze două valori. Mai greu este să ajungi la înțelegerea care este valoarea lui V și a lui A pe o anumită linie.

 

Pentru a obține acum un tabel cu coloana rezultată din SCAN și coloana de valori din tabelul inițial, în K2 am folosit funcția: =HSTACK(I2#;D2:D17)

HSTACK() este o funcție care pentru fiecare parametru generează o nouă coloană într-un tabel array rezultat. Dacă aș fi folosit VSTACK() atunci rezultatul ar fi fost o singură coloană cu primele linii din prima coloană continuate cu cea din a doua coloană.

 

Combinând aceste 3 funcții avem o primă funcție LET() cu variabilele TC, COLN și FT. FT este de fapt final table pe care trebuie să-l parcurg pentru a ajunge la nume unice cu sume cumulate.

Ca să pot obține formula finală, în Q4: am introdus o simplă funcție UNIQUE() pe baza datelor din N:O. Formula este aplicată doar pentru coloana de nume. Pentru a calcula acum valorile ar fi foarte simplu să utilizăm un SUMIF() dar intenția mea este de a folosi acest calcul direct într-un LET() care presupune că trebuie să tratăm dinamic coloana de nume, linie cu linie, necunoscând totalul de linii rezultat.

Rezolvarea în această etapă se poate realiza cu MAP() sau BYROW() depinde de modul de abordare: BYROW() ia toate coloanele din linie, MAP() apelează doar o singură coloană dintr-un tabel, linie cu linie.

Am preferat BYROW() pentru această formulă pentru a prezenta o altă funcție, MAP() fiind destul de des prezentat în articolele de pe internet.

Astfel funcția din R4: =BYROW(Q4#;LAMBDA(r; SUM(FILTER($O$4:$O$19;$N$4:$N$19=r)))) , în care:

Q4# este coloana cu nume unice, r este parametrul din LAMBDA() care face referire la linia curentă, după care avem o sumă pe un FILTER() pe coloana de sume, pe baza condiției ca numele să fie egal cu valoarea lui r.

Dacă preferați MAP() în formula din R4 schimbăm pur și simplu BYROW cu MAP și funcționează identic.

 

Această a doua parte se transformă în formula din T3, în variabilele un și suma. Având în vedere că sunt înglobate într-un LET() nu avem cum să ne adresăm în ele la anumite celule, blocuri de celule dintr-o foaie de calcul. Această problemă o rezolvăm prin funcția TAKE() care ne permite să preluăm dintr-un tabel definit anterior, în cazul de față ft, un anumit număr de linii sau coloane. Al doilea parametru din TAKE() este numărul de linii , care la mine este omis, iar al treilea parametru este numărul de coloane. Dacă specificăm valoarea 1 va prelua prima coloana din stânga, valoarea 2, primele două coloane din stânga, iar dacă trecem valori cu -1, -2 se vor prelua ultima coloană din dreapta dintr-un tabel definit sau ultimele două (-2).

 

Ultima operație din formula din T3 este dată de unificarea prin HSTACK() a variabilelor un (nume unice) și suma (valorile însumate).

Puteți să descărcați fișierul Excel din acest articol de aici. Vă reamintesc că funcțiile dinamice sunt disponibile doar în anumite versiuni de Excel.

În concluzia acestui articol: nu mai utilizați tabele merged… și nu mai colectați date în Excel. Folosiți SharePoint!

P.S. Sunt convins că această problemă se poate rezolva și cu Power Query… dar poate într-un articol viitor.

Calcule clasice pe tabele merged în Excel

De foarte multe ori mi-a fost dat să văd în practica de zi cu zi diferite metode de colectare a datelor în Excel. De fiecare dată când am ocazia sau merg la cursuri în producție le recomand oamenilor să nu mai colecteze datele în Excel. Sunt zeci de alternative. Și dacă totuși o fac, măcar să nu mai țină datele în format merged.

În exemplul din imagine este un tabel cu 4 coloane, iar în coloana Nr. Crt și Nume Prenume este aplicat la anumite celule opțiunea de Merge cells (unirea mai multor celule).

De ce fac oamenii asta? Pentru că li se pare că este mai frumos… cred… dar niciodată nu cred că își pun problema de utilitate. Mai sunt cei care au auzit pe la ceva cursuri de baze de date despre conceptul de normalizare și eliminarea redundanțelor. Da, poate fi dubios să scrii un nume de mai multe ori, dar ca utilitate pentru calcule și operații este mult mai util.

O altă greșeală de operare din Excel pe care o întâlnim în acest caz este de a păstra datele în format de raport. Asta pentru eventualitatea când ar trebui să listeze acel tabel la imprimantă. Altfel, numărul curent nu are nici o relevanță atât timp cât datele sunt păstrate într-o ordine nespecificată… bazată probabil pe prima intrare.

Raportându-ne la principiul drumului știut, lași de cele mai multe ori oamenii să lucreze cum vor în acel Excel și să își facă treaba cum cred ei mai bine. Doar că apar probleme când trebuie să faci calcule și operațiuni sau verificări cu datele dintr-un astfel de tabel.

Și totuși cum facem un raport simplu, om cu om pe baza acelui tabel și suma aferentă?

Metoda 1: Subtotalurile

Pentru a realiza un subtotal pe merged tables trebuie să selectăm tot tabelul, după care accesăm meniul Data, Subtotal.

Avantajul este dat de timpul de totalizare a valorilor pentru fiecare Nume Prenume în cazul de față. De menționat că putem efectua mai multe tipuri de operații de bază (Use function) pe mai multe coloane specifice (At each change in) și putem efectua acea operație pe mai multe coloane.

Dezavantajul pentru tabelele cu multe linii este acela că nu poți face sau tipări prea simplu, un raport cu nume și total încasat de exemplu, pentru că odată cu restrângerea nivelurilor de subtotal (cifrele din stânga sus) ne apar doar valorile nu și liniile de sinteză.

Un mare dezavantaj, de fapt ca tot merge-ul în sine, este că dacă adăugăm o linie nouă pentru un Nume Prenume din tabel, va trebui să refacem merge-ul. Intre valorile vechi si celula nouă.

Metoda 2: Coloană adițională

Metoda coloanelor adiționale (ajutătoare) poate fi o tehnică foarte bună de rezolvare a problemelor complexe prin descompunerea acestora în subprobleme rezolvabile secvențial (treptat).

O propunere de rezolvare este de a implementa metoda redundanței pentru a putea face separat calcule sintetice.

În exemplul meu am adăugat coloana Linie (de fapt numărul curent pentru fiecare) și Nume, în care am completat cu o formulă simplă valorile de care ar fi nevoie pentru calcule într-un raport separat.

În celula E2 am scris formula: =IF(ISBLANK(A2);E1;A2)

În care: cheia este jucată de funcția ISBLANK(). Doar o singură celulă (cea de sus) dintr-un grup de celule merged conține valoarea afișată în grup. Restul sunt vide, de aceea le putem interpreta cu această funcție pentru a adăuga permanent valoarea de deasupra.

Marele avantaj al acestei metode este că permite folosirea de funcții de căutare pe tabel, de tipul INDEX cu MATCH dar și funcțiile dinamice.

Un model simplu de raport prezentat în imagine presupune utilizarea funcției SUMIF() pentru a aduna toate valorile de pe coloana Suma prin compararea coloanei F cu valoarea curentă.

Un dezavantaj al metodei este că de fiecare dată când adăugăm o linie nouă în tabel trebuie să copiem formula de mai sus pe coloana E și F pentru a putea obține raportul de Total corect.

 

Desigur că există și o metodă mai elaborată prin utilizarea funcțiilor dinamice, dar într-un alt articol.

Dacă vreți să exersați direct pe fișier, acesta poate fi descărcat de aici.

 

Sper să vă fie util!

Blog la WordPress.com.

SUS ↑