Recursive Lambda() sau cum să scapi de “cârnații” de Substitute() de Substitute() în #Excel

 

În urmă cu ceva vreme scriam un articol, #Excel – Eliminare diacritice din nume – Funcția SUBSTITUTE() dar niciodată nu mi-a plăcut această soluție de a folosi multe funcții Substitute().

Am încercat așadar să găsesc o alternativă cu Lambda() și Let() dar nici cu ajutorul lui ChatGPT nu am reușit să obțin ceva de valoare și replicabil.

 

În schimb am descoperit un video foarte ok care face exact ceea ce îmi doream în formatul cât mai simplificat posibil. Video aici: Excel RECURSIVE Lambda – Create loops with ZERO coding! – YouTube . Recommend! Este foarte fain făcut acel video.

Vă reamintesc faptul că aceste funcții pot fi folosite doar în versiunile 365 ale Excel.

Funcția de înlocuire caractere este:

=LAMBDA(text;caracter;caracterNou;
IF(caracter="";text;
fReplace2(SUBSTITUTE(text;caracter;caracterNou);
OFFSET(caracter;1;0);
OFFSET(caracterNou;1;0))))

 

 

Funcția folosește 3 parametri:

  • Text – Textul care conține caractere speciale. Pentru formula cu înlocuire diacritice este A16
  • Caracter – Se specifică în mod absolut prima celulă din tabelul cu caractere. În cazul meu $D$16
  • caracterNou – Se specifică la fel absolut pentru primul caracter din lista de înlocuit. În cazul meu: $E$16

 

În imagine câteva cazuri de utilizare a acestor funcții. Prima versiune, simplificată elimină toate caracterele speciale specificate in coloanal de caractere. În varianta 2 folosesc opțiunea de înlocuire diacritice.

Fișierul cu funcțiile poate fi descărcat de aici: https://1drv.ms/x/s!ApGubfWFh8NurNkpskDX-jpiGo-vxA?e=15Kjej

Fișierul Google poate fi accesat aici: https://docs.google.com/spreadsheets/d/1pmOWPkNvi73vj-1xPsUCalgc-Vwi8eA_/edit?usp=sharing&ouid=107953912995529892032&rtpof=true&sd=true

 

În cazul în care doriți să refolosiți o funcție Lambda() în alt fișier, puteți copia o foaie de calcul albă din fișierul unde este definită funcția într-un alt fișier deschis sau într-unul nou.

 

Sper să vă fie util!

Power Apps – Edit a multiple selection Person field using gallery

 

This article is a proposal of how to edit a multiple selection Person field from a Power Apps customized form, using a gallery control.

 

We have a list with a Person field that is allowing multiple selections. Fields are Title and Users.

 

Depending on how many users are recorded into the field we can have issues to edit/update the list of users. The control of multiple persons cannot be resized to edit/update easier members from the field (or I do not discover a way to do it).

Editing a multiple selection Person field. Combo control for Person field is renamed to cboUsers.

 

In this article I am proposing a way to edit members from Person field using a gallery control.

To achieve this, insert a button, in my case called Edit, that is creating a collection based on Person field and set a variable to value 1. Code for OnSelect property of the button.

ClearCollect(cUsers, cboUsers.SelectedItems); Set(varDisp, 1)

 

Next step is to create a gallery. Items for gallery is cUsers collection. Better option is to use sorting for Items:

SortByColumns(cUsers, "DisplayName", SortOrder.Ascending)

 

For Visible property of the gallery, I use:

If(varDisp=1, true, false)

 

My form when click on Edit button:

Next step is to change the icon into Trash and add following code to the OnSelect property of Trash icon:

Remove(
cUsers,
ThisItem
);
ForAll(
cUsers, // Current collection
Patch(
MultiUser, // Main data source, name of list from SPO
LookUp(
MultiUser,
Title = txtTitle.Text // Identify the current record into the list.
),
{Utilizatori: cUsers} // Utilizatori is the name of the Person field from list.
)
)

Formula for OnSelect property of Trash icon.

If you receive any error messages like: Title is required, verify if you properly close LookUp function.

Disadvantages of this method is related to speed of deleting items from Gallery related to time for Patching into the list. If you delete faster items, you can receive an error message: Network error when using Patch function. The request operation is invalid.

Even the message appear I was able to delete entire persons from gallery.

Hope you find useful this article!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

O funcție de criptare date în Excel

Problema criptării datelor, sau anonimizarea lor cum se spune „la GDPR” are foarte multe soluții ingenioase în diferite platforme. Am văzut ceva metode de criptare și în Excel, în mare parte prin utilizarea metodei Cifrul Cezar sau diferite tipuri de fonturi pentru ascunderea textului sau diferite combinații de funcții CHAR(), CODE().

Fișierele de descărcat pentru acest articol

Dacă aveți Office 365 și Excel-ul actualizat puteți descărca și utiliza fișierul direct de aici: Functie criptare.xlsx

Dacă nu aveți Office 365 dar aveți Google, puteți accesa fișierul de la această adresă: https://docs.google.com/spreadsheets/d/1jbcpZngfK9VA7OIVCsYEm3dRWUzMqBniV3FoXCD1-xc/edit?usp=sharing

Descriere problema

În fișierul din link avem coloana Nume Prenume pe care dorim să o criptăm după un anumit cod de criptare specificat în celula I2. Codul este alfanumeric și poate lua valori variate. Nu am testat pentru fraze întregi.

