Office Guru

TEXTJOIN: a legújabb barátunk, amely új alapokra helyezi az összefűzés tudományát

2017. szeptember 30. - Office Guru

A következő poszt alapötlete igazából azok számára lesz azonnal érthető, akik mondjuk SQL-lekérdezéseket is írnak vagy használnak, de a felvetett problémára adott ötletek nagy valószínűséggel olyan kérdésekben is segítséget nyújtanak, amelynek nem kötődnek az SQL-hez. Tegyük fel a következő kérdést: ha akarunk egy SQL-lekérdezést írni, amelyben szerepel egy IN operátor is, vajon mi a legegyszerűbb megoldás, hogy rengeteg értéket be tudjunk tenni az IN mögé a zárójelbe?

Adott tehát a következő példa, értékek felsorolása, amelyeket az IN mögé szeretnénk beerőltetni:

capture1.JPGAz első ötlet, ami beugrik a többségnek, egy sima összefűzés függvény nélkül, szimplán

="'"&A3"',"

használatával.

capture2.JPGHa ezt "lehúzzuk" (automatikus kitöltés), látjuk is szépen az eredményt, ezt már csak be kell másolnunk mondjuk az SQL Developerünkbe az IN mögé, úgy hogy az első és utolsó értékünk elé és mögé egy zárójelet is pakolunk:

capture3.JPGEgy másik megoldás lehet az Excel 2016-os verziójában bevezetett TEXTJOIN funkció, amely több tartományban, cellában szereplő értéket fűz össze elválasztók (delimiter) alapján. Az első paramétereként adjuk meg az elválasztót, a második kötelező paraméter azt határozza meg, hogy üres cellákat kihagyjunk-e vagy sem az összefűzésből, a harmadik kötelező paraméter pedig maga az összefűzendő szöveg első értéke vagy akár egy cellatartomány. Vannak még opcionális paraméterek, amelyek mindegyike az összefűzendő cellákra utal, tehát ha a harmadik paraméterként nem tartományt adunk meg, hanem egy cellát, akkor további paraméterekben írnunk kell tovább az összefűzendő értékeket. Azaz a mostani példán például

=TEXTJOIN(CHAR(10),TRUE,A:A)

azt fogja jelenteni, hogy az ENTER (erre utal a Char(10), mert a speciális elválasztókat, mint egy új sor vagy egy sortörés, csak karakterszáma alapján tudunk beadni) delimiterrel elválasztott cellákat fogja összefűzni, üres cellák kihagyásával az A oszlopban.

capture4.JPGÉs látható az eredmény is:

capture5.JPGÉs ezt pedig az elsőként felvázolt ötlettel kombinálva szépen elő tudjuk készíteni az IN mögé bemásolásra, valahogy így:

capture6.JPGÉs ezután már meg is van a kész eredményünk:

capture7.JPGPersze van még opcióként a beépített CONCAT vagy CONCATENATE függvény is, de mindkettőnél alapvetően az a fő probléma, hogy nagyon hosszú értéksor esetén nagyjából lehetetlen a használata, mert túl sok a manuális munka vele:

capture8.JPG

Egyébként a CONCAT és a CONCATENATE első ránézésre teljesen egyformának tűnik, de nem csak ránézésre egyformák, pontosan ugyanazt tudják, előbbi a funkció nevének lerövidítése érdekében került be "új funkcióként" az Excel 2016-os verziójába illetve nagy valószínűséggel azért, hogy a Google Sheets által is használt, ugyanilyen nevű funkcióval azonos néven fusson. A CONCATENATE pedig azért maradt benne, hogy megmaradjon a kompatibilitás az Excel korábbi verzióival is.

Mindenesetre azt pedig a fentiek ismeretében beláthatjuk elég gyorsan, hogy a TEXTJOIN elég jó barátunk, hiszen alig egy-két kattintással akár sok ezer értéket is össze tudunk fűzni pillanatok alatt.

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr8212914327

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

_kolléga_ · https://radicspeter.hu 2017.10.01. 17:38:33

ha valakinek hiányozna 2013-ból:

Public Function textjoin(rng As Range, deli As String) As String
Dim conced As String

conced = ""
For Each cell In rng
conced = conced & cell.Value & deli
Next

textjoin = Left(conced, Len(conced) - 1)
End Function

(az üres cellák kizárása sem egy ördöngösség)

_kolléga_ · https://radicspeter.hu 2017.10.01. 18:05:09

mondjuk így:

Public Function textjoin(rng As Range, deli As String, ureset As Boolean) As String
Dim conced As String

conced = ""
For Each cell In rng
If cell.Value <> "" Or ureset = True Then
conced = conced & cell.Value & deli
End If
Next

textjoin = Left(conced, Len(conced) - 1)
End Function
süti beállítások módosítása