Problemă de #Excel – Cine este plecat în delegație? [UPDATED]


De câteva zile am primit o problemă interesantă de Excel. Și cum mulți dintre cititorii mei sunt avizi după noi provocări vă invit să rezolvați această problemă de Excel, fără utilizare VBA sau coloane ajutătoate.

Cerința problemei:

Într-o instituție oamenii pleacă în delegații. Istoricul de delegații este în tabelul A1:D11 dar poate fi mult mai lung, pentru că acolo sunt păstrate detaliile tuturor deplasărilor. Se dorește să se afișeze un tabel dinamic în care să se afișeze persoanele aflate în delegație în ziua curentă.

Model tabel și raport sintetic. Datele rezultat sunt corespondente zilei de 04.11.2019.

După rezolvare, soluția Excel trebuie transmisă prin e-mail la adresa: valy.greavu@outlook.com până pe 06.11.2019 ora 10:00.

Dacă se poate să treceți în email și o scurtă descriere a rezolvării ar fi super! Dacă nu mă prind eu, cumva. :)

Premiu: 10 „flotări mentale” și recunoștința noastră!

UPDATE 06.11.2019

În urma consultării din public am primit mai multe soluții care de care mai ingenioase.

Soluția mea este o combinație de CSE (acronimul de la funcțiile array Ctrl+Shift+Enter) cu funcțiile INDEX și MATCH cu condiții multiple.

Formula folosită pentru nume este:

=IFNA(INDEX(tblD[Nume_Prenume];MATCH(1&0;IF(TODAY()>=tblD[Data_Plecarii];IF(TODAY()<=tblD[Data_Sosirii];1))&COUNTIF($F$2:F2;tblD[Nume_Prenume]);0));””)

În care tblD este numele tabelului de date iar condițiile cumulative 1&0 sunt corespondente IF-ului din prima parte a MATCH-ului (1) și COUNTIF-ului din partea a doua care determină unicitatea înregistrărilor.

Listingul de la PowerQuery pentru acest model de denumiri este:

let

Source = Excel.CurrentWorkbook(){[Name=”tblD”]}[Content],

#”Changed Type” = Table.TransformColumnTypes(Source,{{„Nr.Crt.”, Int64.Type}, {„Nume_Prenume”, type text}, {„Data_Plecarii”, type datetime}, {„Data_Sosirii”, type datetime}}),

#”Added Custom” = Table.AddColumn(#”Changed Type”, „Plecat”, each Logical.From(DateTime.Date(DateTime.LocalNow()) >= DateTime.Date([Data_Plecarii]) and DateTime.Date(DateTime.LocalNow()) <= DateTime.Date([Data_Sosirii]))),

#”Filtered Rows” = Table.SelectRows(#”Added Custom”, each ([Plecat] = true)),

#”Removed Columns” = Table.RemoveColumns(#”Filtered Rows”,{„Nr.Crt.”, „Data_Plecarii”, „Plecat”}),

#”Changed Type1″ = Table.TransformColumnTypes(#”Removed Columns”,{{„Data_Sosirii”, type date}})

in

#”Changed Type1″

Nu uitați că PQ este case sensitive. Sunt un mare fan al PQ dar acesta nu-și face autorefresh la date în momentul în care se schimbă ceva în sursă. Trebuie refresh manual.

Fișierul cu exemplul rezolvat cu CSE și PQ poate fi consultat sau descărcat de aici: https://1drv.ms/x/s!ApGubfWFh8NurJgyC1qAhvQ8bcjwuQ?e=0eo2dT. Fișierul nu conține macros.

 

Soluția CiprianS

Prima soluție a venit de la un prieten mai vechi Ciprian S.

Ciprian a propus o rezolvare cu PowerQuery care este relativ simplă și funcționează perfect și una cu CSE.

Formula utilizată de Ciprian pentru afișare nume este:

=IFERROR(INDEX(Table1[Nume_Prenume];SMALL(IF(–(TODAY()>=Table1[Data_plecării])–(TODAY()<=Table1[Data_Sosirii])=2;Table1[Nr.Crt.];””);ROWS($K$10:K11)-1));””)

Formula folosește SMALL în loc de MATCH-ul clasic propus de mine. În felul acesta soluția devine puțin mai rapidă pe seturi de date mari.

Soluția SilviuP

O soluție foarte simplă de rezolvare a venit de la SilviuP. Acesta folosește funcția IF imbricată pentru a afișa dacă un anumit om este plecat în delegație sau nu. Pentru cei care nu sunt plecați lasă liber rândul în raport. Din această cauză această soluție nu este una câștigătoare. :)

Proiecție soluție cu IF.

 

Soluția ClaudiaT

O altă soluție simplă a venit de la ClaudiaT. Ea a folosit un pivot table legat la un Timeline Tool pentru a selecta intervalele de date specifice plecării și sosirii. Aparent este o soluție simplă și uneori soluțiile simple sunt mai la îndemâna tuturor!

Proiecție soluția cu Timeline.

 

Soluția CristianA

CristianA a trimis mai multe rezolvări. Așa cum spunea el… prea simplă problema.

În prima soluție El a folosit formula IF asemănător cu soluția lui Silviu apoi a filtrat rezultatele. Eu cred că s-a grăbit puțin.

A doua soluție este asemănătoare ca formă și rezultat cu PowerQuery-ul trimis de Ciprian.

A treia soluție este în schimb destul de abstractă și folosește DAX pentru generarea tabelului de date.

Proiecție rezolvare cu DAX.

De asemenea Cristian mai anunță o metodă de rezolvare de ultimă oră și anume utilizarea Dynamic Arrays. Detalii aici: https://www.excelcampus.com/functions/dynamic-array-formulas-spill-ranges/ și aici: https://www.sumproduct.com/news/article/news/dynamic-arrays-becoming-generally-available

 

Pentru cei care doresc să învețe mai multe despre PowerQuery și formule CSE găsiți detalii în blog și pe canalul meu de Youtube!

 

Sper să fie util cuiva!

2 gânduri despre „Problemă de #Excel – Cine este plecat în delegație? [UPDATED]

  1. In
    =IFERROR(INDEX(Table1[Nume_Prenume];SMALL(IF(–(TODAY()>=Table1[Data_plecării])–(TODAY()<=Table1[Data_Sosirii])=2;Table1[Nr.Crt.];””);ROWS($K$10:K11)-1));””)
    nu este un minus, ci doi de minus. Operațiunea de inversare a semnului (negation) este a doua în ordinea efectuării operațiilor și în același timp este extrem de puțin consumatoare de resurse: doar „aprinde” sau „stinge” un bit în dreptul numărului. Detalii aici: https://support.office.com/en-us/article/calculation-operators-and-precedence-in-excel-48be406d-4975-4d31-b2b8-7af9e0e2878a
    În formulă este folosită pentru a forța conversia implicită a lui TRUE în 1 și a lui FALSE în 0.

    Apreciat de 1 persoană

Comentariile nu închise.

Blog la WordPress.com.

SUS ↑