Ca să pot codifica un text după un alt text trebuie să folosim o funcție Lambda() pe care am salvat-o cu numele fCriptare. Pentru decriptare am folosit o altă funcție Lambda fDecriptare pe care am folosit-o pe coloana D dar și pe E pentru a testa funcția cu un cod incorect specificat in celula J2.

Cazul de utilizare clasic: transferul de date către entități externe. Criptezi datele originale despre nume in coloana C, după care copii ca valori rezultatele în alt fișier pe care vrei sa îl exporți transmiți cuiva. Dacă vrei să afle acele nume trebuie să-i trimiți codul de decriptare. Atenție, funcțiile Lambda sunt dependente de fișierul curent. Transmiterea către altcineva a unui fișier fără funcție va face imposibilă afișarea rezultatelor corecte. Funcțiile Lambda() pot fi transmise și ca text pur și simplu.

Vă reamintesc că separatorii în formulele pe localizare română sunt ; (punct și virgulă) iar în localizare pe engleză sunt , (virgula). Eu folosesc localizarea în română.

Funcția de criptare:

=LAMBDA(txt;cod;

LET(

c; LEN(cod);

txt_chars; MID(txt; SEQUENCE(LEN(txt)); 1);

cod_chars; MID(cod; MOD(SEQUENCE(LEN(txt))-1; c)+1; 1);

cript_chars; CHAR(MOD(CODE(txt_chars) – 32 + CODE(cod_chars) – 32; 94) + 32);

cript_text; TEXTJOIN(„”; TRUE; cript_chars); cript_text)

)

În care:

  • LAMBDA(txt;cod;expr) este construcția care definește o funcție Lambda. Aceasta este o funcție fără nume, care poate fi definită și apelată într-un singur pas. În acest caz, txt și cod sunt argumentele funcției, iar expr este expresia pe care funcția o evaluează și returnează.
  • LET() este o funcție care permite definirea unor variabile intermediare folosite în cadrul expresiei. În acest caz, variabilele intermediare sunt c, txt_chars, cod_chars, cript_chars și cript_text.
  • LEN(cod) este o funcție care calculează lungimea șirului de caractere cod.
  • MID(txt; SEQUENCE(LEN(txt)); 1) este o funcție care extrage un singur caracter din șirul de caractere txt folosind secvențele numerice generate de funcția SEQUENCE(LEN(txt)). Astfel, pentru fiecare poziție în șirul txt, se obține un singur caracter.
  • MOD(SEQUENCE(LEN(txt))-1; c)+1 este o funcție care calculează o secvență de numere întregi care reprezintă pozițiile din codul de criptare pentru fiecare caracter din șirul txt. Prin MOD(SEQUENCE(LEN(txt))-1; c) se obține un vector cu numere de la 0 la c-1, iar adăugarea valorii 1 cu +1 asigură că vectorul va avea valori cuprinse între 1 și c.
  • CHAR(MOD(CODE(txt_chars) – 32 + CODE(cod_chars) – 32; 94) + 32) este o funcție care calculează caracterele criptate pentru fiecare caracter din șirul txt. În primul rând, calculează codul Unicode pentru fiecare caracter din txt_chars și din cod_chars. Apoi, scade 32 din fiecare cod Unicode pentru a obține un număr întreg între 0 și 93. Acest număr întreg este apoi calculat cu modul de 94 și adăugat la 32 pentru a obține un alt număr întreg între 32 și 125, care este un alt interval de caractere ASCII imprimabile. Funcția CHAR() convertește acest număr întreg în caracterul ASCII corespunzător.
  • TEXTJOIN(„”; TRUE; cript_chars) este o funcție care concatenează toate caracterele criptate obținute în șirul cript_chars. „” este separatorul folosit între fiecare caracter, iar TRUE specifică că orice valoare goală din cript_chars trebuie ignorată.

În cele din urmă, cript_text este variabila finală care conține șirul criptat obținut în urma evaluării.

Funcția SEQUENCE() din Excel este o funcție foarte interesanta, utilă pentru a genera o matrice sau un vector de numere întregi secvențiale. Această funcție poate fi utilă în multe scenarii, inclusiv în crearea de serii de numere pentru utilizarea în alte funcții sau în indexarea matricelor. Având în vedere că putem face un fel de iterații cu SEQUENCE(), mă duce cu gândul foarte aproape de instrucțiunea FOR din alte limbaje, cu limitările de rigoare legate de complexitatea calculelor și operațiilor.

Funcția de decriptare:

=LAMBDA(cript_text; cod;

LET(

c; LEN(cod);

cript_chars; MID(cript_text; SEQUENCE(LEN(cript_text)); 1);

cod_chars; MID(cod; MOD(SEQUENCE(LEN(cript_text))-1; c)+1; 1);

txt_chars; CHAR(MOD(CODE(cript_chars) – CODE(cod_chars); 94) + 32);

txt; TEXTJOIN(„”; TRUE; txt_chars)

; txt)

)

Este foarte asemănătoare cu funcția de criptare, doar că de data aceasta folosim operatiunea de scădere în variabila txt_chars.

Funcțiile Lambda sunt gestionate la mine cu Name Manager. Dar pot fi testate și în celule, de genul:

=LAMBDA(txt;cod;

executii)(A1;B1)

Cu presupunerea că în A1 este textul de criptat și în B1 codul de criptare.

Acest articol a fost scris cu ajutorul #ChatGPT după o referință de inspirație de la campionatul mondial de Excel: https://www.youtube.com/watch?v=Vg9qb134vzU&ab_channel=DiarmuidEarly

Sper să fie util cuiva!

Blog la WordPress.com.

SUS ↑