Telefonszámunk: 1-472-0679

[Resolved] Cellákban lévő karakterek kezelése, másolása

Kezdőlap Fórumok Excel programozás [Resolved] Cellákban lévő karakterek kezelése, másolása

Topic Resolution: Resolved
23 bejegyzés megtekintése - 1-23 / 23
  • Szerző
    Bejegyzés
  • #9500
    norbifun
    Felhasználó

      Sziasztok
      Kezdőként kérnék segítséget.
      Cellákba írt szöveggel szeretnék manipulálni, de nem igazán találom a megfelelő megoldást.
      Pl egy cella tartalma: 241319,-421,535329
      Ennek a valós értelmét szeretném külön cellákban, külön oszlopokban szerepeltetni. a valós értékek 241319 241421 535329
      Azaz a kötőjel helyén , mindig az előtte lévő számsor első 3 karaktere szerepel.
      Van erre valami ötlet? egyáltalán van megoldás ilyen karakterkezelésre?
      Válaszokat előre is köszönöm!

      #9501
      horvimi
      Adminisztrátor

        Szia!

        Pár kérdés:
        – Milyen Excel verziót használsz?
        – Az egyes részek mindig ugyanannyi karakter hosszúak-e?
        – Jól értem, hogy az egész eredetileg 1 cellában van, és ezt te 3 cellába szeretnéd?
        – Tudnál feltölteni mintát, ami több adatot tartalmaz, de valós, vagy ahhoz közeli?

        Sokszor járunk úgy, hogy egyszerűsített adatot és kérdést kapunk, dolgozunk vele, majd kiderül, hogy nem is az a feladat valójában, ami a kérdésben szerepelt.

        Feltételezve, hogy 1 cellában van és 3 cellát szeretnél, de nem fix a részek hossza, de a szabály az, amit írtál én ezt csinálnám:
        1. Vessző mentén szétbontanám 3 oszlopra (Pl. szövegből oszlopok / Text2Columns paranccsal), esetleg a 356-ös Excel erre való függvényével úgy, hogy mindegyik szöveges maradjon
        2. Kivenném a kötőjelet a középső elejéről (HELYETTE / SUBSTITUTE függvény)
        3. A középső elejéhez fűzném az első elejét (BAL/LEFT és összefűzés & jellel)

        A válaszok és minta után konkrét megoldás is születhet.

        Imre

        #9502
        norbifun
        Felhasználó

          Szia
          Köszi a választ
          MIcrosoft 365 -öt használok.
          Általában igen, 6 számjegyből álló karakterek vannak benne, ha nem akkor van a kötőjel
          Jól érted, egy cellában van. Ezt kell nekem kibontanom, és egy másik munkafüzeten elhelyezni 3 különböző cellában

          Töltök fel most mintát.

          A megoldás jó lehet, de mellette rengeteg művelet van, így biztosan csak a makró lehet megoldás.
          A táblázat maga 44 ezer sor, amivel dolgozom. 🙁
          A feladat az, hogy a második lapfül M oszlopában lévő adatok, az első lapfül c,d,e,f oszlopába kerüljön. mindegyik egy helyre. Azért a négy oszlop, mert ha négy adat van mindegyiknek legyen helye.
          Ha lehet akkor azzal is bonyolítanám, hogy csak az esetben, ha esetleg egyezőség van a behelyezendő adat és a meglevő adat között, akkor ne csináljon semmit, ha nincs akkor az első üres oszlopba helyezze be az adatot
          Köszönettel

          #9503
          norbifun
          Felhasználó

            Nem sikerült a feltöltés, még egyszer

            Attachments:
            You must be logged in to view attached files.
            #9505
            horvimi
            Adminisztrátor

              Makrós fájlt csak ZIP formátumban lehet feltölteni.
              Megint bebizonyosodott, hogy csak egy részfeladatra érkezett a kérdés.
              Abban a bizonyos M oszlopban feldolgozhatóság szerint nem konzisztens adatok vannak.

              211853+263018       A + jel micsoda, Elválasztó? C és D oszlopokba kerülnének?
              236321 236332       Ugyanez a kérdés a szóközre
              240543/240544       Itt meg a slash-re
              241003,263018       Nahát, itt meg egy vessző van!
              241735 + 241737     Még jobb, a szóköz-pluszjel-szóköz
              241861,-879,240475  Végül itt az eredeti kérdés mintája, megint vesszővel

              Így meglehetősen problémás, ezt valahogy egységesíteni kellene, vagy minden létező esetet és a hozzá tartozó szabályt megadni.
              Most az jutott eszembe, hogy lehetne csinálni egy kis segédtáblát, ahová felsorolod egymás alatti cellákba az összes lehetséges elválasztójelet, és képlettel vagy makróval minden elválasztót vesszőre cserélni. Ezután már egységesen lehetne tovább haladni, s szétdobni annyi oszlopra, amennyi vessző van benne.

              Imre

              #9508
              norbifun
              Felhasználó

                Szia
                A karaktereknek nincs semmi tudományos értékük, az nem jelentenek sem ÉS -t , VAGY-t, nincs logikai tartalmuk.

                Én is pontosan ebbe az irányba indultam el. Az alábbi szösszenettel:

                Sub UtódcikkszámokMeghatározásaAzÚjListában()
                ‘ mivel először a számokat ésszerű allpotba kell hozni, így szöveggé kell formázni az oszlopot
                Sheets(„Új betöltendő árlista”).Select
                Range(„M2”).Select
                Range(Selection, Selection.End(xlDown)).Select
                Selection.NumberFormat = „@”
                ‘Változók felvétele
                ‘melyik sorban keresünk
                Dim i As Long
                i = 2
                ‘milyen karaktert keresünk (k1=+;k2=szóköz;k3=/)
                Dim k1 As String
                k1 = „+”
                Dim k2 As String
                k2 = ” ”
                Dim k3 As String
                k3 = „/”
                ‘mire akarjuk cserélni (+ helyett vessző (v); szóközhelyett semmi(s); / helyett vessző(v))
                Dim v As String
                v = „,”
                Dim s As String
                s = „”

                ‘ a kötőjel helyére irandó karakterlánc
                Dim cikkszameleje As String

                Sheets(„Új betöltendő árlista”).Select
                Do Until Sheets(„Új betöltendő árlista”).Cells(i, 1) = „”

                If Cells(i, 13) <> „” Then
                cikkszameleje = Left(Cells(i, 13), 3)
                Cells(i, 13).Value = Replace(Cells(i, 13), „-„, cikkszameleje, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), k1, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), k3, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), k2, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), „OD.”, v, 1)

                Cells(i, 13).Value = Replace(Cells(i, 13), „,,,,,,,,”, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), „,,,,,,,”, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), „,,,,,,”, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), „,,,,,”, v, 1)
                Cells(i, 13).Value = Replaccele(Cells(i, 13), „,,,,”, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), „,,,”, v, 1)
                Cells(i, 13).Value = Replace(Cells(i, 13), „,,”, v, 1)

                End If
                i = i + 1
                Loop

                End Sub

                Rendben is lenne , ha a formátumok is egyeznének, de az sem egyezik.
                Szóval a szöveggé formázok minden adatot az adott oszlopban , akkor helyreáll a rend, és megkapom a listát.
                Most már „csak” szét kell szedni és a megfelelő cellába másolni.

                Illetve lefuttatva a makrót, az a tapasztalat hogy nagyon sokáig tart(18 percig ment a 44 ezer soron végig)
                Arra gondoltam, ha először egy szűrést csinálnék, akkor kihagyhatnám az üres sorokat.
                Abban tudnátok segíteni, hogy ha leszűröm, akkor hogy tudom neki megadni a sorokat meghatározó változót, hogy csak a leszűrt sorokban lévő cellát ellenőrizze?

                #9509
                norbifun
                Felhasználó

                  Az alapfeladatot sikerült megoldanom! csak a gyorsaságon kellene javítani!!!

                  #9510
                  delila
                  Felhasználó

                    Szia!

                    Nálam a felülírandó adatok a B oszlopban vannak, segédoszlopként a C-t használom – amit a végén törlök.
                    55.000 sorral 12 másodperc alatt végzett.

                    Sub Csere()
                        Dim usor As Long, ido As Date
                        ido = Now
                        usor = Range("B" & Rows.Count).End(xlUp).Row
                        
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],""\"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],""/"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],"" "","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],""_"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],""-"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],"",,,,,,,,"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],"",,,"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        Range("C1:C" & usor).FormulaR1C1 = "=SUBSTITUTE(RC[-1],"",,"","","")"
                        Range("C1:C" & usor).Copy
                        Range("B1").PasteSpecial xlPasteValues
                        
                        Columns(3).Delete
                        MsgBox Format(Now - ido, "mm:ss")
                    End Sub

                    Delila

                    #9511
                    horvimi
                    Adminisztrátor

                      Delila megoldása újabb gyönyörű példája a brute force cellánkénti loopolás és az oszlopkba egy lépésben illesztett képletek sebesség különbségére.
                      Minden munkalap interakció (olvasás, de főleg az írás) lassú. Ez 44e soron már elég jól látszik.

                      És ezen még tovább lehetne finomítani a 365 új függvényeivel, de ha így jó neked Norbi, akkor íme egy lehetséges megoldás.
                      Én az „M” oszlopra írtam volna egy univerzális formulát, aminek az erdménye vessszővel tagolt szövegrészek, amit szétdobtam volna például TEXTSPLIT függvénnyel, ami 365-ös.
                      Még ciklus sem kell hozzá.

                      Imre

                      #9513
                      norbifun
                      Felhasználó

                        Szia

                        Nagyon szépen köszönöm, ez tényleg sokkal gyorsabb.

                        Nekem egy bajom van, hogy mindent szreetk megérteni 🙂
                        Az úgy nem működne, ha nem kell plusz oszlopot létrehozni, és replace -el függvénnyel megy?
                        Gondolataim alapján mennie kellene, csak nem tudom hogy lehet a range -el megadni azt, hogy ugyanaz a cella a végállomás…

                        KÖszi

                        • A hozzászólás módosításra került: 1 year, 2 months telt el-norbifun.
                        #9515
                        delila
                        Felhasználó

                          Igazad van, gyorsabb a REPLACE függvénnyel.

                          Sub CsereBere()
                              Dim ido As Date
                              
                              usor = Range("M" & Rows.Count).End(xlUp).Row
                              
                              Range("M1:M" & usor).Replace What:=",,,,,,,,", Replacement:=","
                              Range("M1:M" & usor).Replace What:=",,,", Replacement:=","
                              Range("M1:M" & usor).Replace What:=",,", Replacement:=","
                              Range("M1:M" & usor).Replace What:="_", Replacement:=","
                              Range("M1:M" & usor).Replace What:="-", Replacement:=","
                              Range("M1:M" & usor).Replace What:="\", Replacement:=","
                              Range("M1:M" & usor).Replace What:="/", Replacement:=","
                              Range("M1:M" & usor).Replace What:=" ", Replacement:=","
                              MsgBox Format(Now - ido, "mm:ss")
                          End Sub
                          #9517
                          norbifun
                          Felhasználó

                            nagyon köszönöm!!!
                            Még egy kérdés. Ebben az esetben a műveletek sorrendje nem releváns a programozás tekintetében?
                            Mindeg ymilyen sorrendben írom, ugyanazt az eredményt adja?
                            Ha nem a válasz, akkor most miért került fordított sorrendben meghatározásra?

                            Köszi

                            #9518
                            delila
                            Felhasználó

                              Csak az fontos, hogy a több vessző törlése előbb legyen, mint a kevesebbé. Érthető lesz, ha végig gondolod a logikáját.

                              #9519
                              norbifun
                              Felhasználó

                                Az világos, hogy a több vesszőt korábban kell.
                                Abban van nekem a zavar, hogy az egyéb karaktereket utóbb cseréli , és ebből keletkezhet a több vessző. (már ha van sorrend)

                                #9520
                                delila
                                Felhasználó

                                  Igazad lehet. Megeshet, hogy például „\,” szerepel némelyik cellában. Az összes adat ismeretében meg kell találnod a helyes sorrendet.

                                  #9525
                                  norbifun
                                  Felhasználó

                                    Sziasztok

                                    Most ott járok, hogy a vesszőt _ -ra cseréltem. A vessző sok helyen elkavarta a formátumot, még akkor is, ha előtte külön szöveggé formáztam a teljes oszlopot. Azt nem értem ugyan hogy miért, az eredeti-cellánként vizsgálóban ezt ez esetben nem tette meg.

                                    De így működik az M oszlop karaktercseréje.
                                    TexttoColumns -al szétdobtam külön oszlopokba. Ettől mondjuk jobb lenne egy elegánsabb megoldás… pl az első része a cikkszámsornak az eredeti oszlopban marad, a második megy a következő (vagy egyéb kijelölt oszlopba- sorba – cellába)oszlopba, a harmadik még újabba

                                    Egy lépés maradt hátra , és azzal megakadtam
                                    Vannak azok a cellák, ahol kötőjel szerepel a cikkszámban. Ez azt jelenti, hogy az ugyanabban a cellában szerepelő, előtte lévő cikkszám első három karakterét kell behelyettesíteni a . És itt nem igazán boldogulok. Tudtok ebben nekem segíteni?

                                    Egyenlőre én most itt járok a gondolkodásban:
                                    Sub CsereBere()
                                    Dim ido As Date

                                    usor = Range(„M” & Rows.Count).End(xlUp).Row
                                    Range(„M1:M” & usor).Select
                                    Selection.NumberFormat = „@”

                                    Dim cikkszameleje As String
                                    cikkszameleje = Left(ActiveCell, 3)

                                    Range(„M1:M” & usor).Replace What:=”-„, Replacement:=cikkszameleje
                                    Range(„M1:M” & usor).Replace What:=”_”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”+”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”\”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”/”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=” „, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”OD.”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”,”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”________”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”_______”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”______”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”_____”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”____”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”___”, Replacement:=”_”
                                    Range(„M1:M” & usor).Replace What:=”__”, Replacement:=”_”
                                    Range(„M1:M” & usor).TextToColumns Destination:=Range(„o1″), other:=True, Otherchar:=”_”

                                    MsgBox Format(Now – ido, „mm:ss”)
                                    End Sub

                                    #9526
                                    horvimi
                                    Adminisztrátor

                                      Én már nem követem a folyamatot, elvagytok nélkülem is 🙂
                                      De tennék bele inputot.
                                      Ha jól értem, az egyes részek az M oszlopban alulvonással vannak most elválasztva.
                                      Ha jól értem, bármelyik részben lehet kötőjel.
                                      Elég lényeges kérdés, hogy több részben is lehet kötőjel, és akkor többször kell a helyettesítést megcsinálni?
                                      Remélem az első tagban nem lehet 🙂

                                      Ha ez igaz, akkor alaposan el kell gondolkodni a dolgon, hogy el lehet-e kerülni a soronkénti feldolgozást, ami a kezdeti sebesség problémát okozta, azaz valami oszlop formula. Vagy az egészet memóriatöbmbbe kell tenni, ott feldolgozni, és visszaírni.

                                      Másik lehetőség, hogy előbb oszlopokra bontod, és a kapott 4(?) oszlop mellé ugyanannyi kalkulált oszlopot csinálsz, ami megvizsgálja, hogy tartalmaz-e kötőjelet, és ha igen, megcsinálja a cserét. Ebből talán 3 is elég lehet, ha kijelenthető, hogy az első oszlopban nem lehet kötőjel.

                                      A kapott oszlopokat végül átmásolod értékként az előző lapra, a helyére, utána takarítasz.
                                      A „TextToColumns” helyett ajánlom figyelmedbe az O365 „SZÖVEGFELOSZTÁS” (TEXTSPLIT) függvényét, ami az egész M oszlopot az alulvonás mentén oszlopokra bont. Például.:
                                      =SZÖVEGFELOSZTÁS(M2;"_")
                                      Ezt beírva (makróval) az M oszlop után valahová, mondjuk O2-be, kapsz egy oszlopokra bontott tömböt az M2 celláról
                                      Ha az egész oszlopba akarod betenni (44e sor?), akkor előbb ki kell jelölni, és utána betenni a formulát. Javaslom felvenni, mert a tömbképletek formula makrója kicsit eltér a hagyományos formuláktól. Nekem ez lett:
                                      Selection.Formula2R1C1 = "=TEXTSPLIT(RC[-1],""_"")"
                                      A Formula2 a lényeg.
                                      Különben pedig, ha a TextToColumns már működik, akkor ezzel nem biztos, hogy kell szenvedni.

                                      Végül ezen tömb után lehet megcsinálni a kötőjelek cseréjét formulával oszloponként.
                                      Nekem 3 oszlopot csinált a szétbontás a te mintád alapján, ezért az első szabad oszlopom az R lett.
                                      R2-be írtam a képletet, ami a feltételes cserét csinálja.
                                      =HA(BAL(P2;1)="-";HELYETTE(P2;"-";BAL(O2;3)))
                                      Megnézi, hogy a szétbontott oszlopok közül a másodikban van-e kötőjel, és ha igen, akkor a kötőjelet kicseréli az előző oszlop első 3 karakterére.
                                      Mivel relatív címeket használ, ezt elég jobbra lemásolni annyiszor, ahányszor ezt akarod, és előállnak a megjavított oszlopok.

                                      Imre

                                      #9527
                                      norbifun
                                      Felhasználó

                                        szia

                                        köszönöm!
                                        A textsplit működik.
                                        Abban viszont kérnék segítséget, hogy a formula az mit takar pontosan? vagy a formula?

                                        Az uccsó bejegyzést is makróban kell megírnom. Soronként okés , azzal nincs bajom.
                                        De tömbösítve?
                                        Egy kicsit magas még ez nekem…
                                        tudok tömbösítve is ha függvényt megadni neki?
                                        hogy tudok ugyanarra a cellára hivatkozni? RC ? RC[0]? Activecell? nekem valahoyg egyiksem akar működni.
                                        Ez ugy eakkor kellene , amikor abban a cellában szeretném a műveletek elvégezni.
                                        Nem egyzserű nekem ez a tömbösítéses gondolkodás… 🙁

                                        #9528
                                        horvimi
                                        Adminisztrátor

                                          A textsplit-et most felejtsd el, ha már van működő TextToColumns, csak érdekességként írtam.
                                          A formula kérdésedet nem igazán értem, de sejtem.

                                          Ha képletet akarunk makróval írni egy oszlopba, akkor két lehetőség van:
                                          Egyik, hogy beírod a z első cellába, és utána dupla klikkel a sarkán, lemásolod az aljáig.
                                          Ha ezt felveszed makró rögzítővel, kapsz egy eredményt.

                                          Másik, hogy az oszlopot előre kijelölöd, és abba teszed be a képletet (formulát)
                                          Ebbe az esetben elég azt csinálni, hogy csak a képletet veszed fel. Ha beírtad, rögtön megállítod a rögzítőt.
                                          Ha ENTER-rel zártad le a beírást, akkor valami ilyesmi lesz:
                                          Sub valami
                                          Activecell.FORMULAR1C1 = „=és itt lesz a képlet R1C1 formátumban, angol függvénynevekkel”
                                          End Sub

                                          Konkrétan, a te esetedre:
                                          1. A TextTo Colomns az „O” oszloptól megcsinálja a bontást, ami ha jól emlékszem 4 oszlop, tehát O-P-Q-R
                                          2. Tehát az S oszlopba kell a képlet, amit megadtam (Ha….), ami lekezeli a kötőlejes tételeket
                                          3. Próbáld ki!
                                          4. Ha működik, akkor vedd fel rögzítővel: Jelöld ki az S2 cellát, írd bele a képletet, ENTER
                                          5. a felvett kódot alakítsd át, hogy az egész oszlopra megcsinálja:
                                          `Range(„S2:S” & usor).formulaR1C1 = amit felvett
                                          Range(„S2:S” & usor).formula = Range(„S2:S” & usor).value ‘értékké alakítás`
                                          6. Próbáld ki!
                                          7. Ha működik, akkor másolással megcsinálhatod a többi oszlopra (T, U, V oszlopok?)
                                          8. a 4 oszlopot átmásolhatod az első lapra.

                                          Imre

                                          #9529
                                          norbifun
                                          Felhasználó

                                            Köszönöm
                                            Ez így működik
                                            csak az a problémám, hogy folyamatosan új oszlopokat nyitok.
                                            Nincs arra valami megoldás, hogy a p oszlopban, ha talál kötőjelet azt cserélje le az o első 3 karakterére?
                                            Azért az egyszerűbb , mint oszlopot nyitni, eltüntetni.. stb
                                            Bár lehet tévedek… okoskodom, de megcsinálni nem tudom :-)))

                                            A formula-ra vonatkozó kérdés:
                                            mit jelent ez pontosan?
                                            mi a különbség formulaR1C1 és formula2R1C1 között?

                                            függvényben, RC pozicióval lehet megadni valahogy aktív cellát?

                                            #9530
                                            horvimi
                                            Adminisztrátor

                                              Én azért vetettem fel ezt a megoldást, mert sokkal gyorsabb, mint ha soronként iterálsz végig 44 ezerszer.
                                              Tehát Excel szinten oldom meg a problémát, de makróval írom meg a képletet.
                                              A FORMULAR1C1 egy Excel képletet ír a kijelölésbe.
                                              He azt érted, akkor nem kérdezhetsz olyat, hogy hivatkozhat-e saját magára (pl. RC), mert Excelben ilyen nincs (körkörös hivatkozás)
                                              Én megadtam neked azt a képletet, ami pont azt csinálja, amit most újra megkérdeztél:
                                              „Nincs arra valami megoldás, hogy a p oszlopban, ha talál kötőjelet azt cserélje le az o első 3 karakterére?”
                                              =HA(BAL(P2;1)="-";HELYETTE(P2;"-";BAL(O2;3)))
                                              Ha az a probléma, hogy makró közben új segédoszlopok keletkeznek, akkor másképp kel megoldanod.
                                              Én azt javasoltam, hogy az oszlopokra bontás után:
                                              1. Az első oszlop gondolom változatlan marad
                                              2. A második-harmadik-negyedik lehet potenciálisan olyan, hogy kötőjellel kezdődik, ezért erre a 3 oszlopra csinálsz 3 ilyen IF-es számítást 3 újabb oszlopba. (javaslom értékké alakítani
                                              3. Az első, változatlan és az utolsó 3 oszlopot átmásolod az első lapra, a helyére
                                              4. Kitakarítod az átmeneti oszlopokat.

                                              A jelenlegi tudásoddal ezt meg tudod csinálni szerintem.
                                              Ha ez nem felel meg, vagy meg akarsz küzdeni egy programozás szempontjából nagyobb kihívással, akkor memóriatömböket kell használnod.
                                              1. Eszerint az eredeti M oszlopot beolvasod egy tömbbe, majd egy ciklusban szétdobod 4 külön tömbbe
                                              2. a 4 külön tömböt feldolgozod egyesével és átalakítod vagy sem a tételeit az ismert szabályok szerint
                                              3. A 4 tömböt visszaírod az első lapra, a helyére.

                                              Ha nem foglalkoztál még tömbökkel, szerintem ez nagy kihívás elsőre.

                                              A FORMULA2R1C1 akkor van, amikor a rögzítővel nem egyszerű képletet, hanem tömbképletet veszel fel.
                                              Ez jelen esetben most nem releváns.

                                              Ha érdekel, nézz utána a tömböknek, tömbfüggvényeknek, tömbképleteknek az Excelben.

                                              Nem ugyanaz, mint a VBA memóriatömbök, de hasonló.

                                              Ha megoldást akarsz, és az a prioritás, akkor azzal főzz, amid már megvan.
                                              Ha tanulni akarsz, akkor menj a nehezebb irányba.

                                              Imre

                                              #9531
                                              delila
                                              Felhasználó

                                                Azt hiszem, addig már eljutottál, hogy az M oszlopban vannak az adatok, amik számjegyeket, és max 1 db kötőjelet tartalmaznak. Az L oszlopban azok az adatok vannak, amiknek az első 3 karakterét kell a kötőjelek helyére tenni az M-ben.
                                                A lenti makró az O oszlopba ír egy képletet, ami létrehozza az általad kívánt eredményt. Ezt értékként beilleszti az M oszlopra, az ideiglenes O oszlopot törli.

                                                Sub Segedoszlop_O()
                                                    Range("O2:O15").FormulaR1C1 = _
                                                        "=IFERROR(LEFT(RC[-2],SEARCH(""-"",RC[-2])-1)&LEFT(RC[-3],3)&RIGHT(RC[-2],LEN(RC[-2])-SEARCH(""-"",RC[-2])),RC[-2])"
                                                    Columns(15).Copy
                                                    Range("M1").PasteSpecial xlPasteValues
                                                    Columns(15).Delete
                                                End Sub
                                                #9593
                                                norbifun
                                                Felhasználó

                                                  Sziasztok

                                                  Bocsi, kicsit eltüntem, más irányba szólított a kötelesség.
                                                  Ennek megfelelően a tömbképletekkel sem foglalkoztam.

                                                  Ma ültem neki megint.
                                                  Szeretnék tanulni, tehát a legoptimálisabb megoldások megértése lenne a cél.
                                                  De velahoyg ezek az oszlopra vonatkozó dolgok nem akarnak összeállni a fejemben. Illetve nem vágom hogy az active cellák hogy működnek ilyen esetben.
                                                  De ezt majd később.

                                                  Most kipróbáltam ezzel a segédoszlopos megoldással. Sajnos ez azt az eredményt hozza, hogy ahol nincs a cellában semmi, azt 0 ként jeleníti meg.ez egy elég zavaró dolog. Próbáltam , hogy ha 0 az értéke akkor törölje, de nem tudom összerakni.

                                                  Illetve elő jött még egy variáció.
                                                  Az eredeti listában előfordulhat olyan, hogy a számok az alábbiak alapján vannak megadva
                                                  241875,819,240434
                                                  Ebben azt látni, hogy nincs kötőjel a középső számsornál, pedig kellene lennie…

                                                  Arra gondoltam, hogy amikor lemegy a text to column (azért maradok ennél, mert nekem 365 van, de más gépeken, ahol ezt használni fogják sok esetben régebbi verzió él), akkor megvizsgálnám, hogy hány karakterből állnak a cella értékei. Ha 3 akkor kell elé egy kötőjel.
                                                  És itt megint elakadtam.

                                                  Szóval van bajom…:-)

                                                23 bejegyzés megtekintése - 1-23 / 23
                                                • Be kell jelentkezni a hozzászóláshoz.