Hirdetés

Keresés

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

  • Mutt

    senior tag

    válasz andreas49 #54482 üzenetére

    Szia.

    A képletból hiányzik a megfelelő helyről zárójel.
    Az első JOBB után 2 db záró-zárójel kell, az egyik zárja a jobb oldali csonkolást, a második pedig létrehozza a dátumot az adott év, hónap és nap alapján.
    A helyes számításhoz a legelső Dátum elé kell még egy nyitó-zárójel, mert előbb a különbséget akarjuk kiszámolni, majd azt 365-el elosztani.

    Sortörésekkel ez a helyes formátum. Excelben sortörések nélkül kell majd neked.
    =KEREKÍTÉS(
        (DÁTUM(BAL(H2;4);
              KÖZÉP(H2;5;2);
              JOBB(H2;2))
        -
        DÁTUM(BAL(XKERES(K2;ALAP!AB:AB;ALAP!AF:AF);4);
            KÖZÉP(XKERES(K2;ALAP!AB:AB;ALAP!AF:AF);5;2);
            JOBB(XKERES(K2;ALAP!AB:AB;ALAP!AF:AF);2)
            )
        )
        /365;0)

    Három kérdés/észrevétel:
    1. Excel 2021-től lehet használni a LET függvényt, amivel az ismétlődő részeket lehet egyszerűsíteni illetve felgyorsítani. pl. 3x keresed ki ugyanazt az értéket, ezt lehet rövidíteni, vagy akár a dátumra alakítást.
    =LET(adat1;H2;
         adat2;XKERES(K2;ALAP!AB:AB;ALAP!AF:AF);
         atalakit;LAMBDA(x;DÁTUM(BAL(x;4);KÖZÉP(x;5;2);JOBB(x;2)));
       eredmeny;KEREKÍTÉS((atalakit(adat1)-atalakit(adat2))/365;0);
    eredmeny)
    2. Van vmilyen indoka, hogy a dátumok nem értékként hanem szövegként vannak tárolva? Ha csak megjelenítésről van szó, akkor cella számformátummal meg lehet oldani. Ezzel a szöveges változattal csak hátrány van, nem tudsz pl. kimutatásban csoportosítani.
    3. Kipróbálhatod, hátha a DÁTUMÉRTÉK függvény a H és az AF oszlopon is megfelelő.

    üdv

  • Mutt

    senior tag

    válasz VGYke #54479 üzenetére

    Szia,

    Power Query-ben megadhatsz nyelvterületet adatkonverziókor. Az oszlop bal felső sarkában az adattípus megadásakor a legutolsó opció ez, válaszd ki a megfelelő formátumot.

    Ha ezt sokszor kellene megcsinálni, akkor érdemes alapértelmezetté tenni. Power Query-ben Fájl -> Lehetőségek és beállítások -> Lekérdezés beállításai. Alul az aktuális munkafüzetre tudsz adni egy területi beállítást.

    üdv

  • Mutt

    senior tag

    válasz pruzsi #54473 üzenetére

    Szia,

    Megint az adatbázis függvényeket nyomatják, miközben a valós életben teljesen feleslegesek. No mindegy.

    Az eredeti fájl itt van: https://www.nkp.hu/tananyag/75215118658/download/T%C3%A1bl%C3%A1zatkezel%C3%A9s/felveteli.xlsx

    Csókoltatjuk aki
    1) felesleges szóközöket hagyott pár cellában (pl. F6, F12, F30).
    2) nem egyértelműen fogalmazta meg a kérdést.

    Kérdés:
    1) Példánkban az AB.MEZŐ alkalmazásánál miért nem elegendő csak a szóbeli pontszámot megadni, miért kell azzal az eredeti kritériumot bővíteni?
    A képlet hibát jelez, ha nincs az adott feltételnek megfelelő érték, vagy több ilyen is van.
    Azonban ilyen esetben is lehet több egyező érték (a mintában "véletlenül" nem ez az eset), ezért célszerübb előbb egy AB.DARAB-al lekérdezni a találatok számát és az alapján vagy üzenetet vagy az eredményt megjeleníteni. pl.
    =ÁTVÁLT(AB.DARAB2(A1:J151;"Név";N1:Q3);0;"Nincs találat";1;AB.MEZŐ(A1:J151;"Név";N1:Q3);"Több találat van")

    2) Vajon mi történik, ha a kritériumtartomány üres sort tartalmaz? Válaszunkat indokoljuk!
    Ahol nincs kereső kifejezés ott a teljes tartományt kapjuk vissza. Ha a kritérium teljesen üres, akkor az egész adatbázisból kapjuk meg az eredményt.

    3) Fejezzük be a feladatot a P7:Q10 tartományba írt képletek megadásával! Itt már elegendőek ugyan a „HATÖBB” függvények, de a feladatot oldjuk meg nemcsak azokkal, hanem az „AB” függvények alkalmazásával is!

    Ha itt a "teljes tagozat" a választott nyelvtől függetlenül "reál" tagozatos iskolásokat jelenti, akkor a Nyelv1 és Nyelv2 kritérium felesleges (ki is hagyható a kijelölésből, vagy üresen kell hagyni).
    P7-ben a képlet =AB.DARAB($A$1:$J$151;"Kód";$R$1:$R$2)
    A többi képlet látható fent.

    Bónusz: a feladatot oldjuk meg NE csak AB függvényekkel.
    a) HATÖBB-el.
    =DARABHATÖBB(D2:D151;"reál")
    =ÁTLAGHATÖBB(G2:G151;D2:D151;"reál")
    =MAXHA(G2:G151;D2:D151;"reál")
    =MINHA(G2:G151;D2:D151;"reál")

    b) SZŰRŐ-vel
    =DARAB(SZŰRŐ(A2:A151;D2:D151="reál"))
    =ÁTLAG(SZŰRŐ(G2:G151;D2:D151="reál"))
    =MAX(SZŰRŐ(G2:G151;D2:D151="reál"))
    =MIN(SZŰRŐ(G2:G151;D2:D151="reál"))

    Ha több feltétel alapján kell szűrni, akkor már bonyolultabb a dolog (pl. az eredeti kérdésben reál tagozat és német nyelv1 vagy nyelv2-ben). Itt felesleges szóköz miatt inkább KIMETSZ-be tettem mindent:
    =DARAB(SZŰRŐ(A2:A151;(KIMETSZ(D2:D151)="reál")*ELŐJEL((KIMETSZ(E2:E151)="német")+(KIMETSZ(F2:F151)="német"))))

    c) újabb függvény a CSOPORTOSÍTÁS.ALAP.SZERINT (GROUPBY), ahol 1 képlettel mind a 4 eredmény megkapható:

    A képlet pedig: =CSOPORTOSÍTÁS.ALAP.SZERINT(D1:D151;G1:G151;VÍZSZ.HALMOZÁS(DARAB;ÁTLAG;MAX;MIN);1;0;;D1:D151="reál")

    4) Csoportmunkában, a táblázatkezelő program alkalmazásával oldjuk meg a következő problémákat!
    a) válasz NEM, mivel LATIN nyelv esetén nincs meg az induló létszám.
    Ezt egy Kimutatás vagy az új Csoportosítás.alap.szerint tud segíteni.

    b) NEM, ha itt is 8 a minimum fő.
    Itt a képlet hosszú 3 indok miatt: 1) felesleges szóköz néha, 2) néha üres a nyelv2, 3) néha ugyanaz van a nyelv2-ben mint nyelv1-ben. Ezeket szűrtem ki, de KOREÁT nem változtatja meg.
    =CSOPORTOSÍTÁS.ALAP.SZERINT(KIMETSZ(F1:F151);KIMETSZ(F1:F151);DARAB2;3;0;2;(F1:F151<>"")*(KIMETSZ(E1:E151)<>KIMETSZ(F1:F151)))

    c) Amennyiben az iskolának takarékoskodnia kell, akkor milyen beosztásban indítható el a legkevesebb nyelvi csoport, ha a maximális csoportlétszám 24 fő?
    Ehhez vagy fáradt vagyok, vagy túlegyszerűsítem.
    Az a) kérdésben megnéztük hogy adott nyelv hányszor fordul elő elsődlegesen.
    7 nyelv van, van ahol csak 3 fő van van ahol több mint 24. Ha nincs induló létszám limit, akkor 10 csoport jön ki.

    üdv

  • Mutt

    senior tag

    válasz MCMLXXXII #54467 üzenetére

    Szia,

    Kaptál választ, de azért bedobok egy másikat is ami MS365 esetén használható.
    Tudunk olyan saját függvényt létrehozni, amivel egy cellából a számokat tartalmazó részt ki tudunk szedni. A REDUCE függvény tud segíteni.

    Ha A1-ben van az eredeti szöveg, akkor B1-ben a képlet megadja az eredményt:
    =REDUCE("";SORSZÁMLISTA(HOSSZ(A1));LAMBDA(a;c;a&HA(SZÁM(SZÖVEG.TALÁL(KÖZÉP(A1;c;1);"0123456789"));KÖZÉP(A1;c;1);"")))

    Egy kicsit rugalmassabbá lehet tenni, ha egy LAMBDA függvényt csinálunk. Ekkor a Névkezelőben kell elmenteni én a KINYER nevet adtam neki:
    =LAMBDA(
    bemenet;
    csak_szamok;
    kiegeszito;
    LET(h;HOSSZ(bemenet);
        formula;HA(csak_szamok;ELŐJEL;NEM);
        lista;"0123456789"&kiegeszito;
        r;REDUCE("";SORSZÁMLISTA(h);LAMBDA(a;c;a&HA(formula(SZÁM(SZÖVEG.TALÁL(KÖZÉP(bemenet;c;1);lista)));KÖZÉP(bemenet;c;1);"")));
      HAHIBA(r+0;r)
    ))

    3 paramétere van: az első az eredeti szöveget tartalmazó cella, a második egy 0 vagy 1 attól függően hogy a számok vagy a szöveg kell nekünk a cellából. A harmadik pedig egy karakter lista, amit a számokhoz fel akarunk pluszban venni (pl. tizedesvessző).

    A haladó Exceleseknek is szerintem rejt érdekességet a képlet.

    üdv

  • Mutt

    senior tag

    válasz DasBoot #54438 üzenetére

    Szia,

    Nem hinném hogy tud segíteni, de ez a makró megnézi a képleteket tartalmazó cellákat és próbál bennük hibát találni. Az eredményt az immediate ablakba írja ki.
    A CheckFormula függvényben 4 általános hiba ellenőrzés van:
    1) a képlet nem megfelelően kezdődik
    2) zárójelek nincsenek párban
    3) körkörös hivatkozás van a cellában
    4) a fájl hívatkozás érvénytelen

    Sub ListFormulas()
        Dim wsCurrent As Worksheet
        Dim rngFormula As Range
        
        For Each wsCurrent In ThisWorkbook.Worksheets
            With wsCurrent
                'nézzük elöször hogy van-e hibát tartalmazó cellát
                On Error Resume Next
                Set rngFormula = .Cells.SpecialCells(xlCellTypeFormulas, 16)
                On Error GoTo 0
                
                If Not rngFormula Is Nothing Then
                    Call PrintFormulas(rngFormula, 100)
                End If
                
                'nézzük a nem hibát tartalamazó cellákat
                On Error Resume Next
                Set rngFormula = .Cells.SpecialCells(xlCellTypeFormulas, 7)
                On Error GoTo 0
                
                If Not rngFormula Is Nothing Then
                    Call PrintFormulas(rngFormula, 100)
                End If
            End With
        Next wsCurrent
    End Sub

    Sub PrintFormulas(rng As Range, counter As Long)
        Dim r As Range, c As Long
        Dim keplet As String, hiba As String
        c = 1
        For Each r In rng
            keplet = r.Formula2
            hiba = CheckFormula(keplet, r.Address)
            
            If hiba <> "" Then
                Debug.Print "Hely: " & r.Parent.Name & r.Address & ", Hiba: " & hiba & ", Képlet: " & keplet
            End If
            c = c + 1
            
            If c > counter Then Exit For
        Next r
    End Sub

    Function CheckFormula(str As String, loc As String) As String
        CheckFormula = ""
        'nézzük hogy mivel kezdõdik a képlet
        If InStr(1, "=+-@", Left(str, 1)) = 0 Then CheckFormula = "Elsõ karakter hibás"
        
        'képletben párosával kell lennie a zárójeleknek
        Dim leftBracket
        leftBracket = Len(str) - Len(Replace(str, "(", ""))
        If Len(str) - Len(Replace(str, ")", "")) <> leftBracket Then CheckFormula = "Zárójel nincs párban"
        
        'körkörös hivatkozás: képletben saját cella hivatkozás nem lehet
        'hivatkozás lehet: A1, $A$1 formátumban, töröljük a $ jeleket az ellenõrzéshez
        If InStr(1, Replace(str, "$", ""), Replace(loc, "$", "")) > 0 Then CheckFormula = "Körkörös hivatkozás"
        
        'keressünk fájl hivatkozást a képletben
        Dim filePath As String
        If InStr(1, str, "[") > 0 Then
            filePath = Mid(str, 2, InStr(1, str, "]") - 1)
            
            'töröljük a [ ] ' jeleket
            filePath = Replace(Replace(Replace(filePath, "[", ""), "]", ""), "'", "")
                    
            'létezik a fájl?
            If Len(filePath) > 0 Then
                If (Dir(filePath) = "") Then CheckFormula = "Fájl nem létezik"
            End If
        End If
    End Function

  • Mutt

    senior tag

    válasz bpmcwap #54426 üzenetére

    Szia,

    A számítógépbe belépett felhasználót le lehet kérdezni ezekkel a módokkal:
    Application.UserName()
    Environ("USERNAME")

    A számítógép azonosítóját pedig így:
    Environ("COMPUTERNAME")

    Azonban ezek után is a jelszó ellenőrzés a nehezebb dolog. Excelben ezeket tárolni nem biztonságos.

    üdv

  • Mutt

    senior tag

    válasz Attas #54421 üzenetére

    Csak makróval lehet. A munkalap Change eseményére kell ez:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("B8")) Is Nothing Then
            Range("B10") = ""
        End If
    End Sub

  • Mutt

    senior tag

    válasz Attas #54410 üzenetére

    Szia,

    Nem írtál Excel verzió számot.

    1) MS365 vagy Excel 2021/24 esetén van SZŰRŐ/XKERES és egy segédoszlop kell.

    Egy lapon mutatom, de nyugodtan lehet a cég/alkalmazott list a másik lapon.
    a) A céget adatérvényesítéssel megcsinálod.
    b) Ezek után N2-es cellába egy képlettel kiszűrjük, a dolgozók nevét a választott cég alapján a SZŰRŐ (angolul FILTER) függvénnyel. A képlet: =SZŰRŐ(I1:L7;H1:H7=$B$8)
    c) A dolgozó kiválasztása megint adatérvényesítéssel fog menni, aminek a képlete: =INDEX($N$2#;0;1) Itt az N2-es cellára hivatkozunk ahova az előző lépésben a neveket már kikerestük. A hashtag a cellahivatkozás végén azt jelenti, hogy az N2-ben található képlet összes eredményét (legyen az 1 vagy 100) adja vissza. Az INDEX azért kell mert csak az első oszlop kell onnan.
    d) A dolgozó adatait egy XKERES-sel írjuk ki. Ennek a képlete: =HA($B$10="";"";XKERES($B$10;$N:$N;$O:$Q;""))

    2) Ha Excel 2021 előtt vagy akkor használjuk a régi logikát, vagyis tartományokat hozunk létre amelyek tartalmazzák cégenként a választható listát. Ehhez viszont a mostani formátum nem jó. Inkább vmi ilyen kellene:

    Tehát cégenként vannak felsorolva a személyek.
    a) A cégenkénti tartományoknak adjunk nevet, ami a cégneve. Itt jön a gondod, hogy szóköz nem lehet a tartomány nevében. Ezért hagyd ki a szóközt (vagy használj mást, pl. aláhúzást). Én szököz mentesen csináltam három tartományt. A névkezelőben így néznek ki (lehet dinamikus hivatkozást is csinálni az ELTOLÁS függvénnyel, ha nem akarod a tartományt kézzel módosítani amikor egy új dolgozót veszel fel a céghez).
    b) A cég kiválasztását adatérvényesítéssel megcsinálod.
    c) A dolgozónál a trükk pedig, hogy a cégnévben cseréled a szóközt arra amit az a) lépésben tettél. Én töröltem, így a dolgozó adatérvényesítésének képlete ez: =INDEX(INDIREKT(HELYETTE($B$8;" ";""));0;1)Az INDEX megint azért kell, mert csak az első oszlop, a dolgozó nevek kellenek most.
    d) A dolgozók adatait már egy FKERES-sel ki tudjuk keresni. Az első adathoz:
    =HAHIBA(FKERES($B$10;INDIREKT(HELYETTE($B$8;" ";""));2;0);"")
    A második és harmadikhoz a 2-est 3 és 4-re kell cserélni.

    üdv

  • Mutt

    senior tag

    válasz Talala #54411 üzenetére

    Szia,

    Ahol Isnumeric van ott kell egy plusz ellenőrzés vmelyikünk kódjába.

    Nálam:
    If cell.Value <> "" And IsNumeric(cell.Value) Then cell.Value = cell.Value / 1000 + Cells(3, cell.Column)

    Fferinél
    If Target.Value <> "" and IsNumeric(Target.Value) Then

    üdv

  • Mutt

    senior tag

    válasz Talala #54407 üzenetére

    Szia,

    FFeri már adott egy változatot.

    Itt az enyém, amely képes egyszerre több cellát is kezelni, illetve az eseménykezelőt én
    máshogy állítom le. Szintén a munkalap kódjára kell betenni.

    Dim EventStop As Boolean
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim cellInput As Range, cell As Range
        
        If EventStop Then Exit Sub      'megakadályozzuk a körkörös meghívását az eseménynek
        
        Set cellInput = Intersect(Target, Range("B4:K100")) 'csak a megadott tartomány érdekel minket
        
        If Not cellInput Is Nothing Then
            EventStop = True
            
            For Each cell In cellInput  'végigmegyünk az értintett cellákon és ha szám akkor hozzáadjuk a 3-as sorban lévõ értéket
                If IsNumeric(cell.Value) Then cell.Value = cell.Value / 1000 + Cells(3, cell.Column)
            Next cell
            
            EventStop = False
        End If
    End Sub

    üdv

  • Mutt

    senior tag

    válasz Talala #54401 üzenetére

    Szia,

    Milyen logika alapján kerül a másik szám kiválasztásra?
    Oszloponként más az alapérték vagy a bevitt számtól függ?
    Lehet az eredményt másik cellába írni, vagy az eredetiben kell?

    Valószínű kell egy segéd tábla amiben a kombinációk vannak, egy XKERESsel megoldható.

    Üdv

  • Mutt

    senior tag

    válasz huan #54398 üzenetére

    Szia,

    Inkább a Windows Feladatütemezőjét javaslom erre a feladatra.
    Start menüben keress rá a Feladatütemező-re (angolul Task Scheduler).

    A Művelet -> Alapfeladat létrehozása. Kitöltöd a Név, Indítás részeket logikusan. A következő lépésben a programhoz írd be, hogy msg (ez egy kis program a Windowsban amellyel üzenetet lehet megjeleníteni a felhasználónak, Unix/Linux alatt a write / wall ilyen)
    Argumentumoknak: * Jön a hétvége!
    A csillag azt mondja, hogy minden bejelentkezett felhasználó kapja meg az üzenetet.

    üdv

  • Mutt

    senior tag

    válasz Mutt #54392 üzenetére

    Érdekelt a ChatGPT megoldása is.

    Ezt adtam meg neki: "can you write for me a VBA code which joins texts of Excel cells while keeping their original formatting?"

    Erre azt a kódot adta vissza:
    Sub JoinCellsWithFormatting()
        Dim rng As Range
        Dim cell As Range
        Dim destCell As Range
        Dim charIndex As Long
        
        ' Ask user to select cells to join
        On Error Resume Next
        Set rng = Application.InputBox("Select the cells to join (same row or column):", Type:=8)
        On Error GoTo 0
        If rng Is Nothing Then Exit Sub
        ' Ask user to select destination cell
        On Error Resume Next
        Set destCell = Application.InputBox("Select the destination cell:", Type:=8)
        On Error GoTo 0
        If destCell Is Nothing Then Exit Sub
        ' Clear previous content
        destCell.Value = ""
        charIndex = 1
        ' Loop through selected cells
        For Each cell In rng.Cells
            If cell.Value <> "" Then
                ' Copy each character with formatting
                With cell
                    Dim i As Long
                    For i = 1 To Len(.Text)
                        destCell.Characters(Start:=charIndex, Length:=1).Text = Mid(.Text, i, 1)
                        With .Characters(i, 1).Font
                            With destCell.Characters(charIndex, 1).Font
                                .Name = .Name
                                .FontStyle = .FontStyle
                                .Size = .Size
                                .Bold = .Bold
                                .Italic = .Italic
                                .Underline = .Underline
                                .Color = .Color
                            End With
                        End With
                        charIndex = charIndex + 1
                    Next i
                End With
                ' Add space (or separator) between cells, if needed
                destCell.Characters(Start:=charIndex, Length:=1).Text = " "
                charIndex = charIndex + 1
            End If
        Next cell
        MsgBox "Cells joined with formatting preserved.", vbInformation
    End Sub

    A kód lefut, de a szöveget formázás NÉLKÜL fűzi össze.
    Elsőre nekem sem tünt fel a hiba a kódban, de aztán lépésről-lépésre nézve kijött a hiba.

    A 31-32-es sorokban WITH-eket használ, hogy rövidebben tudjun hivatkozni az objektumokra, azonban nem számol azzal, hogy amint egy új WITH indul a korábbiak elvesztik érvényességüket és onnantól TELJES NÉVVEL kell hivatkozni az előző objektumra. MS

    Vagyis a 33-as sorban a .Name = .Name helyett .Name = cell.Characters(i,1).Font.Name kell. Ezzel helyesen fut le.
    A visszajelzés után ChatGPT javította a kódot.

    Kérdés, hogy ez maradandó vagy másnak is el fogja-e követni ugyanezt a hibát?
    Alakul azért.

    üdv

  • Mutt

    senior tag

    válasz bonifa333 #54394 üzenetére

    Szia,

    A topic összefoglaló végén van ingyenesen elérhető magyar nyelvű könyv, nézd meg.
    Én John Walkenbach könyvét tudom javasolni, biztos vannak újabbak is.

    Richard Rost-nak jók a videói, talán a VBA is hasznos.
    Paul-nak is sok hasznos videója van, inkább már haladó szint.

    A fentiek mellett a beépített makró rögzítőt javaslom, mert jó kódot készít, csak nem hatékonyat/univerzálisat. Túl sok a .Select / Selection részt tesz bele, ezeket lehet gyomlálni.
    A VBA egyszerű programozási nyelv, könnyen el lehet vele indulni.

    Azonban az elmúlt években egyre több mindent meg lehet csinálni VBA nélkül is Excelben.
    Régebben fájlokat összefűzni VBA-val lehetett, ma már (igazából 2016-tól) Power Query javasolt.
    Régebben egyedi függvényeket (UDF = user defined functions) csak VBA-val lehetett, Excel 2021-től van már LAMBDA függvény amivel ez cserélhető.

    Szerintem a Power Query és az új függvények megismerése legyen inkább a priorítás és utána lehet VBA-t tanulni.

    üdv

  • Mutt

    senior tag

    Vannak olyan esetek, amikor az Excel nem igazán jó megoldás.
    Korábban már javasoltam, hogy ha vkinek térképen kell megjeleníteni az adatokat, akkor a Power BI a jobb megoldás.

    Az asztali változata ingyenes (MS áruházból letölthető). A fizetős változata sem olyan vészes és tapasztalatom, hogy a főnökök zabálják a jó riportokat.

    A térképhez jó ha van hosszúsági és szélességi adat, de nem kötelező.
    Ha nincs akkor város alapján a Bing kereső térképes szolgáltatásával próbálja meghatározni a helyet, ami tévedni szokott, ezért érdemes egy oszlopban összefűzni az országgal (USA esetében én ország, állam ZIP kombót szoktam használni, pl. US, OH 43210).

    Azonban szélességi és hosszúsági adatok sem olyan nehéz beszerezni.
    1) A https://www.geonames.org/ oldalról letölthetők ingyenesen. A Download részben a Postal Code fájl jó indulsához, de a Free Gazette Data elég hasznos, kár hogy sok adata már elavult.
    2) Ingyenesen az OpenStreetMap-ből is lehet sok adatot leszedni. pl. Magyarország összes településének jópár adata a https://overpass-turbo.eu/ oldal segítségével másodpercek alatt leszedhető.
    A script pedig csak ennyi:
    [out:json];
    area["ISO3166-1"="HU"]->.boundary;
    node[place~".*"](area.boundary);
    out geom;

    Vagy ez több eredmény tud adni néha:
    out body;
    area["ISO3166-1"="HU"]->.boundary;
    (
      node[place=city](area.boundary);
      way[place=city](area.boundary);
      relation[place=city](area.boundary);
    );
    out center;

    3) Aki Google Térképet akar használni, annak pedig ezt a YT videót tudom javasolni. Ez fizetős, de nem nagy összeg.

    4) Lehet még online találni más lehetőségeket.
    https://webdraft.eu/orszagok_varosok/
    https://www.kemitenpet.hu/frame.main.php?dok=letoltes&kat=tables&act=helyseg_hu

    Az első elég hasznos gyűjtés, gratula a készítőjének.

    Ha meg van az adatsorunk, akkor pedig könnyedén lehet ehhez hasonló térképeket készíteni.

    Ezt a demot innen le tudjátok tölteni.

    Ami pluszot tettem bele, hogy van benne egy távolság számítás is, amihez Power Query-ben létrehoztam a GeoDistance függvényt. A képlete pedig:

    = (lat1 as number, lon1 as number, lat2 as number, lon2 as number, rounding as number) as number =>
    let
        r = 6371, // 6371 km vagy 3963.1 mérföld
        p = Number.PI / 180,
        a = 0.5 - Number.Cos((lat2-lat1)*p)/2 + Number.Cos(lat1*p) * Number.Cos(lat2*p) * (1-Number.Cos((lon2-lon1)*p))/2,
        result = Number.Round(2 * r * Number.Asin(Number.Sqrt(a)), rounding)
    in
        result

    Power BI-ban számított eredményként (measure) is meg lehet ezt csinálni, de ha sok adatról van szó, akkor javaslom hogy inkább modellbe töltés előtt legyenek számolva az adatok. Ehhez Bas-nak ezt a videóját tudom ajánlani.

    Remélem tudtam ötleteket adni.

  • Mutt

    senior tag

    válasz bonifa333 #54390 üzenetére

    Szia,

    ...cella tartalmát úgy, hogy a formátumot tartsa meg...

    Csak makróval oldható meg.
    Az alábbi kódot tedd ki a gyors elérési eszköztárra és a kijelölt cellákat összefűzi a kívánt helyre a megfelelő formátummal. Ha vmilyen formátumot (pl. aláhúzást) nem akarsz másolni, akkor a vége felé a .Font sorokból kell kikommentezni vagy törölni.

    Sub OsszefuzesFormatummal()
        Dim cellak As Range, cel As Range       'mely cellákat és hova kell összefűzni
        Dim sor As Long                         'sor iterációhoz használt változó
        Dim p As Long, r As Long, cella As Range 'cella iterációkhoz használt változók
        Dim formats
        
        'induló és cél tartományok bekérése
        Set cellak = Application.InputBox(Prompt:="Add meg a tartományt amit össze kell fűzni: ", _
                        Default:=Selection.Address, Title:="Tartomány", Type:=8)
        Set cel = Application.InputBox(Prompt:="Add meg a céltartományt: ", _
                    Default:=Selection.Range("A1").Offset(, Selection.Columns.Count).Address, Title:="Tartomány", Type:=8)
        
        'ha célnak több cella vagy oszlop lett megadva akkor annak első cellájából indulunk
        Set cel = cel.Range("A1")
        
        'összefűzéshez használandó elvalasztó megadása
        Dim elvalaszto As String
        elvalaszto = Application.InputBox(Prompt:="Elválasztó (alapból szóköz): ", Title:="Elválasztó", Default:=" ", Type:=2)
        
        'makró gyorsítása a képernyő frissítés kikapcsolásával
        Application.ScreenUpdating = False
        
        r = 1                            'cél cellában a pozició nyomonkövetése
        sor = cellak.Range("A1").Row     'cél tartományban a sorok nyomonkövetése
        
        For Each cella In cellak
            'ha újabb sort kezdünk el feldolgozni, akkor a cél cellát is újabb sorba tesszük
            If cella.Row <> sor Then
                r = 1
                sor = cella.Row
                Set cel = cel.Offset(1)
            End If
        
            If Len(cella.Text) > 0 Then
                'betűnként végigmegyünk az eredeti szövegen és formátumát másoljuk
                For p = 1 To Len(cella.Text)
                    Set formats = cella.Characters(p, 1)
            
                    With cel.Characters(r, 1)
                        .Text = formats.Text
                        .Font.Bold = formats.Font.Bold
                        .Font.Italic = formats.Font.Italic
                        .Font.Underline = formats.Font.Underline
                        .Font.Strikethrough = formats.Font.Strikethrough
                        .Font.Subscript = formats.Font.Subscript
                        .Font.Superscript = formats.Font.Superscript
                    
                        .Font.Color = formats.Font.Color
                        .Font.TintAndShade = formats.Font.TintAndShade
                    
                        .Font.Name = formats.Font.Name
                        .Font.Size = formats.Font.Size
                    End With
                    r = r + 1
                Next p
            
                r = r + Len(elvalaszto)
                cel.Characters(r, 1).Text = elvalaszto
            End If
        Next cella
        
        Application.ScreenUpdating = True
    End Sub

  • Mutt

    senior tag

    válasz Dr. Mózes #54329 üzenetére

    Szia,

    Szokni kell a Power Pivot-ot. Ezek szerint csak az volt a gond, hogy a képlet nem volt teljes. Én többnyire el kezdem gépelni a függvény vagy tábla/mező nevet és kiválasztom a listából egy TAB-ot nyomva.

    Amire figyelni kell, hogy Power Pivot-ban a függvények csak angol nyelven vannak.
    Sok munkalap függvénynek megvan a DAX-os változata, de eltérően műkődnek.

    Nem tudom, hogy az UDEMY-s oktatás csak Power Pivotról (és DAX-ról) szól-e vagy más Power tool is említve van (főleg Power Query, esetleg Power Automate), de a DAX nehéz.

    üdv

  • Mutt

    senior tag

    válasz Dr. Mózes #54320 üzenetére

    Szia,

    Power Query-ben nincs DATEDIFF, ott a Duration függvények használhatóak. Ezekben DateTime és Date adattípusok használhatóak. pl. =Duration.Days([End]-[Start])

    A dátumok számként vannak tárolva, a regionális beállítás csak az év/hó/nap/óra/perc/másodperc helyes sorrendjének megadására szolgál. Ha sikeresen feldolgozta az értéket, akkor onnantól már számként műkődik.

    Azt írtad, hogy amerikai dátumokat dolgoztatsz fel magyar Excelben ott meg kellene adnod az USA beállítást, hogy helyes értékek legyenek.

    DATEDIFF (magyar Excelben DÁTUMTÓLIG) egy rejtett munkafüzet képlet, amelynél az első paraméter a kezdő, a második a végdátum. A harmadik pedig hogy milyen egységben (eltelt napok, hónapok, évek stb) jelenítse meg a két dátum különbségét. Itt annyi kavarás van, hogy magyar Excelben is az angol rövidítéseket ("d", "m", "y") kell használni.

    Power Pivot-ban a DATEDIFF már a DAX-ot használja. Ott a hibaüzeneted más hibára utal.
    Tippre az lehet a gond, hogy van olyan dátumod ami 1900 előtti.

    Excel munkalapon az ilyen dátumok szövegek. Ha ezt közvetlenül töltöd be Power Pivotba, akkor nem minden sorod lesz dátum típus amire kiakad a DATEDIFF.
    Egy ISNUMBER([dátum oszlopod]) megadja hol van hiba.

    Power Pivotba Power Query-vel célszerű adatokat betölteni, ilyenkor már nem él az 1 millió soros limit (ami egy munkalapon lehet). Dátumoknál több évszázadot is vissza lehet ott már menni gond nélkül. Power Pivot/Power Query Krisztus utáni 100. évtől felfelé műkődik (persze 1582 előtt sok értelme nincs).

    A másik tippem az lehet, hogy a [YEAR] és a [Mai nap] közötti éveket akarod, csakhogy a YEAR nekem szövegnek tűnik (balra van rendezve) és mégha szám lenne akkor se lenne jó, több dolog miatt. Ha ez kell akkor a számított oszlop, csak ennyi =YEAR([Mai nap])-[YEAR] 

    üdv

  • Mutt

    senior tag

    válasz Silious #54262 üzenetére

    Szia,

    Excel 2016-tól létezik a KÉPLETSZÖVEG (FORMULATEXT) függvény illetve még használható a Képletek -> Képlet vizsgálat -> Képletek mutatása (Alt és pont a shortcut).

    Üdv

  • Mutt

    senior tag

    válasz Geryson #54257 üzenetére

    Szia,

    MS365-ben van neked CSOPORTOSÍTÁS.ALAP.SZERINT (GROUPBY) függvényed is amit kipróbálhatsz.

    T1-ben a képletnek próbáld ki ezt: =CSOPORTOSÍTÁS.ALAP.SZERINT(F:F;K:K;SZUM;3)

    üdv

  • Mutt

    senior tag

    válasz -=MrLF=- #54254 üzenetére

    Szia,

    Ez a táblázat miatt van, amikor a lapon lévő adatok csoportosítva vannak. Az egyik adatot tartalmazó cellában legyél, majd a Beszurás menüben a Táblázatot válaszd.

    Excel 2003-tól létezik, a régi fájlformátum azonban nem teljesen támogatja.

    Sok előnye van.

    Üdv

  • Mutt

    senior tag

    válasz föccer #54237 üzenetére

    Szia,

    Nem kell két dictionary, hogy tudd melyik receptből mennyi van. A kulcs (key), mellett van az item tulajdonság is. A receptDict teljesen felesleges.

        ' Receptszámok összegyűjtése és számlálása
      Set receptCount = CreateObject("Scripting.Dictionary")
        osszesMinta = 0
        
        For i = 2 To lastRow
            If alapadatok.Cells(i, 1).Value = valasztottUzem Then
                receptSzam = alapadatok.Cells(i, 2).Value
                osszesMinta = osszesMinta + 1
              If Not receptCount.Exists(receptSzam) Then
                   receptCount.Add receptSzam, 1
                Else
                   receptCount(receptSzam) = receptCount(receptSzam) + 1
                End If
            End If
        Next i

    üdv

  • Mutt

    senior tag

    Sziasztok,

    A Microsoft 1 évvel ezelőtt egy új függvényt mutatott be, amellyel kimutatást (pivot) lehet készíteni. Magyarul KIMUTATÁS.ALAP.SZERINT (angolul PIVOTBY) a függvény neve.

    Nálam a kimutatás gyakran van használva (pár éve áttértem Power Pivot-ra a normál helyett), de eddig még nem próbáltam ki az új függvényt.

    Tegnap egy kicsit játszottam vele és ezen tapasztalatot akarom megosztani veletek egy 130 ezer és 77 oszlopot tartalmazó adatosoron, ez kicsivel több min 10 millió cella, ez egy 37 MB-os XLSX fájlban van (aki teheti az sok adat esetén használjon inkább XLSB formátumot, mert ugyanez csak 10 MB, hátránya max annyi hogy lehet hogy más programok/rendszerek nem támogatják ezt a formátumot, illetve ha megsérül a fájl, akkor nagyobb az esély adatvesztésre).

    Az új függvény (továbbiakban PIVOTBY) előnyei:
    1) automatikusan frissül az eredmény ha az adatsoron változás van,
    Itt nem vettem észre lassulást, gyorsan megkapjuk az eredményt (5 éves laptop 16 GB ram és i7-9850H CPU, Windows és Office is 64 bites).
    2) Több összesítő (aggregátor) függvénye van mint egy standard Pivotnak, vannak olyanok amiket csak Power Pivot-tal lehetett eddig elérni (pl. szöveg összefűzés) és LAMBDA függvényt is tudunk írni.
    3) nincs pivot cache (kimutatás forrásadatok/gyorsítótár) ami növeli a fájl méretét.
    A 37 MB-os fájl normál Pivottal 46 MB lett, Power Pivottal 47 MB, mig PIVOTBY-al maradt 37 MB.

    Szerintem ezzel végére is értem az előnyöknek, a hátrány viszont bőven van.
    1) A függvénynek 11 paramétere van, ebből 4 kötelező, de a valóságban kb. még 3-at (összegek/részösszegek mutatása, sorbarendezés, szűrő) célszerű használni.
    Egy alap pivot is túl bonyolult (a sortörésekkel próbáltam az olvashatóságot segíteni).

    2) Őrült képletek kellenek egyes esetekben , amiket a pivotban simán el tudtunk érni.
    pl. nem csak összeget, hanem átlagot is akarunk számolni ugyanarra a mezőre.

    3) Nincs formázás, így nekünk kell mindent csinálni. Ami azért kihívás, mert ez egy spill/terülő képlet, mindig annyi sort/oszlopot fog elfoglalni amire szükség van. Ha azt akarjuk hogy a totál sor/oszlop értékek máshogy nézzenek ki, akkor feltételes formázásokat kell használnunk. Ez sok idő tud lenni.

    4) Szűrő/szeletelő használata sem olyan egyszerű. (A mintában a BYROW sor a G1 cellában lévő év szerinti szűrést végzi el.)

    Egy kis összegzés:
    Egyszerűbb dolgokra lehet használni a PIVOTBY-t, de jelenlegi formájában még távol van egy normál PIVOT-tól. Vállalati környezetben én még kerülném/kerülöm.

    üdv

  • Mutt

    senior tag

    válasz Pakliman #54199 üzenetére

    Szia,

    Két megoldást tudok javasolni:
    1. A Click eseményeket beteszed egy saját subroutinba és azonnal meghívod ahogy a vezérlőt (választó gombot) létrehoztad.

    Sub RunClick(obj As Object)
        Dim frm As MSForms.UserForm
        
        Set frm = obj.Parent
        
        With frm
            Select Case obj.Name
                Case "opbXYZ1"
                    .Label1.Caption = obj.Name & ": " & obj.Value
                Case "opbXYZ2"
                    frm.BackColor = 13882323
                    MsgBox "hello world"
                Case "opbXYZ3"
                    frm.BackColor = 14481663
            End Select
            
        End With
    End Sub

    A Select Case-el csak bemutattam hogy eltérő ágakat tudsz létrehozni.

    2. Megvárod, hogy a vezérlő létrejöjjön és csak utánna változtatod meg az értékét.
    A kódodon csak minimálisan változtattam (tartalmazza az 1-es lehetőséget is), a végén van a 2-es opció. Ott véletlenszerűen megváltoztatom az egyik vezérlő értékét, ekkor már le fog futni a Change esemény-

    Private Sub CommandButton1_Click()
        Dim ctl_OpB As MSForms.OptionButton
        Dim i As Long
        
        ReDim opbArray(1 To 3)
        
        For i = 1 To 3
          Set ctl_OpB = Me.Controls.Add("Forms.OptionButton.1", "opbXYZ" & i, False)
          
          With ctl_OpB
              .Left = 100
              .Top = 150 + (i * 20)
              .Width = 100
              .Caption = "opb_" & CStr(i)
              .Visible = True
          End With
      
        'egyik megoldás, hogy létrehozáskor elindítod a saját kódod
          Call RunClick(ctl_OpB)
      
          Set opbArray(i).OptionButton = ctl_OpB
        Next i
        Set ctl_OpB = Nothing
        
        'másik megoldás, hogy létrehozás után változtatod meg az értékét
        Dim r As Double
        Randomize
        r = Int(Rnd * 3) + 1
        
        opbArray(r).OptionButton.Value = Not opbArray(r).OptionButton.Value
    End Sub

    A class module-ban csak ennyi van:

    Public WithEvents OptionButton As MSForms.OptionButton
    Private Sub OptionButton_Change()
        Dim frm As MSForms.UserForm
        
        Set frm = OptionButton.Parent
        
        With frm
            .Label1.Caption = .Label1.Caption & vbNewLine & OptionButton.Name & " - " & OptionButton.Value
        End With
    End Sub

    Próbáld ki.

    üdv

  • Mutt

    senior tag

    válasz Fferi50 #54172 üzenetére

    Sziasztok,

    Én nem szoktam használni, de lehet tartományokat jelszavaztatni.
    Mark ebben a videóban bemutatja, kb. 2:40-től kezdődik. Ezzel lehet eltérő "jogosultságokat" létrehozni. A videó végén azért elhangzik, hogy az Excel jelszavas védelmére építkezni nem szabad.

    üdv

  • Mutt

    senior tag

    válasz #54157 üzenetére

    Szia,

    Szerintem itt fontos tisztázni azt, hogy amit a Personal.xlsb "Workbook_Open" eseményébe teszel, akkor az csak egyszer fog lefutni, amikor az Excel indulásakor az egyéni makrófüzet a háttérben megnyílik.

    Azt akarod, hogy minden Excel fájl megnyitásakor legyen vmi ellenőrzés és azt ahogy tetted egy Class Module-al lehet megtenni.

    Próbáld ki:
    1. Personal.xlsb-ben legyen egy class module, a neve fontos clsApp legyen (ha más akkor a másik modulban kell módosítani). A tartalma pedig ez:
    Public WithEvents AppEvents As Application
    Private Sub AppEvents_WorkbookOpen(ByVal wb As Excel.Workbook)
      Call OpenEvent(wb)
    End Sub
    Private Sub AppEvents_WorkbookBeforeClose(ByVal wb As Workbook, Cancel As Boolean)
        Call BeforeClose(wb, Cancel)
    End Sub

    Ahogy látható két workbook eventhez (open és a beforeclose) rendeljük a saját kódunkat.

    2. A Personal.xlsb-ben legyen egy normál modul amibe az alábbi kódok kellenek:
    Dim AppObject As New clsApp

    Sub Init()
    'ezt az egyéni makrófüzet Open eseményében fogjuk meghívni
        Set AppObject.AppEvents = Application
    End Sub

    Sub OpenEvent(wb As Workbook)
        'ez az egyéni Workbook_Open eseményünk ahova tesszük a saját kódot
        
      'a megnyitott fájl ellenőrzése (a példában ha M-el kezdődik a neve)
        If wb.Name Like "M*" Then
            'hozzáadjuk a kedvenc makrónkat az eszköztárhoz
            Call AddNewMenuItem
        End If

    End Sub

    3. A Personal.xlsb ThisWorkbook eseményeibe pedig tegyük ezt be:
    Private Sub Workbook_Open()
        Call Init
    End Sub

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Call DeleteControls(True)
    End Sub

    Vagyis amikor elindítjuk az Excel-t, akkor az "Init" kódban megadott sor lefut, ami annyit tesz, hogy egy objektumot hoz létre ami tartalmazza az Excelben megnyitott fájlokat.
    A másik pedig ha bezártuk az Excel-t teljesen, akkor előtte töröljük a saját menűt.

    4. Az egyéni parancs eszköztárra (QAT) kihelyezése.
    Gyorselérési eszköztárra nem raktam még kóddal ki gombot, de a https://jkp-ads.com/rdb/win/s2/win004.htm oldalon találtam egy hasznos add-int, aminek a kódja szerint ez könnyen megy, de nekem nem jött össze. Az addin ettől még szuper, ha van sok saját makród, akkor ezzel tudod rendszerezni és elérni QAT-ról.

    Ami ment az egy új menű az eszköztáron. Én régen ezt használtam, MS365-ben most is megy.

    Szóval van a normál modulban még 2 program, ami felteszi illetve leveszi a saját makródat.

    Ami felteszi az így néz ki:
    Private Sub AddNewMenuItem()
        
        'töröljük az esetleg létező saját menűt
        DeleteControls
        Dim CmdBar As CommandBar
        Dim CmdBarMenuItem As CommandBarControl
        Set CmdBar = Application.CommandBars("Worksheet Menu Bar")
        'Add a new menu item
        Set CmdBarMenuItem = CmdBar.Controls(CmdBar.Controls.Count - 1).Controls.Add
        
        'Set the properties for the new control
        With CmdBarMenuItem
            .Caption = "Saját Makró1"
            .OnAction = "'" & ThisWorkbook.Name & "'!Kedvencem"
            .Tag = C_TAG
        End With
    End Sub

    Ehhez van egy C_TAG állandó a modul elején definiálva:
    Private Const C_TAG = "Makrocska"   'C_TAG legyen egyedi név

    Illetve fent a kódban az OnAction végén van a makró neve (esetemben "Kedvencem"),
    ami ennyit tartalmaz csak:
    Sub Kedvencem()
        MsgBox "Palacsinta", vbOKOnly
    End Sub

    Ami leveszi az pedig ez:
    Sub DeleteControls(Optional tuti As Boolean = False)
        Dim Ctrl As CommandBarControl
        On Error Resume Next
        Set Ctrl = Application.CommandBars.FindControl(Tag:=C_TAG)
        Do Until Ctrl Is Nothing
            Ctrl.Delete
            Set Ctrl = Application.CommandBars.FindControl(Tag:=C_TAG)
        Loop
    End Sub

    A fenti kódokkal el tudtam érni, amit szerettél volna:
    1. Akár jelszavas fájlok esetén is (csak a megfelelő jelszó ismeretében) fut le az open esemény...
    2. ami a kritériumoknak megfelelően (a példámban csak az nézem hogy a fájl neve M-el kezdődik-e vagy sem) kirak egy makrót az eszköztárra...
    3. az Excel bezárásakor pedig leveszi a dolgokat.

    Próbáld ki, ha még kell.
    A kódok alapja a Walkenbach VBA könyve (17-es fejezet). Régi (az újabbak sem hinném hogy rosszabbak), de még mindig nagyon jó. Én csak ajánlani tudom angolul tudóknak.

    Két fontos dolog:
    1) Saját makrók esetén fontos tudni jól használni a Thisworkbook és Activeworkbook-ot.
    2) Én inkább fixen kiraknám a makrót a QAT-ra és a makrót készíteném fel arra, hogy ha a fájl nem felel meg a feltételeknek akkor ne csináljon vele semmit.

    üdv

  • Mutt

    senior tag

    válasz föccer #54221 üzenetére

    Szia,

    Átmenetileg ki is lehet kapcsolni, hogy Enter után másik cellába lépjen.
    Pipa ki "Az enter lenyomására ..." opciónál.

  • Mutt

    senior tag

    válasz #54139 üzenetére

    Szia,

    ...azt kéne elérni, hogy a visible sorok legyenek szép zebra mintásak...

    Látom közben VBA-n indultál el, ahol használod a SUBTOTAL (RÉSZÖSSZEG) függvényt ami a megoldás kulcsa.

    Itt van az én VBA és Excel tábla nélküli, feltételes formázást használó megoldásom:

    A képlet pedig: =MOD(SUBTOTAL(3;$A$5:$A5);2)
    Magyar Exelben: =MARADÉK(RÉSZÖSSZEG(3;$A$5:$A5);2)

    A lényeg, hogy a SUBTOTAL-ban egy alulról nyitott tartomány (csak a kezdő cella van rögzítve, a vége növekszik, ahogy másolódik a képlet) van megadva.

    üdv

  • Mutt

    senior tag

    válasz aviator #54131 üzenetére

    Szia,

    Tudnál egy képet mutatni a treeviewról?
    Csak megjelenítésre van vagy onnan kiválasztanak?

    Üdv

  • Mutt

    senior tag

    válasz jackal79 #54126 üzenetére

    Szia,

    Az én javaslatomban a szerszámok elé beszúrtam egy oszlopot, ahova fel lehet sorolni a karbantartási napok nevét (pl. K,P)


    A C2-ben a képlet a mintámban (vigyázz a vegyes hivatkozásokra, egyszer az első sort kell rögzíteni, másszor pedig az első oszlopot): =HA(SZÁM(SZÖVEG.KERES(SZÖVEG(C$1;"nnn");$A2));"X";"")

    A képlet az első sorban lévő dátumból a SZÖVEG függvénnyel a nap nevét meghatározza, majd megkeresi hogy az első oszlopban szerepel-e a név. Találat esetén jön az X.

    üdv

  • Mutt

    senior tag

    válasz meke11 #54118 üzenetére

    Szia,

    A videóban a trendvonal együtthatóit kézzel rögzítik, de lehet képlettel számoltatni.
    A LIN.ILL (angolul LINEST) függvényt lehet használni. Alapból lineáris illesztést végez, de meg lehet adni neki hogy másikkal számoljon (esetedben logaritmikus). Ha megvannak az együtthatók, akkor már csak képletbe kell tenni őket.

    A képen angol Excelben látod a dolgokat.

    Az E2-ben van a meredekség A képlete magyarul:
    =INDEX(LIN.ILL(B2:B10;LN(A2:A10));1)
    A metszéspont képlete (E3)
    =INDEX(LIN.ILL(B2:B10;LN(A2:A10));2)

    Ezek tömbképletek, Excel 2021 előtt Ctrl-Shift-Enter (CSE) kell hozzájuk.
    Ezek után az E5/F5/G5-be tettem az értékekeket, amikhez keressük a szemcseméretet.
    Ennek a képlete: =KITEVŐ((E5-$E$3)/$E$2)

    Ha Excel 2024/MS365-ön vagy, akkor a fentiek helyett az egészet egy LET/LAMBDA függvénybe lehet elhelyezni (CSE sem kell).
    E7-ben a mindent helyettesítő képlet:
    =LET(
    egyutthatok;LIN.ILL($B$2:$B$10;LN($A$2:$A$10));
    y;E5;
    KITEVŐ((y-INDEX(egyutthatok;2))/INDEX(egyutthatok;1))
    )

    üdv

  • Mutt

    senior tag

    válasz Lajos.P #54102 üzenetére

    Szia,

    Nem írtál verzió számot, de a korábban kapott pont lecserélése helyett ítt egy saját függvény, amelyet Excel2024 vagy MS365-ben a névkezelőben tudsz létrehozni.

    Névnek SZÁMOK -at adtam meg.
    A képlet pedig: =LAMBDA(r;SZÖVEGÖSSZEFŰZÉS("";IGAZ;HA(SZÁM(SZÖVEG.KERES(KÖZÉP(r;SORSZÁMLISTA(HOSSZ(r));1);"0123456789"));KÖZÉP(r;SORSZÁMLISTA(HOSSZ(r));1);""))*1)

    üdv

  • Mutt

    senior tag

    válasz lappy #54094 üzenetére

    Szia,


    1) Legyen táblázatban az adat (példámban bal fent), mert ekkor tudsz szeletelőket (slicers) használni.
    2) Ezek után a SZŰRŐ (FILTER) függvényt lehet használni a RÉSZÖSSZEG (SUBTOTAL)-al.
    A részösszeg olyan függvény, amely képes a rejtett sorokat (szűréskor ez történik) megkülönböztetni a többitől.

    A képlet az én példámban: =SZŰRŐ(Táblázat1[[Név]:[Kor]];BYROW(Táblázat1[Név];LAMBDA(sor;RÉSZÖSSZEG(3;sor)));"Nincs adat")

    Remélem ez alapján el tudsz indulni.

    üdv

  • Mutt

    senior tag

    válasz Fferi50 #54086 üzenetére

    ...A sheet 1en ott van a H oszlopban (H2 - H607 ez mar ki van toltve minden szobahoz) a szoba tipus, az I oszlopban (I2 - I607 ha a szoba el van adva) pedig a heti ar. ....
    Mondjuk eladunk egy standard bronz szobat, akkor beirjuk az I oszlopba az arat sheet 1en...

    Én ebből inkább egy DARABHATÖBB/COUNTIFS-re gondolok.
    =DARABHATÖBB(MasterSheet!$H:$H;$B17;MasterSheet!$I:$I;">0")

  • Mutt

    senior tag

    válasz karlkani #54071 üzenetére

    Szia,

    Próbáld meg így:
    ActiveSheet.Shapes.Item(1).Top = Rows(user).Top

    Azonban ha van fejléced, akkor én inkább javsolnám, hogy
    1. Rögzítsd a fejlécet
    2. Helyezd el a fejlécsorban a gombot.

    üdv

  • Mutt

    senior tag

    válasz Wolfskin #54060 üzenetére

    Szia,

    Nagyon régi Exceled van, ezért a legjobb megoldás ott a Kimutatás (angolul Pivot) amit a Beszúrás menű alatt lehet megtalálni. Érdemes Youtube-on rákeresni (egy példa), hogyan lehet készíteni/használni.

    Mivel szeretnél ismétlődésmentes értéket ezért a régi Excel-ben az adatsorodhoz kellene egy új segédoszlopot adni.

    Az én mintám ilyen:

    Ezek után az adatokon állva a Beszúrás -> Kimutatás opciót használva a BRAND-et húzd a Sorok részbe az SKU-t pedig az Értékek-be. Ha minden jól megy, akkor ehhez hasonló lesz az eredményed:

    A kimutatás NEM frissül magától, ha a mögöttes adatsorban változás van, akkor frissíteni kell. Legegyszerűbb, ha a kimutatásba belekattintasz és jobb egérgombbal a Frissítést választod.

    A KIMUTATÁSADATOT.VESZ függvényt nem javasolom, mert csak már létező kimutatás adatait tudja csak kiolvasni. Neked nem erre van szükséged.

    Ha ténlyeg függvényekkel akarod megoldani a problémát, akkor:
    1. kell egy lista ami a BRAND-eket tartalmazza ismétlődés nélkül. Ez Excel 2021 előtt tömb-képlettel lehet elérni. pl. így
    2. Ezek után a DARABTELI-vel lehet megszámolni, hogy az eredeti adatsorban hányszor szerepel az 1-es lépésben kilistázott márkákat.

    üdv

  • Mutt

    senior tag

    válasz HollyBoni #54048 üzenetére

    Szia,

    1) Jogosultságok hiányá lehet: Tudsz arról a gépről a mappába másolni?
    Ha igen, akkor nevezd át a fájlt. Próbáld a problémás gépről megnyitni.
    2) Kapcsold ki a viruskeresőt a gépen.
    3) A próblémás gépen indítsd csökkentett módban az Excelt. Ha ekkor gond nélkül meg tudod nyitni/menteni a fájlt akkor egy addon okozza a gondot. Office telepítés módosítása és helyreállítás vagy letiltod az összes addont (Fájl-Beállítások-Bővitmények alatt) és egyesével aktiválod a szükségeseket amíg elő nem jön a hiba.
    4) Adatvédelmi központban vedd fel a mappát megbízható helynek. Illetve itt nézd meg a fájlblokkolás beállítást (nekem mentésnél nincs pipa sehol, megnyitásnál pár van)

    Üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #54042 üzenetére

    Szia,

    Erre a részre hadd válaszoljak:
    "2. szvsz meg nem az a megoldás, hogy elkezdem "kiherélni" a régi Excel-eket és a régi, gyakran használt, és hasznos függvényeket meg eltüntetem.."

    Az Excelben máig használhatóak 1995 előtti dolgok, aka. Excel4 makrók vagy ott van a híres elrejtett DÁTUMTÓLIG/DATEDIFF.
    Nem tűnnek el dolgok, ha az Excel elfogadja a képletet, akkor az használható marad évtizedekkel később is.
    Az általam javasolt magyar változat bemásolható az általad használt Excelbe de hibás, mivel ott más a függvény neve, de ha a helyes, natív függvényt használod a képletben akkor onnantól bármelyik más támogatott Excelben megnyitva (DARABHA / DARABTELI esetén Excel 2003-tól indulva) a fájlt menni fog. A szerkesztőlécen lehet hogy változni fog a függvény neve verziónként de teljesíteni fogja a dolgát.

    1-2 éve már talán leírtam, hogy szerintem nem jó irányba megy az Excel. Függvények tucatjai kerülnek bele, van aminek talán értelme sincs (pl. MAP). Office Scripts éppen 6 éves múlt, el is felejtettem ahogy mindenki más. Python integrálva, de inkább ne lenne.

    üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #54031 üzenetére

    Szia,

    Ezek szerint nálad telepíteni kell ezt a függvényt, hadd segítsek benne.
    A MS365/Excel2024-ben a Névkezelőben (Képletek menű) a Névnek add meg hogy DARABTELI.
    Hivatkozásnak pedig: =LAMBDA(tartomány;kritérium;DARABHA(tartomány;kritérium))


    Innentől már neked is műkődni fog.

    Természetesen hibáztam, mert talán Excel 2016-tól (ekkor jöttek be a *HATÖBB függvények és 2010-ben még tuti DARABTELI) már DARABHA a függvény magyar neve.
    Sajnos minden általam használt fordító oldal a régi nevet tartotta meg, elkezdtem írogatni nekik, hogy javítsák a hibát.

    Amit még elfelejtettem írni, hogy ez tömbképlet. Excel 2021 előtti felhasználóknak Ctrl-Shift-Enter-t (CSE) kell használni.

    üdv

  • Mutt

    senior tag

    válasz royal828 #54010 üzenetére

    Szia és Mézes üdvözlet Merqreenek is,

    Szerintem elavult az MS Project, egy project csapatmunkából és kommunikációból áll. Ezt évekkel ezelőtt nem tudta, ha azóta igen akkor elnézést az egész kommentért.

    Nálunk a Smartsheet.com megy, havi 8 dollár/szerkesztő nem vihet csődbe egy céget. Szerintem könnyen kezelhető, mivel online ezért csapatmunkára kiváló. Lehet feladatok kiosztani, csatolmányokat feltölteni stb.

    A Monday.com nagyon reklámozza magát és van teljesen ingyenes változata. Nem használtam így nem tudok mit mondani róla.

    Üdv

  • Mutt

    senior tag

    válasz ny.janos #53684 üzenetére

    Szia,

    Megnéztem a fájlt és zavaró, hogy a sorrend változik egyszerű műveletek után, de ez nem hiba, hanem a rendszer műkődésének "terméke". Már 2018-ban is panaszkodtak erre ahogy most keresgéltem és azóta nincs változás. Ahogy korábban beszéltünk róla, ha fontos a sorrend, akkor az utolsó lépés(ek)ben kell elintézni.

    Az okosok szerint ez azért történhet meg, mert az optimalizáció jegyében a Power Query nem mindig abban a sorrendben hajtja végre az átalakításokat mint ahogy a lépések/a felhasználói logika adja.

    A legtöbben a Table.Buffer-t (ami a memóriába teszi az adott lépés eredményét, ezzel felgyorsítva az elérését az adatoknak később) javasolják. A puffereléshez elő kell állítani a kész eredményt, nem fog tudni menetközben kavarni.

    A mintádban az utolsó kibontás előtti lépés került memóriába és tényleg utána nem változik a sorrend. Ha hamarabb teszem RAMba az adatokat, akkor már megint van kavarás.

    Még egy dolgot módosítottam, hogy te is szokd/gyakorold a tábla kibontást másik módon. A 13. lépésed a "Mérkőzés indexszámmal" táblák kibontása/egyesítése. Ezt a GUI-ról könnyen el lehet végezni, de 2 problémája van:
    - fixen rögzíti az oszlop neveket amikkel dolgozni fog és
    - elveszíted az oszlopok adattítpusát
    Láthatod hogy egyik korábbi oszlopnak sincsen típusa.

    Helyette lehet használni a Table.Combine-t.
    A teljes M-kód:

    let
        Forrás = Excel.CurrentWorkbook(){[Name="Eredmenyek"]}[Content],
        #"Típus módosítva" = Table.TransformColumnTypes(Forrás,{{"Forduló száma", Int64.Type}, {"Versenyző sorszám", Int64.Type}, {"Mérkőzés száma", Int64.Type}, {"Hazai/vendég", type text}, {"Versenyző", type text}, {"Csapat", type text}, {"Teli 1-25", Int64.Type}, {"Össz 1-50", Int64.Type}, {"Teli 51-75", Int64.Type}, {"Össz 51-100", Int64.Type}}),
        #"Sorok szűrve" = Table.SelectRows(#"Típus módosítva", each ([#"Össz 51-100"] <> null)),
        #"Érték felülírva" = Table.ReplaceValue(#"Sorok szűrve",null,0,Replacer.ReplaceValue,{"Teli 1-25", "Össz 1-50", "Teli 51-75", "Össz 51-100"}),
        #"Összeadás beszúrva" = Table.AddColumn(#"Érték felülírva", "Teli", each [#"Teli 1-25"] + [#"Teli 51-75"], Int64.Type),
        #"Összeadás beszúrva1" = Table.AddColumn(#"Összeadás beszúrva", "Összesen", each [#"Össz 1-50"] + [#"Össz 51-100"], Int64.Type),
        #"Kivonás eredménye beszúrva" = Table.AddColumn(#"Összeadás beszúrva1", "Tarolás", each [Összesen] - [Teli], Int64.Type),
        #"Oszlopok eltávolítva" = Table.RemoveColumns(#"Kivonás eredménye beszúrva",{"Teli 1-25", "Össz 1-50", "Teli 51-75", "Össz 51-100", "Teli"}),
        #"Sorok rendezve" = Table.Sort(#"Oszlopok eltávolítva",{{"Forduló száma", Order.Ascending}, {"Mérkőzés száma", Order.Ascending}, {"Összesen", Order.Descending}, {"Tarolás", Order.Descending}}),
        #"Sorok csoportosítva" = Table.Group(#"Sorok rendezve", {"Forduló száma", "Mérkőzés száma"}, {{"Mérkőzés", each _, type table [Forduló száma=number, Versenyző sorszám=number, Mérkőzés száma=number, #"Hazai/vendég"=text, Versenyző=text, Csapat=text, #"Teli 1-25"=nullable number, #"Össz 1-50"=nullable number, #"Teli 51-75"=nullable number, #"Össz 51-100"=number, Csere=any]}}),
        #"Egyéni oszlop hozzáadva" = Table.AddColumn(#"Sorok csoportosítva", "Mérkőzés indexszámmal", each Table.AddIndexColumn([Mérkőzés], "Index", 1, 1, Int64.Type)),
        #"Többi oszlop eltávolítva" = Table.SelectColumns(#"Egyéni oszlop hozzáadva",{"Mérkőzés indexszámmal"}),
        Combine = Table.Combine(#"Többi oszlop eltávolítva"[Mérkőzés indexszámmal]),
        #"Feltételes oszlop hozzáadva" = Table.AddColumn(Combine, "Egyéni pont", each if [Index] <= 4 then 1 else 0),
        #"Egyesített lekérdezések" = Table.NestedJoin(#"Feltételes oszlop hozzáadva", {"Versenyző sorszám", "Forduló száma", "Mérkőzés száma"}, Manualis_info, {"Versenyző sorszám", "Forduló száma", "Mérkőzés száma"}, "Manualis_info", JoinKind.LeftOuter),
        Buffer = Table.Buffer(#"Egyesített lekérdezések"),
        #"Kibontott Manualis_info" = Table.ExpandTableColumn(Buffer, "Manualis_info", {"Manuális információ"}, {"Manuális információ"})
    in
        #"Kibontott Manualis_info"

    üdv

  • Mutt

    senior tag

    Kb. 2 hónapja jelentették be, nálam az insider változatban a héten jelent meg, hogy VBA nélkül is ki lehessen emelni az aktív sort/oszlopot. A Nézet menűben Fókuszcella nevet kell keresni. Talán hamarosan több MS365 változatban is meg fog jelenni.

  • Mutt

    senior tag

    válasz andreas49 #53636 üzenetére

    Szia,

    Valószínű hosszú kötőjelek vannak a napok között.
    A kódban a 26-28-as sorokat erre cserélve tudjuk kezelni őket. A többi rész változatlan.

    Case "0" To "9", "-", Chr(150)  'hosszú kötõjel kezelése
    If karakter = Chr(150) Then karakter = "-"
        nap = nap & karakter

  • Mutt

    senior tag

    válasz andreas49 #53631 üzenetére

    Szia,

    Az aktuális munkalapon próbálja meg átalakítani a dátumokat a kijelölt cellákban.

    Sub DatumAlakit()
        Dim adatok As Range, adat As Range
        Dim lapnev As String
        Dim honap As String, nap As String, eredmeny As String
        Dim magyarHonap, angolHonap
        Dim c As Long, karakter As String * 1
            
        angolHonap = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
        magyarHonap = Array("jan#", "feb#", "már#", "ápr#", "máj#", "jún#", "jûl#", "aug#", "szept#", "okt#", "nov#", "dec#")
        lapnev = Trim(ActiveSheet.Name)
        Set adatok = Intersect(ActiveSheet.UsedRange, Selection)
        
        For Each adat In adatok
            nap = ""
            honap = ""
            eredmeny = adat
            
            'csak akkor fusson le ha még nincs évszám
            If InStr(1, adat, lapnev) = 0 Then
                
                'karakternként végigmegyünk a cella tartalmán
                For c = 1 To Len(adat)
                    'ha szám van akkor a nap tömbbe tesszük, ha betû a hónap tömbbe
                    karakter = Mid(adat, c, 1)
                    Select Case UCase(karakter)
                        Case "0" To "9", "-"
                            nap = nap & karakter
                        Case "A" To "Z"
                            honap = honap & karakter
                    End Select
                Next c
                
            End If
            
            'angol hónap nevek magyarra cserélése
            For c = 0 To UBound(angolHonap)
                honap = Replace(honap, angolHonap(c), magyarHonap(c), Compare:=vbTextCompare)
            Next c
            
            'végeredmény összerakása
            Dim honapok, napok
            If Len(honap) > 0 And Len(nap) > 0 Then
            
                honapok = Split(Left(honap, Len(honap) - 1), "#")
                'ha van hónap akkor használjuk
                If IsArray(honapok) Then
                
                    If UBound(honapok) > 0 Then
                        'ha több hónap van, akkor több nap is kell
                        napok = Split(nap, "-")
                    
                        eredmeny = lapnev & ". " & Replace(honapok(0), "#", "") & ". " & napok(0) & " - " _
                                                 & Replace(honapok(1), "#", "") & ". " & napok(1)
                    
                    Else
                        eredmeny = lapnev & ". " & Replace(honapok(0), "#", "") & ". " & nap
                    End If
                
                End If
            End If
            
            'adat.Offset(, 1) = eredmeny        'teszteléshez ezt a sort aktiváld, a következõd kommenteld be
            adat = eredmeny
        Next adat
    End Sub

    Nem tudom, hogy mennyire megy a te adatsorodon. Érdemes előbb egy teszt fájlban kipróbálni.

    üdv

  • Mutt

    senior tag

    válasz ny.janos #53610 üzenetére

    Szia,

    BCTI videója hasznos volt nekem is, a lényegét tudtam eddig Marco Russo-tól, de itt jobban ki lett fejtve.

    ...Van egyáltalán összefüggés az adatmodellbe töltés és a sorbarendezés között?..
    Van. Amikor adatmodell-be teszük az adatokat, akkor egyben a hatákonyság növelése miatt tömörítve lesznek. Az oszlopokat külön-külön tárolja (tabular format) és tömöríti a Vertipaq engine.
    A videóban a tömörítés típusait is elmagyarázzák, de a lényeg az hogy az ismétlődések csak egyszer kerülnek letárolásra és ha sok ismétlődés van akkor nagyot lehet itt nyerni.

    A sorbarendezésre viszont ez a tömörítés károsan fog hatni, mivel elvesztjük az "egyedi értékek" tárolásakor a sorrendet. Ami azért nem gond amikor dolgozunk az adatmodellel, mert a képletek/kapcsolatok nem sorrend szerint dolgoznak hanem tartalom/érték alapján (pl. lényegtelen hogy amikor megszámoljuk vagy összeadjuk az értékeket, akkor azok növekvő vagy csökkenő sorban vannak, az eredmény ígyis-úgyis ugyanaz). A videóban 9:10 körül ugyanezt mondják.

    A videóban az eredeti problémára/kérdésre a megoldás szerintem az, hogy amikor a Vertipaq rendszer újra összerakja a tömörített táblákból az eredményt, akkor azzal a táblával kezd ahol a legkevesebb egyedi érték volt és rakja mellé az egyre több értékeket tartalmazó táblákat. Az ottani példában valószínű a régió (Region) volt a legkevesebb elemű (talán 4 db) , aztán a jön a termék (product) és utánna az állam (state) és így tovább.

    A sorbarendezés termeszetesen fontos dolog nekünk embereknek, így kell és használjuk is, de csak ott ahol van értelme. Vagyis:
    1. a végső eredmény (CSAK Excel munkalapra töltés esete ez, Power BI esetén vizualizációk esetén teljesen felesleges) előállításakor az utolsó lépésben,
    2. olyan köztes lépéseknél amikor fontos a sorrend, pl. egy olyan csoportosítás előtt amikor nem csak összegzünk hanem az összes adatot is beletesszük a csoportosításba és abból mondjuk a legelső sort akarjuk kiemelni/tovább vinni. pl. a fenti videóban ha tudni szeretnénk termékenként az utolsó államot ahol eladtuk azt, akkor ha dátum szerint csökkenő sorba rendezünk, majd termék alapján csoportosítunk akkor a belső táblában az első rekord a legrissebb eladás adatait fogja tartalmazni termékenként.

    Amivel furcsasággal találkozom az hogy adatmodellbe töltéskor nem csak a sorok, de az oszlopok sorrendjét is elveszítem. Céges fájlban van kb. 400 ezer sor és vagy 60 oszlop, de Kimutatás/Pivot kibontásakor mindig ABC sorrendben jönnek az oszlopok.

    üdv

  • Mutt

    senior tag

    válasz KaliJoe #53580 üzenetére

    Szia,

    Tömb képletről van szó, de az újabb Excel verziókban (szerintem 2021es verziótól) már nem kell a Ctrl+Shift+Enter.

    A képletben a {1/2/3/4/5} arra "kényszeríti" az INDEX függvényt, hogy egyszerre több oszlopot adjon vissza (alapból csak 1et fog). Gépeld be a kapcsos zárójelet, de nem kell CSE-t nyomnod. (Ha így is sem megy, akkor azért próbáld ki hogy belül gépeled a kapcsoszárójelet és a végén nyomsz CSEt.)

    Egy hiba van a képletedben, a SOR(INDiREKT után A1 kell, nem A2. Az a rész valójában nem az A-oszlopról és az adatairól szól, hanem egy bevett szokás hogy egyesével növekvő számokat (1, 2, 3 stb) állítsunk elő. Későbbi Excelben erre már a SORSZÁMLISTA függvény van erre. Ha A2-vel indul, akkor az adathalmaz első sorát ki fogod hagyni.

    Még annyi, hogy lehet nem volt szerencsés a második valtozót "Sorok"-nak hívni, amikor van ilyen függvény Excelben. Két helyen írd át mondjuk ""osszsor"-ra.

    Üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53578 üzenetére

    Szia,

    Egyelőre még kevés dolog van Power Queryben, ami korábbi változatokban nem elérhető.
    Ilyenek a fuzzy search, vagy adatok sorokba bontása.

    Ami már problémásabb azok az adat kapcsolatok hiánya egy korábbi Excel verzióban vagy akár ugyanazon verzió Pro és Home veziója között. Bővebben itten.

    üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53569 üzenetére

    Legyen akkor elválasztójel (ha úgy gondolkodunk, hogy a 24 számot osztjuk fel 3 csoportra).

    Felraktam a 2016-os verziómat, és nem ismerte fel a SZÖVEGÖSSZEFŰZÉST frissítés után sem. Rosszul emlékeztem akkor. Én két linket szoktam nézni, ha nem a memóriámra hagyatkozom:
    https://hu.excel-translator.de/fuggveny/
    Excel Microsoft Support Page

    Miért nem lehet üresre "" cserélni (kivágni) azt a karaktert szóköz helyett?
    Ez esetben egybe fognak folyni a számok és nem lehet tudni, hogy ha több mint 24 szám van, akkor hol végződik az első bankszámlaszám és hol kezdődik a következő. Ha csak 1 bankszámlaszám lehet, akkor üres a jobb megoldás.

    Ha vki MS365 Insider-t használ, annak pedig már van REGEXP is függvényben: A képlet: =REGEXKIVONÁS(A1;"\d{8}-?\d{8}-?(\d{8})?";1)

    VBA-ban már régóta lehet REGEXP-et használni, referenciák között engedélyezni kell a "Microsoft VBScript Regular Expressions 5.5" osztályt. Aztán lehet használni:
    Function BankSzamlak(cella As Range, minta As String) As Variant
        Dim regExp As New regExp
        Dim talalat
        Dim eredmeny, c As Long
        
        With regExp
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = minta
        End With
        
        If regExp.Test(cella) Then
            Set talalat = regExp.Execute(cella)
            ReDim eredmeny(talalat.Count - 1)
            
            For c = 0 To UBound(eredmeny)
                eredmeny(c) = talalat(c).Value
            Next c
        Else
            eredmeny = "(nincs adat)"
        End If
        
        BankSzamlak = eredmeny
    End Function

    üdv

  • Mutt

    senior tag

    válasz bela85 #53564 üzenetére

    Szia,

    Jöttek már jó megoldások, én csak pár plusz dolgot, de nem a végeredményt mutatom.

    Excel 2016-ban van SZÖVEGÖSSZEFŰZÉS (TEXTJOIN), amit tudunk használni ahhoz hogy a vegyes adatsorból csak a számokat kinyerjük.

    B2-képlete: =KIMETSZ(SZÖVEGÖSSZEFŰZÉS("";0;HA(SZÁM(--KÖZÉP(A2;SOR(INDIREKT("A1:A"&HOSSZ(A2)));1))+(KÖZÉP(A2;SOR(INDIREKT("A1:A"&HOSSZ(A2)));1)="-");KÖZÉP(A2;SOR(INDIREKT("A1:A"&HOSSZ(A2)));1);" ")))

    A képlet lényege, hogy a cella tartalmán egyesével végigmegy és ahol számot vagy gondolatjelet lát azokat megtartja, a többit szóközre cseréli. A szövegösszefűzés az egészet egybeírja. Mivel lesznek elől, középen és hátul felesleges szóközök ezeket a KIMETSZ-el eltávolítjuk illetve középen pedig egyre csökkentjük.

    Aki MS365-ös verziót használ, annak van már REDUCE függvénye, ami tudja ezt egyszerűsíteni. A képlet C2-ben:
    =KIMETSZ(REDUCE("";SORSZÁMLISTA(HOSSZ(A2));
    LAMBDA(s;c;
    s&HA(SZÁM(--KÖZÉP(A2;c;1))+(KÖZÉP(A2;c;1)="-");KÖZÉP(A2;c;1);" "))))

    üdv

  • Mutt

    senior tag

    válasz ny.janos #53561 üzenetére

    Szia,

    Egy trükk, hogyan tudod a számokat kinyerni egy vegyes adatsorból.

    Az M-kód pedig:
    let
        Forrás = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Added Custom" = Table.AddColumn(Forrás, "Számok", 
        each
            Text.Trim(
                List.Accumulate(Text.ToList([Adat]), 
                "", 
                (s, c) => if Text.Contains("0123456789- ", c) then s & c else s)
            )
        , type text)
    in
        #"Added Custom"

    Ezzel a kódodban kb. 10 lépést (kb. Érték felülírva - Oszlopok eltávolítva3 részt) tudsz megspórolni.

    üdv

  • Mutt

    senior tag

    válasz Fferi50 #53527 üzenetére

    KaliJoe,

    Feladtad a leckét, én is inkább már makrós megoldás (vagy akár Power Query) felé tendálnák.
    Fferi adott makrót, én korábban egy MS365-ös képletet, de most egy Excel 2021-ben is működő(?) képlet jön, csúnya lesz!

    =LET(
    adatok;INDIREKT("A2:E20");
    sorok;SOROK(adatok);
    adatsor;INDEX(adatok;SOR(INDIREKT("A1:A"&sorok));{1/2/3/4/5});
    a;--INDEX(adatsor;0;1);
    b;--INDEX(adatsor;0;2);
    c;--INDEX(adatsor;0;3);
    d;--INDEX(adatsor;0;4);
    e;--INDEX(adatsor;0;5);
    SZUM(((a=H2)+(b=H2)+(c=H2)+(d=H2)+(e=H2))*
    ((a=I2)+(b=I2)+(c=I2)+(d=I2)+(e=I2))*
    ((a=J2)+(b=J2)+(c=J2)+(d=J2)+(e=J2)))
    )

    A K2-es cellában van a képlet, ami húzható lefelé. A LET utáni első változó ("adatok") tartományát neked kell módosítani. Az "adatsor" változó képletének a végén van egy felsorolás ("{1/2/3/4/5}"), ez angol Windows-os gépre telepített Excelben "{1,2,3,4,5}" -re javítandó.

    Hogyan műkődik a képlet?
    Próbálja az Excel 2021-ben még nem létező BYROW függvényt helyettesíteni. A tartomány minden sorát egyesével vizsgálja. A sorban található 5 számot külön változókba teszi (a, b, c stb) és megnézi, hogy ezek vmelyike egyezik-e a H2-ben, majd az I2-ben és a J2-ben lévő számokkal. Ahol van egyezés mindhárom keresett értékkel, ott 1 lesz az eredmény a többinél 0. Ezt minden soron megcsinálja és szummáz a végeredményhez.

    A sortörések a képlet könnyebb olvashatóságát célozzák, nincs egyéb jelentőségük.

    FireSoul/FFeri,

    Köszönöm a segítséget. Ha sorrend számítana, akkor csak makróval tudnám a megoldást elképzelni. A korábbi példámban lustaság miatt nem voltak növekvő sorrendben a számok.

    üdv

  • Mutt

    senior tag

    válasz KaliJoe #53516 üzenetére

    Szia,

    Amikor több öszlopban keresed az értéket (vagyis DARABHATÖBB(A:E;H2) esetén), akkor soronként mindegyik oszlopra van egy eredmény a találatokról (pl. {IGAZ,HAMIS,HAMIS,HAMIS,HAMIS}).

    Ha megadod a többi keresési értékeket, akkor pedig minden keresési értékre szintén visszakapod az oszloponkénti eredményt. Vagyis az 5 oszlop és 3 keresési érték alapján lesz 15 eredmény soronként.

    A függvény ezen mátrixnak a produktumát adja vissza, amely MINDIG 0 lesz ha eltérő értékeket keresel, mert egy cellában egyszerre csak 1 db szám lehet, amely vmelyik keresendő számmal egyezik vagy sem, de egyszerre mindhárom keresendő számmal nem egyezhet.

    Itt egy minta ami talán érthetőbbé teszi mint amit fent írtam:

    Bal oldalon A-E-oszlopok (szürke háttér) ahol keresünk. Sárga amit keresünk.
    Alatta pedig egy eredmény, hogy az A-E oszlop adott sorában megtaláltuk-e a keresendő számot. Ahol 1 ott igen, ahol 0 ott nem volt egyezés (bal oldalt zölddel ezek be is színezve). Ahogy látszik az első sorban a 3-as szám meg van az első oszlopban, a 10-es szám nincs sehol, a 12-es pedig a harmadik oszlopban van. Az első oszlopban van egy találat és kettő hiány, ennek a szorzata 0. A második oszlopban mindenhol 0 van, eredmény 0. A harmadik hasonló mint az első 1 talalát ellen van kettő hiány, megint 0 és így tovább.

    Ami neked kell, hogy mindegyik feltétel 1 találatot adjon vissza (lényegtelen hogy a számot a sor melyik oszlopában találjuk meg, az számít hogy van-e vagy sincs.
    Vagyis az 1,0,0,0,0 helyett 1 vagy a 0,0,0,0,0 helyett egy 0 kell. Ezt SZUM-al lehet megcsinálni. Ezt láthatod lent, narancssárga helyeken már 1 db szám van.

    Neked azon sorok kellenek, ahol soronként mindenhol 1 van. Ezt egy szorzással lehet elérni, a K4-es cella képlete =H4*I4*J4. Majd ezt a K oszlopot összegezve megkapod a végeredményt. Vagy 1 lépésben SZORZATÖSSZEG, amelyet az L4-be látsz és aminek a képlete: =SZORZATÖSSZEG(H4:H7;I4:I7;J4:J7)

    Ha MS365-ön vagy, akkor viszont lehet egyszerűsíteni a BYROW függvénnyel, amely soronként végigmegy az adatokon:

    A képlet: =SZUM(--BYROW(A2:E20;LAMBDA(r;(DARABHA(r;$H$2)+DARABHA(r;$I$2)+DARABHA(r;$J$2))=3)))

    Más:
    Szerintem érdemes lenne a Névkezelőben a INDIREKT("A2:E" & Öhsz;IGAZ) -nak egy nevet adni (pl. adatok) és onnantól már minden képleted egyszerűsíthető.

    üdv

  • Mutt

    senior tag

    válasz KaliJoe #53505 üzenetére

    Szia,

    Nem írtál Excel verziót, de Excel 2021 vagy frissebben vagy, akkor van EGYEDI (UNIQUE) és akár SORBA.RENDEZ (SORT) függvényed.

    Ez esetben =ÖSSZESÍT(14;6;EGYEDI(U20:U85 );{1;2;3}
    vagy =INDEX(SORBA.RENDEZ(EGYEDI(U20:U85);1;-1);{1;2;3})

    MS365 változat esetén pedig TAKE (jelenlegi fordítása ÁTHELYEZ is van):
    =ÁTHELYEZ(SORBA.RENDEZ(EGYEDI(U20:U85);1;-1);3)

    üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53502 üzenetére

    Szia,

    A bug helyes linkje ez.
    A fejlesztői csapathoz továbbkerül a probléma, meglátjuk hogy mikor lesz belőle vmi.
    A korábbi Power Query sorbarendezési problémára még semmit sem mondtak.

    üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53499 üzenetére

    Szia,

    Bugot találtál, bejelentettem itt.

    Az én teoriám az, hogy az S betű egy foglalt szó, amit elsődlegesen az aktuális sort jelenti. Ha átkapcsolsz S1O1 (sor-oszlop) hivatkozásra, akkor a képlet bevitele során egyből kijelöli az aktuális sort. O esetén pedig az oszlopot.

    Excel 2010-ben is megvan a hiba, de annyira kevesen használják ezt a függvényt, hogy te vetted észre egyedül. Korábban T-t használtam, ez esetben pl. HIBÁS(T("USA"))

    VBA-val be lehet vinni a függvényt, és ha más nyelven használjuk akkor ott sincs ezzel gond.

    üdv

  • Mutt

    senior tag

    válasz Peterhappy #53493 üzenetére

    Remek. Féltem, hogy az én mintám egy nagyon egyszerűsített változat és nem biztos hogy egyben lehet átültetni a te példádra, de akkor sikerült.

  • Mutt

    senior tag

    válasz Troy. #53494 üzenetére

    Szia,

    HA(feltétel;1;2) kell akkor neked. A feltétel lehet a korábban megadott ÉS függvény.

    Ha az is jó, hogy az igaz 1 és a hamis 0, akkor tegyél két minuszjelet a használt képlet elé.

    Amivel adós maradtam, hogy miért ad HAMIS eredményt az "IGAZ <= 1,4", ha alapból az igaz értéke 1 és 1 kisebb mint 1,4?
    a) A HAMI/IGAZ egy logikai adattípus, az 1,4 pedig egy szám típus.
    b) Eltérő adattípusokat összehasonlítani nem lehet, ezért HAMIS eredményt ad az Excel.

    Azonban az Excel próbál meg segíteni és amikor műveleteket (szorzás, összeadás stb.) végzünk eltérő adattípusokon akkor megpróbálja őket egységes típussá konvertálni (coerce). Az "IGAZ+0" ezért 1-et fog visszadni.

    üdv

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53492 üzenetére

    Szia,

    Igazad van, magyarban S az N függvény.
    Mivel feltételes formázás képleteként fogjuk használni, így az eredeti cella értékét nem változtatja, az eredeti kérdezőnek pedig segíthet eligazodni a többszáz feltételes formázás között ha használja.

    Azonban az sem lenne gond, ha a szöveges cellában lévő értéket számmá alakítja a nullával való hozzáadás, mert az egyedi számformátumok csak számokon műkődnek, szövegként tárolt számokra nincsenek hatással.

    Pár formátumot felvittem:

    üdv

  • Mutt

    senior tag

    válasz Troy. #53489 üzenetére

    Ha olyan formátumban adod meg, ahogy fent akkor az alábbi történik.
    Balról jobbra haladva próbálja meg értelmezni a képletet.
    1. Előbb a 0,9 <= A1 fut le, eredménye IGAZ.
    2. Ezt az eredményt viszi tovább, vagyis IGAZ <= 1,4 , amire HAMIS az eredmény.

    Megoldás ÉS vagy szorzás használata.
    ÉS(0,9<=A1;A1<=1,4) vagy (0,9<=A1)*(A1<=1,4)

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53479 üzenetére

    Szia,

    Esetleg LET nélkül:
    =N("Nemzetközi DE")+(HOSSZ(A1)=12)*(BAL(A1;2)="49")

    Itt az elején egy kommentet helyeztünk el, hogy a szabály mit akar érvényesíteni.
    A képlet második fele pedig csinálja az ellenőrzést hossz és kezdő karakterek alapján.

    üdv

  • Mutt

    senior tag

    válasz Mutt #53477 üzenetére

    Mivel kicsit zavart ezért itt a javítás.

    Sub FormatNumbers()
        Dim s As Range, sel As Range
        Dim r As Variant
        Dim szinek As Variant
        
        'megadott formátumokat memóriába töltjük
        'ha más a tábla neve akkor a tFormats helyére a helyes kerüljön
        arrFormats = ActiveSheet.ListObjects("tFormats").DataBodyRange.Value
            
        Set sel = Intersect(Selection, ActiveSheet.UsedRange)
        
        If Not sel Is Nothing Then
            
            'kijelölt adatokon végigmegyünk
            For Each s In sel
                r = FindFormat(s.Value)
            
                If IsArray(r) Then
                    'a cél cella formázását levesszük
                    s.ClearFormats
                    
                    'beállítjuk a formátumot
                    s.NumberFormat = r(1)
                    
                    'ha van színezünk
                    If r(2) <> "" Then
                        szinek = Split(r(2), ",")
                        If UBound(szinek) = 2 Then s.Interior.Color = RGB(szinek(0), szinek(1), szinek(2))
                    End If
                    
                End If
            Next s
            
        End If
    End Sub

    Akit érdekel a hibám a "For Each" sorban volt, ahol továbbra is a Selection (a felhasználó által kijelölt tartományt) használtam. Ha egy teljes oszlopot jelöl ki a felhasználó, akkor mind az 1 millió soron próbál végig menni a makró, ami lassú lesz. Ezért van a kódban előtte egy INTERSECT, amit elfelejtettem használni.

    üdv

  • Mutt

    senior tag

    válasz Owlet #53480 üzenetére

    Szia,

    ...munkafüzet online térben közös használattal lesz feltöltve... ez a részt mit jelent? Sharepoint/OneDrive vagy a shared folder?

    A weben (Sharepoint/OneDrive) a VBA nem műkődik, helyette van az Office Script (csak olyan munkahelyi licensz esetén ahol ezt az admin engedélyezte). Office Scriptben nincs lehetőség aktuális felhasználó beazonosítására, amit ki lehet próbálni hogy felugró ablakban bekérni a felhasználót és azzal tovább menni.

    Ha shared folderben van a fájl, akkor műkődik a VBA, de nagy az esély ilyenkor az adatvesztésre/hibás fájlra.

    Alternatív lehetőségek:
    1) Esetleg amit lehetne tenni, hogy mindenkinek külön fájlja van és Power Query-vel egyesíteni lehet őket.
    2) Microsoft Forms használata (ha van licensz).
    3) Harmadik opció ha mindegyik felhasználó tud emailt küldeni, akkor küldhetnek egy emailt (pl. elég ha a tárgyba beleteszik honnan dolgoznak, a többi jön a feladóból és email dátumából). Ezt lehet Power Query-vel vagy azonnal Power Automate-el összesíteni egy fájlba (utóbbi megint licensztől függ).

    üdv

  • Mutt

    senior tag

    válasz Mutt #53477 üzenetére

    Egy kis hibát látok a makróban. Egész oszlopon nem javasolt futtatni. Ha kell majd javítom.

  • Mutt

    senior tag

    válasz KaliJoe #53475 üzenetére

    Szia,

    Az én megoldásom azon alapszik, hogy van egy táblázat amely tartalmaz pár adatot ami alapján meg lehet találni, hogy melyik formátumot kell használni.
    Mutatom.

    Jobb oldalt van a táblázat, amiben a telefonszám első pár karaktere van megadva (lehet dzsóker karaktert - kérdőjel most csak - is használni). Aztán van hossz is, hogy az altípusokat meg lehessen különböztetni (biztosra mentem és tartományt lehet megadni).
    Majd jön a kívánt számformátum, itt követni kell az Excel speciális számformátum szabályait. Meg lehet adni, hogy milyen háttérszíne legyen a cellának (három szám 0-255 között, vesszővel felsorolva a vörös-zöld-kék alapszínekhez). A komment pedig segít eligazodni a káoszban.

    A táblázatban fontos a sorrend. Ha több lehetőség is van akkor is az első találatot fogja használni a makró.

    Ezek után a makró:

    Option Explicit
    Dim arrFormats

    Sub FormatNumbers()
        Dim s As Range
        Dim r As Variant
        Dim szinek As Variant
        
        'megadott formátumokat memóriába töltjük
        'ha más a tábla neve akkor a tFormats helyére a helyes kerüljön
        arrFormats = ActiveSheet.ListObjects("tFormats").DataBodyRange.Value
            
        Set s = Intersect(Selection, ActiveSheet.UsedRange)
        
        If Not s Is Nothing Then
            
            'kijelölt adatokon végigmegyünk
            For Each s In Selection
                r = FindFormat(s.Value)
            
                If IsArray(r) Then
                    'a cél cella formázását levesszük
                  s.ClearFormats
                    
                    'beállítjuk a formátumot
                  s.NumberFormat = r(1)
                    
                    'ha van színezünk
                    If r(2) <> "" Then
                        szinek = Split(r(2), ",")
                      If UBound(szinek) = 2 Then s.Interior.Color = RGB(szinek(0), szinek(1), szinek(2))
                    End If
                    
                End If
            Next s
            
        End If
    End Sub
    Function FindFormat(p As String) As Variant
        Dim i As Long
        Dim pFormat(1 To 2)     'formátum és színkód
        Dim pKezdo As String
        Dim pHossz As Long
        
        pHossz = Len(p)
        FindFormat = ""
        
        If pHossz = 0 Then Exit Function
        
      'végigmegyünk a létező formátumokon
        For i = 1 To UBound(arrFormats)
            pKezdo = ""
            
            'hossz alapján keresünk egyezést
            If arrFormats(i, 2) >= pHossz And arrFormats(i, 3) <= pHossz Then
                
                pKezdo = arrFormats(i, 1)
                
                'kezdõ karakterek alapján keresünk egyezést
                If Left(p, Len(pKezdo)) Like pKezdo Then
                    
                    'ha van egyezés akkor elmentjük és kilépünk a ciklusból
                    pFormat(1) = arrFormats(i, 4)
                    pFormat(2) = arrFormats(i, 5)
                    FindFormat = pFormat
                    Exit For

                End If
                
            End If
        Next i
        
    End Function

    Csak a kijelölt cellák formátumát változtatja meg! Vagyis előbb jelöljük ki a cellákat/oszlopokat és utána futassuk (Alt+F8-at nyomva vagy egy gombot kitéve).

  • Mutt

    senior tag

    válasz Fire/SOUL/CD #53469 üzenetére

    Szia,

    Nem hinném, hogy valaha is lehet majd direktben hivatkozni tömb elemeire a frontendben. INDEX-et lehet addig is használni.

    Üdv

  • Mutt

    senior tag

    válasz andreas49 #53462 üzenetére

    Szia,

    Itt az én megoldásom MS365-ös függvényekkel, segédoszlop nélkül. Feltételeztem hogy csökkenő sorrend érdekel, ha nem akkor a -1-eket a rendezésben 1-re kell cserélni.

    C2-nek a képlete (tördelés csak a könnyebb olvashatóság miatt):
    =LET(
    adat;INDIREKT("A2:B7");
    lista;RENDEZÉS.ALAP.SZERINT(adat;INDEX(adat;0;1);-1;INDEX(adat;0;2);-1);
    XHOL.VAN(A2&"-"&B2;INDEX(lista;0;1)&"-"&INDEX(lista;0;2)))

    Egy másik változat pedig SZŰRŐ-t használva (ez van a D-oszlopban):
    =LET(
    adat;INDIREKT("A2:B7");
    lista;VÍZSZ.HALMOZÁS(RENDEZÉS.ALAP.SZERINT(adat;INDEX(adat;0;1);-1;INDEX(adat;0;2);-1);SORSZÁMLISTA(SOROK(adat)));
    a;INDEX(lista;0;1);
    b;INDEX(lista;0;2);
    c;INDEX(lista;0;3);
    SZŰRŐ(c;(a=A2)*(b=B2)))

    Mindkét esetben a LET utáni első változó deklaráció azért van, hogy csak ott kelljen változtatnod a tartományt.

    üdv

  • Mutt

    senior tag

    válasz Peterhappy #53456 üzenetére

    Szia,

    Nem kell plusz dolog, csak Excel 2010 vagy frissebb, amiben van Power Pivot (PP).

    1. Amikor Kimutatást (Pivotot) készítesz, akkor pipáld be az "Adatmodellbe töltés" opciót.

    2. Kezdőknek az egyszerűbb - de nem hatékonyabb megoldás - pedig hogy az adatmodellben létrehozunk egy új mezőt, ahova berakjuk a megfelelő előjelet. Ehhez aktiválni kell a Power Pivot menüt, amit a Fejlesztő/Developer fülön a COM Addins alatt lehet megtenni.
    Ezek után a Power Pivot menüben a Kezelés/Manage gombra kattintva feljön az PP szerkesztő. Az utolsó, "Add Column" oszlopot kijelölve és felette a szerkesztőlécben megadhatjuk az alábbi képletet (a mintám szerint ha "kiadás" van a típus oszlopban akkor -1-el szorozzuk meg az Érték oszlopban található számot): =if(Range[Típus]="kiadás";-1;1)*Range[Érték]

    Az oszlop fejlécére kattintva adhatsz nevet az oszlopnak.
    Ha így viszed be a képletet: eredmény:=if(Range[Típus]="kiadás";-1;1)*Range[Érték], akkor a kettőspont előtti elnevezést kapja az oszlop. Bezárhatod a PP szerkesztő ablakot és visszajutsz az Excelbe.

    3. Ezek után a kimutatásban használd az új oszlopot az érték mezőben.

    A hatékonyabb, de nehezebben érthető megoldás egy új érték/measure hozzáadása az adatmodellhez. A PP a DAX nyelvet használja, ami angol függvényeket használ. Egy részük hasonlít az Excel függvényekhez, de többnyire máshogy működnek.

    Lépések a profi megoldáshoz:
    1. Ugyanaz mint a fenti 1-es.
    2. Ha akarod aktiváld a Power Pivot menűt, mint ahogy fent említettem. Nem kötelező.
    3. Kezd el összerakni a kimutatást, de kimutatás mezőknél jobb klikk a táblázaton (mintámban Range a neve) és válaszd az "Érték hozzáadása/Add measure" opciót. (Ha van már Power Pivot menüd, akkor azon belül a második gomb a "Measure", amivel ugyanezt lehet csinálni.

    Az ablakot vhogy így töltsd ki:

    Én az "eredmény" nevet adtam neki, a képlete ez (ha kell magyarázat szólj):
    =SUM(Range[Érték])-2*CALCULATE(SUM(Range[Érték]);Range[Típus]="kiadás")
    Alul beállítottam hogy Ft-ként tizedesek nélkül írja ki automatikusan.

    4. Ezt az új értéket, húzd be a kimutatás értékrészébe.

    Készen vagyunk.
    A Power Pivot mindkét esetben automatikusan használni fogja a képletet az új adatokon.

    Ps.
    A két megoldás között a különbség, hogy az első minden sor esetén lefuttatja a képletet (az adatok betöltésekor) és létrehoz egy új oszlopot. Ez lassítja a betöltést és több memóriát foglal. Észrevenni a mai gépeken milliós sorok esetén lehet csak. A második egy explicit függvény, ami csak a pivotban látható adatsorokon fut le (pl. ha együtt vannak a tavalyi és idei mozgások, de a pivotban szűrtél az ideiévre akkor csak 2024-es adatoknál számol a képlet).

  • Mutt

    senior tag

    válasz 3DFan #53451 üzenetére

    Szia,

    Alt+F11-re bejön a makró szerkesztő. Bal oldalon ki kell választanod a füzetedet, majd az Insert | Module menüpontokkal új modult kapsz, ami a bal oldalon látszik, és ki van jelölve. A jobb oldali nagy üres mezőbe kell bemásolni a fórumon kapott makrót. Visszalépve a füzetbe az Alt+F8 előhoz egy párbeszéd ablakot, itt tudod kiválasztani és indítani a makrót.

    Az indítás előtt hozzlétre egy Summary nevű lapot a munkafüzetben.
    Futtatás után amikor mentesz, akkor fel fog dobni egy üzenetet, hogy makróbarátként célszerű menteni különben elveszik a makró. Érdemes nem makróbarátként menteni, mert nem kell neked folyamatosan ez a makró.

    A fenti lépéseket mindkét fájlon külön-külön kell megtenned és utána a két fájl Summary lapját tudod összehasonlítani.

    üdv

  • Mutt

    senior tag

    válasz eszgé100 #53449 üzenetére

    Szia,

    Tudnál egy mintát mutatni, hogy miből mit kéne varázsolni?

    A FILTER vagy AGGREGATE függvénnyel tudunk azonos találatok közül szelektálni, de kevés a fenti infó.

    Pl. ez a lapon lévő utolsó sorból ad vissza eredményt a feltételek szerint: =LET(r,FILTER([dateTime],([SerialNumber]=[@SerialNumber])*ISNUMBER(SEARCH([boltID],"PROGRAMNAME"))),INDEX(r,COUNT(r)))

  • Mutt

    senior tag

    válasz ReSeTer #53438 üzenetére

    Szia,

    32-bites Officet telepítsetek. Nem fogod hátrányát észrevenni, de ha nagyon kell akkor van Large Address Aware patch ami tud segíteni hogy a 32-bites programok 2GB-nál több memóriát lássanak/használjanak 64-bites környezetben.

    Ha szükséges a jelszavas kód megtekintése, akkor van rá megoldás.
    Excel off the grid megmutatja őket, van kész letölthető fájlja is ami segít neked.

    üdv

  • Mutt

    senior tag

    válasz föccer #53441 üzenetére

    Szia,

    A képletben 2 helyen van pontosvessző még, cseréld le sima vesszőre őket.

    Mégha nagy adatsorod is van érdemes lenne memóriába (egy tömbbe) tölteni és azzal dolgozni, majd ha kell (form bezárásakor legkésőbb) kiiírni a munkalapra.

    üdv

  • Mutt

    senior tag

    válasz föccer #53439 üzenetére

    Szia,

    Formula2 tulajdonságot használd mostantól. Az új függvények csak ott támogatottak.

    Üdv

  • Mutt

    senior tag

    válasz modflow #53394 üzenetére

    Szia,

    Itt egy VBA kód amivel egy "Summary" elnevezésű lapra ki tudod íratni, hogy a munkafüzet lapjain milyen képletek találhatóak. Ha lefuttatod mindkét fájlon, akkor össze tudod hasonlítani a listákat.

    Sub ListCellswithFormulas()
        Dim ws As Worksheet
        Dim rngFormulas As Range
        Dim wsReport As Worksheet
        Dim a As Long, c As Long
        Dim out As Long
        
        Set wsReport = ThisWorkbook.Worksheets("Summary")
       
        out = 2
        
        With wsReport
            .Range("A1") = "Lap"
            .Range("B1") = "Cella"
            .Range("C1") = "Képlet"
        
            For Each ws In ThisWorkbook.Worksheets
                On Error Resume Next
                Set rngFormulas = ws.Cells.SpecialCells(xlCellTypeFormulas, 23)
                On Error GoTo 0
        
                If Not rngFormulas Is Nothing Then
                    For a = 1 To rngFormulas.Areas.Count
                        For c = 1 To rngFormulas.Areas(a).Count
                            .Cells(out, "A") = ws.Name
                            .Cells(out, "B") = rngFormulas.Areas(a).Item(c).Address
                            .Cells(out, "C") = "'" & rngFormulas.Areas(a).Item(c).Formula2
                            out = out + 1
                        Next c
                    Next a
                    
                    Set rngFormulas = Nothing
                End If
            Next ws
        End With
    End Sub

    üdv

  • Mutt

    senior tag

    válasz szürke #53393 üzenetére

    Szia,

    Power Query elsődleges célja adatok (akár külső forrásból, mint pl. weblap vagy egy adatbazis) átalakítása és feldolgozása. Excel 2016-tól az Excel része, Excel 2010/2013-hoz külön tölthető le.

    Érdemes Youtube-on videokat nézni róla, ha még nem ismered.
    Mike Girvin (excelisfun) csatornáját tudom javasolni.

    Linkeltem korábban:
    52669
    52723

    üdv

  • Mutt

    senior tag

    válasz #77257183 #53400 üzenetére

    Szia,

    Itt az én makrós változatom.

    Option Explicit
    Dim fibonacci(1000) As Variant  'megtalált fibonacci számok listája

    Sub Valaszt()
        Dim c As Long
        Dim r As Double
        Dim pozicio As Long
        'Rnd() függvénynek kell, különben nem lesz igazán véletlenszám
        Randomize
            
        '1-es poziciótól indulunk
        pozicio = 1
            
        With ActiveSheet
            'fejléc a füzetre
            .Range("A1") = "Lépés"
            .Range("B1") = "Pozíció"
            .Range("C1") = "Véletlen szám"
            .Range("D1") = "Fibonacci szám"
            
            '100 lépéses ciklus
            For c = 1 To 100
                r = Rnd()
        
                'fel-le lépkedünk a listában
                If r < 0.5 Then
                    pozicio = pozicio + 1
                Else
                    If pozicio > 2 Then
                        pozicio = pozicio - 2
                    Else
                        pozicio = 1
                    End If
                End If
            
            'kiírtajuk a kapott eredeményeket
            .Cells(c + 1, "A") = c
            .Cells(c + 1, "B") = pozicio
            .Cells(c + 1, "C") = r
            .Cells(c + 1, "D") = FibonacciNum(pozicio)
            
            Next c
        End With
    End Sub
    'rekurzív fibonacci szám generátor
    Function FibonacciNum(n As Long)
        
        If Not IsEmpty(fibonacci(n)) Then
            FibonacciNum = fibonacci(n)
            Exit Function
        End If
        
        If n = 0 Then
            FibonacciNum = 0
            fibonacci(0) = 0
            Exit Function
        End If
        
        If n = 1 Then
            FibonacciNum = 1
            fibonacci(1) = 1
            Exit Function
        End If
        
        FibonacciNum = FibonacciNum(n - 1) + FibonacciNum(n - 2)
        fibonacci(n) = FibonacciNum
    End Function

    üdv

  • Mutt

    senior tag

    válasz szürke #53373 üzenetére

    Szia,

    Delila adott egy makrót, ami az előfordulásokat listázza az összegzés munkalapra.
    Hasonlót lehet Power Query-vel is csinálni, de vannak megkötések:
    1. Előbb mented kell a fájlt, a nem mentett adatokat nem fogja látni (kivétel ha a fájlban táblázatokban vannak az adatok).
    2. A lekérdezést kézzel kell frissíteni (lehet automatikus frissítést is beállítani adott percenként).
    3. Nem fog szinezni, csak a listát adja vissza.

    A teljes M-kód:
    let
        Forrás = Excel.Workbook(File.Contents("C:\Users\szila\OneDrive\Desktop\53373.xlsm"), null, true),
        #"Sorok szűrve" = Table.SelectRows(Forrás, each [Kind] = "Sheet" and [Item] <> "Összegzés"),
        #"Egyéni oszlop hozzáadva" = Table.AddColumn(#"Sorok szűrve", "Adatok", each Table.AddIndexColumn([Data], "Sor", 1, 1)),
        #"Többi oszlop eltávolítva" = Table.SelectColumns(#"Egyéni oszlop hozzáadva",{"Name", "Adatok"}),
        Fejlécek = Table.ColumnNames(Table.Combine(#"Többi oszlop eltávolítva"[Adatok])),
        ÚjFejlécek = List.Transform(Fejlécek, each Text.Replace(_, "Column", "")),
        #"Kibontott Adatok" = Table.ExpandTableColumn(#"Többi oszlop eltávolítva", "Adatok", Fejlécek, ÚjFejlécek),
        #"Oszlopok egyesítve" = Table.CombineColumns(Table.TransformColumnTypes(#"Kibontott Adatok", {{"Sor", type text}}, "hu-HU"),{"Name", "Sor"},Combiner.CombineTextByDelimiter(":Sor", QuoteStyle.None),"CellaID"),
        #"Többi oszlop elemi értékekre bontva" = Table.UnpivotOtherColumns(#"Oszlopok egyesítve", {"CellaID"}, "Oszlop", "Érték"),
        #"Egyéni oszlop hozzáadva2" = Table.AddColumn(#"Többi oszlop elemi értékekre bontva", "FormázottÉrték", each try Text.Lower(Text.Clean(Text.Trim([Érték]))) otherwise [Érték]),
        #"Oszlopok egyesítve1" = Table.CombineColumns(#"Egyéni oszlop hozzáadva2",{"CellaID", "Oszlop"},Combiner.CombineTextByDelimiter(":Oszlop", QuoteStyle.None),"Cella"),
        #"Sorok csoportosítva" = Table.Group(#"Oszlopok egyesítve1", {"FormázottÉrték"}, {{"Előfordulás", each Table.RowCount(_), Int64.Type}, {"Adatok", each _, type table [Cella=text, Érték=text]}}),
        #"Sorok rendezve" = Table.Sort(#"Sorok csoportosítva",{{"Előfordulás", Order.Descending}}),
        #"Egyéni oszlop hozzáadva1" = Table.AddColumn(#"Sorok rendezve", "Hely", each Text.Combine([Adatok][Cella], ", "), type text)
    in
        #"Egyéni oszlop hozzáadva1"

    Ahol a fájl elérhetőségét a Forrás sorban meg kell adnod. Legegyszerűbb a PQ szerkesztőben a Kezdőlap -> Adatforrás beállításai alatt.

    A kis és nagybetűket azonosnak vettem, ha ez nem kell akkor a "Sorok csoportosítva" sorban a "FormázottÉrtéket" cseréld le "Érték"-re.

    üdv

  • Mutt

    senior tag

    válasz Traxx #53385 üzenetére

    Szia,

    Többiek válasza mellett itt az én változatom:
    =HA(B3="Igen";"A";HA(C3="Igen";"B";"OK"))
    =HAELSŐIGAZ(B3="Igen";"A";C3="Igen";"B";1;"OK")

    üdv

  • Mutt

    senior tag

    válasz BullZeye #53368 üzenetére

    Szia,

    Hogy tanuljuk/szokjuk az új függvényeket, MS365-ben ezt is lehet használni:
    =MAKEARRAY(;KEREK.FEL(A2/1000;0);LAMBDA(r;c;MIN(1000;A2-(c-1)*1000)))


    Üdv

  • Mutt

    senior tag

    válasz PistiSan #53358 üzenetére

    Szia,

    "...1000-es számoknál egy szóköz kerüljön be..."
    Power Query-ben nincs formázás, csak adattípusokat tudsz megadni. Amint betöltötted Excelbe ott tudod a formázást beállítani. Ha nagyon kell "számformátum", akkor szöveggé alakítva lehet formázni.
    pl.
    Number.ToText(23234, "N2", "hu-HU")

    üdv

  • Mutt

    senior tag

    válasz alfa20 #53339 üzenetére

    Szia,

    Ha még aktuális, akkor itt vannak az én tippeim (KOCKA függvényben kezdő vagyok).
    1. Power Query-ben amikor a kapcsolati betöltést választod, akkor legyen bepipálva az adatmodellhez hozzáadás.
    2. Power Pivot fülön hozz létre egy mértéket (measure-t).

    3. A képleted: =KOCKA.ÉRTÉK("ThisWorkbookDataModel";"[Measures].[result]";"[tbGfk].[GFK].&["&A2&"]")

    üdv

  • Mutt

    senior tag

    válasz tgumis #53275 üzenetére

    Szia,

    Az én változatom, ami Excel 2016-tól megy, ötvözi a korábban kapott két megoldást (A1-ben van az input):

    =SZÖVEGÖSSZEFŰZÉS("",IGAZ,HAHIBA(KÖZÉP("tuvwxyz{|}",KÖZÉP(A1,SOR(INDIREKT("A1:A"&HOSSZ(A1))),1)+1,1)," "))

    üdv

  • Mutt

    senior tag

    válasz Mutt #53255 üzenetére

    A megadott válasz nem jó, így inkább csak demóként egy új függvényről érdemes megnézni.

  • Mutt

    senior tag

    válasz gycs02 #53251 üzenetére

    Szia,

    Az én válaszom csak kb. 1 év múlva lesz hasznos, de azért bedobom most.
    Az Excel tesztverziókban (insider változat) jópár újabb függvény van bevezetés/ismertetés alatt. Az egyik ilyen a PIVOTBY (magyarul KIMUTATÁS.ALAP.SZERINT), amellyel függvénnyel állítható elő egy kimutatás.

    Alapból egy ilyet fog létrehozni:

    Ebben a képletben 4. paraméter (fent a DARAB2) a számítási függvény saját képletekkel is helyettesíthető. Az eredeti kérésben egy 1-est szeretnél látni, ezt egy saját képlettel el lehet érni: LAMBDA(a;ELŐJEL(DARAB2(a)))


    Nekünk csak az első és harmadik oszlopra van szükségünk, amelyet a CHOOSECOLS (magyarul OSZLOPVÁLASZTÁS) függvénnyel lehet megtenni.
    A végső képlet: =OSZLOPVÁLASZTÁS(KIMUTATÁS.ALAP.SZERINT(C1:C12;D1:D12;D1:D12;LAMBDA(a;ELŐJEL(DARAB2(a)));0;0;1);1;3)

    üdv

  • Mutt

    senior tag

    válasz ny.janos #53237 üzenetére

    Szia,

    Tegnap küldtem hibajelentést a Microsoftnak, hogy Excel Power Query-ben nem műkődik jól a sorbarendezés ékezetes betűk esetén. Meglátjuk, hogy mikor lesz belőle vmi.

    Amivel próbálkoztam és háthat segítség neked:
    1. Power BI Desktop-ban jó a rendezés, M-kód teljesen azonos. Pár perc alatt megvagy ott vele.
    2. Ha átmenetileg lecseréljük az ékezetes betűket az ékezetesmentes változatukkal és úgy rendezünk, akkor jobb eredményünk lesz, de ez sem tökéletes.
    Ezt simán a GUI-val is meg lehet csinálni többlépéssel, de itt egy list-et tartalmazó változat.

    Van két segédlistám, ABCIn és ABCOut tartalmazza az ékezetes betüket és azok ékezetmentes változatát. Az M-kódjuk:
    = {"á", "é", "í", "ó", "ö", "ő", "ú", "ü", "ű"}
    = {"a", "e", "i", "o", "o", "o", "u", "u", "u"}

    Az Excel lapról jön a lista, amihez egy új oszlopot adtam amelynek a képlete:
    =Text.Combine(
        List.Transform(Text.ToList(Text.Lower([Nevek])), 
        each try ABCOut{List.PositionOf(ABCIn, _)} otherwise _)
      )

    A képlet legelőször kisbetűsre alakítja az eredeti szöveget, majd betűnként felszabdalva listába teszi. Ezen a listán végigmegyünk és ott ahol ékezetes betűt találunk lecseréljük a megfelelőre, a többi értéket nem változtatjuk. A végén az egészet összefűzzük.

    Az új oszlop alapján sorbarendezünk, utána törölhető az oszlop.

    A teljes M-kód:
    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Added Custom" = Table.AddColumn(Source, "Sorrendhez", each Text.Combine(
        List.Transform(Text.ToList(Text.Lower([Nevek])), 
        each try ABCOut{List.PositionOf(ABCIn, _)} otherwise _)
      )
    ),
        #"Sorted Rows" = Table.Sort(#"Added Custom",{{"Sorrendhez", Order.Ascending}}),
        #"Removed Columns" = Table.RemoveColumns(#"Sorted Rows",{"Sorrendhez"})
    in
      #"Removed Columns"


    üdv

  • Mutt

    senior tag

    válasz detroitrw #53229 üzenetére

    Szia,

    Ha nem néztem el vmit akkor ez műkődhet:

    =INDEX('C T'!$A$1:$CQ$775;1;HOL.VAN(20;INDEX('C T'!$A$1:$CQ$775;HOL.VAN($B$1;'C T'!$A$1:$A$775;0);0);1))

    Ha MS365-ön vagy, akkor ez esetleg:

    =INDEX('C T'!$A$1:$CQ$775;1;HOL.VAN(20;SZŰRŐ('C T'!$A$1:$CQ$775;'C T'!$A$1:$A$775=$B$1);1))

    üdv

  • Mutt

    senior tag

    válasz ablutor #53210 üzenetére

    Szia,

    Nézegess Youtube-on videokat kimutatás/pivot készítésről (pl. ezek közül) és percek alatt át tudod alakítani a könyvlistát lemezlistára.

    Ahogy már említettük a kimutatás a listád fejlécét használja azonosítóknak (ezért nem is lehet azonos névvel több oszlop ugyanazon a lapon a kimutatáshoz). Ha átírod, akkor egy pivot frissítés után új mezőnek fogja az Excel értelmezni és csak annyi a dolgod hogy a tervezőben a megfelelő helyre (valószínű a sorok/rows részbe) kell húznod.

    Ha gond lenne küldd el nekünk magánba a fájlt és "rendbe" tesszük.

    üdv

  • Mutt

    senior tag

    válasz repvez #53212 üzenetére

    Szia,

    Powermap-et a Fejlesztő (Developers) fülön a COM Add-in alatt tudot aktiválni, de az elmúlt 2 évben az Excelben a térkép funkciók egyre rosszabbak.

    Javasolnám inkább helyette az ingyenes Power BI Desktop-ot (https://www.microsoft.com/en-us/power-platform/products/power-bi/desktop).

    üdv

  • Mutt

    senior tag

    válasz Yutani #53162 üzenetére

    Szia,

    Jól sejtem hogy kimutatást/összegzést akarsz csinálni a különböző cégekre és csak az adatokat akarod behúzni könnyedé, hogy a kész formulák kiadják az eredményt?

    Ha igen, akkor szerintem próbáljuk meg Power Query-vel megoldani, ha a fájlok felépítése hasonló.
    Két lekérdezést tudok most elképzelni:
    1. Mappából a lehetséges fájlnevek kilistázása.
    2. A kiválasztott fájlon adatátalakítás szükség szerint.

    üdv

  • Mutt

    senior tag

    válasz ablutor #53156 üzenetére

    Szia,

    Ha tudsz mutatni 1-2 képet a mostani fájlról, főleg az első munkalapról (ott van a struktrúra) és egy másikról (ott szerintem csak Pivotok/Kimutatások vannak) az tudna segíteni nekünk.

    Érzésem szerint van az első munkalapon egy Excel táblád (valószínű színes rácsos, amin ha álsz akkor a Table design menűsorban tudsz más színűvé tenni). És a többi munkalap pedig kimutatásokat tartalmaz (pl. évszám szerint rendezve az adatokat vagy egy másikon szerzők szerint rendezve).

    Ez esetben ami gondot okoz, hogy az első munkalapon lévő oszlopoknevek (többnyire az elsősor tartalma) kulcsok, amik alapján tud dolgozni a Pivot. Ha átírod, akkor egy refresh során azon oszlopok amelyek neve megváltozott elfognak a kimutatásból tünni (rosszabb esetben a frissítés hibával leáll). A megoldás fapados:
    ezeket a pivotokat újra le kell gyártani, de kb. a második után már rutin lesz ha nézed közben az eredeti/működő változatot.

    Javaslatok. Legyen egy backup a működő fájlról. Kezd el módosítani az első munkalapon az oszlopok nevét, adj hozzá/törölj ha kell. Legyen minden oszlopban vmilyen adat (nem kell minden sorban, csak legyen minta majd). Menj a következő lapra kattints bele az egyik Pivotba, fent a menűsor végén lesz két új elem (Pivot és Pivot Design talán). Az elsőben van a vége felé hogy bekapcsolhasd, hogy milyen mezőkkel dolgozik a Pivot.
    (Vagy akár használhatod a makrót a https://www.contextures.com/excel-vba-pivot-table-field-list.html#allptpf oldalról.)

    Ha nyomsz egy frissítést, akkor el fognak a rows/columns/values esetleg filter részből tűnni az átnevezett oszlopok. Egyszerűen csak fentről húzd be az újabb névvel őket.

    Nézzük meg ezzel mire jutunk.

    üdv

  • Mutt

    senior tag

    válasz gborisz #53158 üzenetére

    Szia,

    Megnéztem a fájlt és csak egy apró probléma van vele. A harmadik lépés nem az előtte lévőre, hanem a legelsőre (a Forrás nevűre) hivatkozik, ahol még nem történt meg típuskonverzió.

    Csak annyit kell csinálnod, hogy a szerkesztőlécben a Table.RenameColumns utáni "Forrás"-t, ami az első lépés neve lecseréled a másodikkal. Mivel annak a nevében van szóköz, ezért hashtaggel (#) kell kezdened és utána zárójelekben megadnod a lépés nevét, vagyis #"Típus módosítva" kell.

    A Power Query makrószerűen dolgozik, az egymás után megadott lépéseket hajtja végre. Általában az újabb lépés bemenete az előző kimenete. Alapból minden függvény első paramétere az előző lépés neve, de itt lehetséges hogy nem mindig az előző lépés eredményét használjuk fel a következőben.

    Tipikus példa szokott lenni amikor sok adat esetén a Table.Buffer-el memóriába tesszük az eredmény táblát és késöbbi lépésekben erre hivatkozunk vissza.

    Egy másik fontos tudnivaló inkább csak az M-kódban látszik, ami
    let -el kezdődik (kivével ha UDF-et csináltunk) és in-el végződik. Az in után megadott lépés neve lesz az eredmény, amely nem kötelező hogy az utolsó lépésé legyen. (Perverz módon meglehet adni az első, többnyire Forrás/Source nevű lépést is.)
    Ez többnyire teszteléskor/fejlesztéskor hasznos, amikor a további átalakítások bizonytalanok. Ha vki ilyenben gondolkodik, akkor jobb megoldás a lekérdezés duplikálása hivatkozással (reference), ami az eredeti lekérdezés eredményéből indul ki.

    üdv

  • Mutt

    senior tag

    válasz eszgé100 #53148 üzenetére

    Szia

    Az M-kód rendben van. Érdemes lenne inkább a legvégére tenned a sorbarendezést, mert join-kibontás után is változhat a sorrend.

    üdv

  • Mutt

    senior tag

    válasz eszgé100 #53146 üzenetére

    Szia,

    ...egyiket kovetve sem jartam sikerrel.
    Mi történik a te esetedben? M-kódot tudod mutatni az első queryhez, ami az eredeti forrásfájlból dolgozik?

    Mindegyik video ugyanazt magyarázza el, vagyis hogy:
    1. egy query-vel elkészíted a kommentek nélküli változatot, amit betöltesz egy munkalapra.
    2. hozzáadod a szükséges oszlopokat a frissen betöltött táblázathoz, majd ezt a táblázatot is betöltöd Power Query-be és kijösz Power Query-ből úgy hogy ezt csak kapcsolatként (Close and load -> Only create connection) töltöd be
    3. Visszamész Power Query editorba és az eredeti lekérdezésben állva összefűződ (Home -> Merge Queries) azt a másodikkal (amiben van a komment és csak kapcsolatként él).
    4. Kibontod az új oszlopokat az összefűzés után.
    5. Close and Load-al visszamész Excelbe, ahol duplán lesznek az új oszlopok. Tőrlőd a végéről a duplikáltakat.

    A videokról egy kis észrevétel:
    1. Egyik sem hangsúlyozza igazán de kell egy kulcs mező ami alapján meg lehet találni a két helyen az azonos sorokat. Mindegyik esetben van egy ID oszlop, de PQ esetén akár több oszlop is használható elsődleges kulcsként.
    2. A második videót kerüld, addig amíg M-kód közvetlen szerkesztésében nem vagy jártas.
    3. A harmadikban szereplő oktató megbízható (mindhárom video helyes megoldást ad ettől függetlenül).

    Amit lehetne finomítani - főleg ha nagy adatsorod van - hogy a második query csak a kulcsmezőket és a kommenteket tartalmazza, minden egyéb adat csak a memóriát eszi feleslegesen, de ez minimális dolog.

    üdv

  • Mutt

    senior tag

    válasz Owlet #53134 üzenetére

    Szia,

    Neked kell sorba rendezni a dátumokat, erre van több megoldás is. A QuickSort elég gyors nagyobb adatsoron is.

    Én még annyit kavartam, hogy ha előfordulnának ismétlődő szabad dátumok, akkor azt egy collection-el előbb kiszűrtem.

    Private Sub FillDates2()
    Dim ws As Worksheet
    Dim cell As Range
    Dim greenColor As Long
    greenColor = RGB(0, 204, 102)

    Set ws = ThisWorkbook.Sheets("2025")

    Dim datumokColl As New Collection 'collection esetén csak egyedi értékek maradnak meg
    Dim datumokArr() 'majd ebbe a tömbbe másoljuk át a kapott értékeket
    Dim c As Long

    On Error Resume Next 'collection leáll ha duplikáció van, így átugorjuk ezt
    For Each cell In ws.UsedRange
    If cell.Interior.Color = greenColor And IsDate(cell.Value) Then
    datumokColl.Add cell.Value, CStr(cell.Value)
    End If
    Next cell
    On Error GoTo 0

    'ha van szabad dátum akkor lehet tovább menni
    If datumokColl.Count > 0 Then

    'a szabad dátumokat egy tömbbe kell másolni, létrehozzuk a megfelelõ méretû tömböt
    ReDim datumokArr(1 To datumokColl.Count)

    'átmásoljuk a collection tartalmát a tömbbe
    For c = 1 To datumokColl.Count
    datumokArr(c) = datumokColl(c)
    Next c

    'növekvõ sorba rendezzük a dátumokat
    Call QuickSort(datumokArr, 1, datumokColl.Count)

    'comboxhoz adjuk a dátumokat
    For c = 1 To UBound(datumokArr)
    Me.ErkezesiDatum.AddItem Format(datumokArr(c), "yyyy.mm.dd")
    Me.TavozasiDatum.AddItem Format(datumokArr(c), "yyyy.mm.dd")
    Next c

    End If

    End Sub

    'https://stackoverflow.com/questions/152319/vba-array-sort-function
    Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
    Dim pivot As Variant
    Dim tmpSwap As Variant
    Dim tmpLow As Long
    Dim tmpHi As Long

    tmpLow = inLow
    tmpHi = inHi

    pivot = vArray((inLow + inHi) \ 2)

    While (tmpLow <= tmpHi)
    While (vArray(tmpLow) < pivot And tmpLow < inHi)
    tmpLow = tmpLow + 1
    Wend

    While (pivot < vArray(tmpHi) And tmpHi > inLow)
    tmpHi = tmpHi - 1
    Wend

    If (tmpLow <= tmpHi) Then
    tmpSwap = vArray(tmpLow)
    vArray(tmpLow) = vArray(tmpHi)
    vArray(tmpHi) = tmpSwap
    tmpLow = tmpLow + 1
    tmpHi = tmpHi - 1
    End If
    Wend

    If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
    If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
    End Sub

    üdv

  • Mutt

    senior tag

    válasz gborisz #53123 üzenetére

    Szia,

    Az adatsorod tizedespontot használ, miközben magyar Excel-t használsz, ahol tizedesvessző van, ezért szövegnek maradnak a számok.

    Egyik megoldás a nyelvterület megadása a második lépésben. A zárójel elé írd be ezt: , "en-US"

    Ha ez nem megy (túl régi az Exceled), akkor egy lépés kell a típus módosítás elé, ahol a tizedespontot vesszőre cseréljük. Jobb oldalt a Forrást kijelölöd, majd a 3 oszlopot ahol a törtszámok vannak, majd Kezdőlapon az értékek lecserélése (angolban Home -> Replace values) ablakban a pontot vesszőre cseréled.
    Ezek után a típusot már a nyelvterület nélkül rendben fogja megismerni a PQ.

    üdv

  • Mutt

    senior tag

    válasz gborisz #53117 üzenetére

    Szia,

    Power Query-hez az M-kód ennyi:
    let
    Forrás = Csv.Document(File.Contents("D:\a.txt"),[Delimiter="#(tab)", Columns=4, Encoding=1250, QuoteStyle=QuoteStyle.None]),
    #"Típus módosítva" = Table.TransformColumnTypes(Forrás,{{"Column1", Int64.Type}, {"Column2", type number}, {"Column3", type number}, {"Column4", type number}}),
    #"Oszlopok átnevezve" = Table.RenameColumns(#"Típus módosítva",{{"Column1", "Pontszám"}, {"Column2", "Koord1"}, {"Column3", "Koord2"}, {"Column4", "Magasság"}})
    in
    #"Oszlopok átnevezve"

    Az első sorban látható hogy a D: meghajtóról olvassa be az a.txt-t ezt kell átirni a kódban (újabb PQ változatokban ezt máshogy is lehet módosítani.

    A munkafüzetben egy új lapot hoz létre az adatokkal (esetemben az új lap neve "a"), amiket az INDEX függvénnyel lehet a végső munkalap celláiba írni.

    A2-ben a képlet: =INDEX(a!$A:$A;SOR())
    C2-ben =INDEX(a!$B:$B;SOR())
    és igy tovább.

    A 12-es sortól pedig jönnek a lehetséges többi adatok.
    A12-ben a képlet: =HA(SOR()-6>DARAB2(a!$A:$A);"";INDEX(a!$A:$A;SOR()-6))
    Itt figyeljük, hogy van-e a másik lapon még adat és az elcsúszott sorszámot is módosítjuk.
    A képletek lemásoljuk az első száz sorig és meg is van.

    Ha van új adat, akkor az a.txt fájlt felülírjuk és a Power Query menüben található frissítést megnyomjuk.

    üdv

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

Hirdetés