Keresés

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

  • Mutt

    senior tag

    válasz #50548 üzenetére

    Szia,

    Feri kódja nem nézi, hogy az ellenőrzés után van-e újabb timestamp. Nem tudom, hogy ez a valós adaton gondot okoz-e vagy sem. Ahhoz hogy helyben cserélhesd az adatokat másik makró kell, amit billentyűparanccsal vagy külön gombbal tudsz indítani. Vigyázz mert nem lehet visszavonni a makró módosításait!

    Sub ellenor2()
    Dim rngAdatok As Range
    Dim adat As Range, adatSzoveg As String
    Dim posEllenorzes As Long, posHatar As Long, posKovetkezoHatar As Long

    Const ell = "ellenőrzés", hatar = "|"

    Set rngAdatok = Selection.CurrentRegion 'kijelölt cellát tartalmazó tartomány használata

    For Each adat In rngAdatok
    posEllenorzes = InStr(1, adat, ell)

    adatSzoveg = ""

    'ha van benne "ellenőrzés" szöveg akkor nézzük át
    If posEllenorzes > 0 Then
    posHatar = InStrRev(adat, hatar, posEllenorzes) 'ellenőrzes előtti határjel helye
    posKovetkezoHatar = InStr(posHatar + 1, adat, hatar) 'ellenőrzés utáni első határjel helye
    If posKovetkezoHatar > posEllenorzes Then
    adatSzoveg = Mid(adat, posHatar, posKovetkezoHatar - posHatar - 1)
    End If
    End If

    adat = adatSzoveg
    Next adat

    End Sub

    Power Query (PQ)-ben pedig több lépéses a dolog.
    Az én mintám így néz ki:

    Bal oldalt az adatsor, jobb oldalt pedig egy munkafázis ahol lehet módosítani hogy mire keressen.
    1. Első lépésként mindkét táblát betöltöm PQ-be. A jobb oldalinak adtam egy ilyen nevet "tblMunkafazis".
    2. Megkeressük hogy van-e "ellenőrzés" az adatsorban. Ehhez egy új oszlopot szúrunk be, neve nálam "Ellenorzes". A képlete pedig:
    =Text.PositionOf([Adatok], tblMunkafazis[Munkafázis]{0})
    3. Az ehhez tartozó pipe-ot is megkeressük. Az oszlop neve: "Határ", képlete:
    =Text.PositionOf(Text.Start([Adatok],[Ellenorzes]),"|",Occurrence.Last)
    4. Az ezutáni pipe helyének a képlete:
    =Text.PositionOf(Text.Middle([Adatok],[Hatar]+1),"|")+[Hatar]
    5. Minket csak azok érdekelnek ahol van ellenőrzés szöveg és ahol a két pipe eltér. Új oszlopba pedig kirakjuk az eredeti szöveg pipeok közötti részét. A képlet:
    =if [Ellenorzes]>0 and [Kovetkezo hatar] > [Hatar] then Text.Middle([Adatok],[Hatar],[Kovetkezo hatar]-[Hatar]-1) else null
    6. Azok a sorok ahol null van nem kellenek és a többi oszlopot is eltávolítjuk.
    7. Eredményt Excel-be visszatöltjük.

    A teljes M-kód:
    let
    Forrás = Excel.CurrentWorkbook(){[Name="Táblázat1"]}[Content],
    #"Típus módosítva" = Table.TransformColumnTypes(Forrás,{{"Adatok", type text}}),
    #"Egyéni oszlop hozzáadva" = Table.AddColumn(#"Típus módosítva", "Ellenorzes", each Text.PositionOf([Adatok], tblMunkafazis[Munkafázis]{0}), Int64.Type),
    #"Egyéni oszlop hozzáadva1" = Table.AddColumn(#"Egyéni oszlop hozzáadva", "Hatar", each Text.PositionOf(Text.Start([Adatok],[Ellenorzes]),"|",Occurrence.Last), Int64.Type
    ),
    #"Egyéni oszlop hozzáadva2" = Table.AddColumn(#"Egyéni oszlop hozzáadva1", "Kovetkezo hatar", each Text.PositionOf(Text.Middle([Adatok],[Hatar]+1),"|")+[Hatar], Int64.Type),
    #"Egyéni oszlop hozzáadva3" = Table.AddColumn(#"Egyéni oszlop hozzáadva2", "Eredmeny", each if [Ellenorzes]>0 and [Kovetkezo hatar] > [Hatar] then Text.Middle([Adatok],[Hatar],[Kovetkezo hatar]-[Hatar]-1) else null, type text),
    #"Sorok szűrve" = Table.SelectRows(#"Egyéni oszlop hozzáadva3", each ([Eredmeny] <> null)),
    #"Többi oszlop eltávolítva" = Table.SelectColumns(#"Sorok szűrve",{"Eredmeny"})
    in
    #"Többi oszlop eltávolítva"

    üdv

    A tanácsaimat ingyen adom. Ha nem tetszik, akkor kérlek ne kritizáld! / https://github.com/viszi/codes/tree/master/Excel

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