Hirdetés

Új hozzászólás Aktív témák

  • ny.janos

    tag

    válasz lappy #54970 üzenetére

    A felvetés jogos. Megkérdeztem. Dinamikus segédtartományt javasol minden oszlopra szűrővel külön-külön. Nem tudom szerinte ez miért annyival jobb, mint a PQ-vel külön beolvasni az oszlopokat.

    Copilot
    Igen – az Excel 365 dinamikus tömbfüggvényeivel ma már van elegánsabb, „profibb” megoldás, és pontosan arra a problémára, amit leírsz:
    dinamikus adatérvényesítés, üres elemek nélkül, PQ‑frissítésre automatikusan reagálva, makró nélkül, és anélkül, hogy oszloponként külön PQ‑lekérdezést kellene csinálnod.
    Az alábbi megoldás kifejezetten O365-re optimalizált, és szerintem a mostani tervednél tisztább.
    A probléma lényege – miért jelenik meg az üres elem?
    Amikor:
    PQ‑vel betöltesz egy több oszlopos táblát,
    az oszlopok hossza eltérő,
    majd fix téglalapként hozol létre névvel ellátott tartományokat,
    akkor az Excel a teljes oszlophosszt veszi figyelembe, és ahol elfogynak az értékek, ott üres cellákat is listáz, az adatérvényesítés pedig:
    ezeket felveszi a listába,
    és az első elem (gyakran az üres) lesz az aktív.
    Ez klasszikus korlátja a „régi” névtartomány-logikának.
    A modern (365‑ös) megoldás alapelve
    Ne a nyers PQ‑táblát add meg adatérvényesítés forrásának,
    hanem:
    minden oszlopra hozz létre egy dinamikus, „szűrt” segédtartományt
    ami:
    csak a nem üres értékeket tartalmazza
    automatikusan bővül/szűkül
    és erre a dinamikus tömbre hivatkozik az adatérvényesítés
    Ehhez nem kell VBA, sem oszloponként külön PQ.
    Konkrét, jól bevált megoldás
    Kiindulás
    Tegyük fel, hogy PQ‑vel betöltöd a táblát:
    neve: PQ_Lista
    oszlopok fejlécei:
    Termek, Szolgaltatas, Regio, stb.
    a lista egy másik fájlban van → ez nem gond
    1️⃣ Dinamikus segédtartomány létrehozása (FILTER)
    Hozz létre egy segéd munkalapot (pl. „DV”), és minden oszlophoz 1 képletet.
    Példa – Termek oszlop:
    Excel=FILTER(PQ_Lista[Termek]; PQ_Lista[Termek]<>"" )További vonalak megjelenítése
    Ez:
    eldob minden üres cellát
    dinamikusan követi:
    a PQ frissítést
    az elemszám változását
    csak valódi listát ad vissza
    👉 Ez tömbként kifolyik lefelé (spill).
    Ugyanezt megcsinálod a többi oszlopra is:
    Excel=FILTER(PQ_Lista[Szolgaltatas]; PQ_Lista[Szolgaltatas]<>"")=FILTER(PQ_Lista[Regio]; PQ_Lista[Regio]<>"")További vonalak megjelenítése
    2️⃣ Név hozzárendelése a kifolyó tartományhoz
    Most jön a kulcsfontosságú rész.
    Ha a képlet pl. a DV!A2 cellában van, akkor automatikusan létrejön egy
    kifolyó tartomány: DV!A2#
    Képletek → Névkezelő → Új
    Név:
    Plain TextTermek_listaTovábbi vonalak megjelenítése
    Hivatkozás:
    Plain Text=DV!A2#További vonalak megjelenítése
    ⚠️ A # NAGYON fontos – ez jelzi a teljes dinamikus tömböt.
    Ugyanezt megteszed a többi oszlopra is.
    3️⃣ Adatérvényesítés beállítása
    Most már az adatérvényesítésnél nem táblát, nem oszlopot, hanem NEVET használsz:
    Adat → Adatérvényesítés
    Engedélyez: Lista
    Forrás:
    Excel=Termek_lista``További vonalak megjelenítése
    ✅ Eredmény:
    ❌ nincs üres elem
    ✅ mindig az első valós érték az aktív
    🔄 PQ frissítés után automatikusan frissül
    📁 több fájlban is újrahasználható
    Extra finomítás (ha kell)
    Ha egy oszlopban duplikátumok is lehetnek:
    Excel=SORT(UNIQUE(FILTER(PQ_Lista[Termek]; PQ_Lista[Termek]<>"")))További vonalak megjelenítése
    Ha az első elem biztosan ne legyen üres még hibánál sem:
    Excel=IFERROR(FILTER(...); "")További vonalak megjelenítése
    Összefoglalás – „best practice” O365-ben
    ➡️ PQ = adatforrás
    ➡️ FILTER = üzleti lista
    ➡️ Spill + név = adatérvényesítés
    Ez ma az Excel 365‑ös, makrómentes, jövőbiztos megoldás erre az esetre.
    Ha szeretnéd,
    – mutatok egy oszlopra teljes mintafájlt,
    – vagy segítek strukturálni a segédlapot, hogy sok oszlopnál is átlátható legyen.

    PQ-vel is megoldható, hogy csak a kapcsos zárójelben lévő szám legyen cserélendő az egyes oszlopok beolvasásához:
    = Table.SelectRows(Table.SelectColumns(LegorduloListak,Table.ColumnNames(LegorduloListak){3}), each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))

Új hozzászólás Aktív témák