Roztřídit obsah buňky (buněk)

Programy pro práci s textem, tabulkami, prezentacemi

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Dubák 13. 2. 2017 19:54

Dobrý den.

Mám několik, možná stovek, řádků v následující podobě:
Obrázek

a potřeboval bych je dostat do podoby takovéto:
Obrázek

Jsem odsouzen k ruční práci? nebo lze nějak automatizovat do požadované podoby?

ještě jednou původní podoba a požadovaná podoba v jednom obrázku:
Obrázek

díky za pomoc
NB: OMEN by HP 17-an111nc; Win10 Home - 64-bit
PC: Intel Core i3-4170; MB GIGABYTE GA-B85M-D3H-A; RAM Kingston HyperX Fury 8GB (Kit 2x4GB) 1600MHz DDR3 CL10 Black; Sapphire ATI Radeon HD 5750 512MB DDR5; W10 Home - 64-bit
Dubák
Junior
Uživatelský avatar

Odeslat příspěvekod worrapS 13. 2. 2017 21:06

A tabulka je v Excelu? Nebo nějaké relační DB? Buňka s daty je slepená dohromady, nebo jsou hodnoty {p,g,s,b} na jiných řádcích?

Pro příště by bylo dobré budovat databázi alespoň v 3. NF.
Pracovat s počítači je docela otrava. Vůbec, pracovat je otrava. Možná to nakonec s těmi počítači nebude až tak zlé.
worrapS
Junior
Uživatelský avatar

Odeslat příspěvekod Dubák 13. 2. 2017 21:37

je to excel, ano

bunky jsou jako na prvním obr. jedna buňka třeba 4 záznamy pod sebou.
Chtel bych z jednoho řádku udělat 4 řádky pro každou hodbotu p;g;s;b zvlášť
NB: OMEN by HP 17-an111nc; Win10 Home - 64-bit
PC: Intel Core i3-4170; MB GIGABYTE GA-B85M-D3H-A; RAM Kingston HyperX Fury 8GB (Kit 2x4GB) 1600MHz DDR3 CL10 Black; Sapphire ATI Radeon HD 5750 512MB DDR5; W10 Home - 64-bit
Dubák
Junior
Uživatelský avatar

Odeslat příspěvekod worrapS 13. 2. 2017 21:57

Ještě jedna otázka - jestli jsem to pochopil správně, tak takových datových řádků je víc. Cílem je každý takový řádek rozdělit do dalších čtyřech samostatných. Zároveň zachovat sloupce. Nedostaneš se tak ale do stejného problému? Bylo by lepší to převést na následující schéma (sloupce tabulky): [ID řádek, písmeno, ID sloupec, počet].
Pracovat s počítači je docela otrava. Vůbec, pracovat je otrava. Možná to nakonec s těmi počítači nebude až tak zlé.
worrapS
Junior
Uživatelský avatar

Odeslat příspěvekod Doggg 13. 2. 2017 22:07

excel (tuším od verze 10+) má funkcí převést text na sloupce podle definovaných oddělovačů (v tvém případě asi entry). zkusil bych tím začít, abys to dostal do buňkové struktury (případně začít transpozicí, pokud to máš obráceně než potřebuje excel).
Doggg
Junior

Odeslat příspěvekod Dubák 13. 2. 2017 22:24

ano, takovách řádků jsou desítky, no spíš stovky, každý takový řádek vyjadřuje vlastnosti hodnoty v buce řekněme A1 , ta by byla následně sloučena ze 4 řádků

-- 13. 2. 2017 23:28 --

Doggg píše:excel (tuším od verze 10+) má funkcí převést text na sloupce podle definovaných oddělovačů (v tvém případě asi entry). zkusil bych tím začít, abys to dostal do buňkové struktury (případně začít transpozicí, pokud to máš obráceně než potřebuje excel).


to jsem zkoušel, ale nevím jaký zadat oddělovač
NB: OMEN by HP 17-an111nc; Win10 Home - 64-bit
PC: Intel Core i3-4170; MB GIGABYTE GA-B85M-D3H-A; RAM Kingston HyperX Fury 8GB (Kit 2x4GB) 1600MHz DDR3 CL10 Black; Sapphire ATI Radeon HD 5750 512MB DDR5; W10 Home - 64-bit
Dubák
Junior
Uživatelský avatar

Odeslat příspěvekod Kurimak 14. 2. 2017 08:09

Zdravím,

použil bych tenhle vzorec, který bych vložil do B2 a rozkopíroval:
Kód: Vybrat vše
=IFERROR(ČÁST(B$1;HLEDAT($A2;B$1)-1;1);"")

Vzorec bude fungovat v případě, že levá horní buňka (nevyplněná) má adresu A1. Viz obrázek.
Jinak je samozřejmě potřeba vzorec upravit.
Obrázek

Pro starou verzi Excelu (2003 a starší) je třeba použít vzorec:
Kód: Vybrat vše
=KDYŽ(JE.CHYBA(ČÁST(B$1;HLEDAT($A2;B$1)-1;1));" ";ČÁST(B$1;HLEDAT($A2;B$1)-1;1))


Má úcta! :D
Kurimak
Junior

Odeslat příspěvekod eQuido 14. 2. 2017 11:34

Řešení od "Kurimak" má dva drobné nedostatky:
1) Funguje pouze pro jednomístná čísla před písmeny - a i v tebou uváděném příkladu se vyskytuje 15b a 10b (z čehož Kurimakovým vzorcem vznikne v příslušných buňkách "5" a "0".
2) Pokud máš více řádků pod sebou (a sám píšeš že ano), pak budeš muset pod každý z nich ručně vložit 4 prázdné řádky, nakopírovat tam vzorec a dvakrát v něm přepsat B$1 na správné číslo řádku.

Řešení jsou v zásadě 2 - ruční rozdělení do sloupců (asi použitelné, pokud to chceš udělat jednou) nebo makro (pokud to chceš opakovat pravidelně nebo opravdu potřebuješ přesně ten formát, co jsi popsal).

1 - rozdělení textu (tj. to co radil Doggg): Excel používá pro oddělení těch řádků v buňce znak s ascii kódem 10. Označíš tedy jeden sloupec, vybereš funkci "Text do sloupců", klikneš do políčka pro "Jiný oddělovač" a zadáš <ALT>0010 (tedy celou dobu držíš stisknutý ALT, na numerické klávesnici napíšeš 0010 a ALT pustíš).
Pozor: bez ptaní ti to přepíše to, co je vpravo od aktuálně vybraného sloupce!

2 - makro : otevřeš si makro editor (Alt+F11), v něm dvojklik na VBAProject (název tvého souboru) ~ Microsoft Excel Objects ~ List1 a do okna vpravo vložíš kód makra. Pokud to chceš spouštět jednou, zmáčkni hned <F5>, jinak celý excel ulož jako sešit s podporou maker (*.xlsm) a při příštím otevření stačí stisknout <ALT>+F8 (čili nemusíš pokaždé otevírat makro editor).
Pokud se tvůj List1 jmenuje jinak (třeba Sheet1 apod), tak změň konstantu na 3. řádku.

Kód: Vybrat vše
Option Explicit

Const cNazevListu = "List1"

Public Sub pgsb()
    Dim list As Worksheet
    Dim radek As Integer
    Dim sloupec As Integer
    Dim arr As Variant
    Dim i As Integer
    Dim znak As String
   
    ' pro jistotu, aby byl list aktivni
    Set list = ThisWorkbook.Worksheets(cNazevListu)
    ThisWorkbook.Activate
    list.Activate
   
    If list.UsedRange.Rows.Count > 0 Then
        For radek = list.UsedRange.Rows.Count To 1 Step -1
            ' vlozit 4 nove radky
            list.Range(list.Rows(radek + 1), list.Rows(radek + 4)).Select
            Selection.Insert xlShiftDown
            list.Cells(radek + 1, 1) = "p"
            list.Cells(radek + 2, 1) = "g"
            list.Cells(radek + 3, 1) = "s"
            list.Cells(radek + 4, 1) = "b"
            For sloupec = 2 To list.UsedRange.Columns.Count
                ' kazdou neprazdnou bunku rozsekat do 4 bunek pod ni
                If list.Cells(radek, sloupec).Value <> "" Then
                    arr = Split(list.Cells(radek, sloupec).Value, Chr(10))
                    For i = LBound(arr) To UBound(arr)
                        znak = LCase(Right(RTrim(arr(i)), 1))
                        Select Case znak
                        Case "p": list.Cells(radek + 1, sloupec).Value = Replace(arr(i), znak, "")
                        Case "g": list.Cells(radek + 2, sloupec).Value = Replace(arr(i), znak, "")
                        Case "s": list.Cells(radek + 3, sloupec).Value = Replace(arr(i), znak, "")
                        Case "b": list.Cells(radek + 4, sloupec).Value = Replace(arr(i), znak, "")
                        End Select
                    Next
                End If
            Next
        Next
       
        list.Cells(1, 1).Activate
    Else
        MsgBox "List " & cNazevListu & " neobsahuje zadna data", vbCritical + vbOKOnly, "Chyba"
    End If
End Sub
eQuido
Kolemjdoucí

Odeslat příspěvekod Dubák 14. 2. 2017 12:10

Hodilo by se mi zdokonalené řešení od "Kurimak", je li k mání. Neboť celé toto všechno potřebuji udělat pouze jednou se všemi řádky a nejlépe do nového listu sešitu.
Tudíž, přidal do původního listu pod první řádek 4nové a použil vzorec od "Kurimak"
Pokud vše proběhne podle představ už jen zkopíruji vzorece pro první řádek do nového listu, odstraním nové 4 řádky z původního listu a v novém listu bych rozkopíroval vzorec.

Text do sloupcu s oddělovačem <ALT>0010 jsem zkusil, díky, ale to by v listu nadělalo slušny chaos. Rozdělení proběhlo pouze na páry znaků.

Makro jsem nezkoušel , zkusím ted
NB: OMEN by HP 17-an111nc; Win10 Home - 64-bit
PC: Intel Core i3-4170; MB GIGABYTE GA-B85M-D3H-A; RAM Kingston HyperX Fury 8GB (Kit 2x4GB) 1600MHz DDR3 CL10 Black; Sapphire ATI Radeon HD 5750 512MB DDR5; W10 Home - 64-bit
Dubák
Junior
Uživatelský avatar

Odeslat příspěvekod Dubák 14. 2. 2017 17:20

tak dal jsem to s tím makrem.

Díky moc všem za čas a pomoc... mějte se excelentně
NB: OMEN by HP 17-an111nc; Win10 Home - 64-bit
PC: Intel Core i3-4170; MB GIGABYTE GA-B85M-D3H-A; RAM Kingston HyperX Fury 8GB (Kit 2x4GB) 1600MHz DDR3 CL10 Black; Sapphire ATI Radeon HD 5750 512MB DDR5; W10 Home - 64-bit
Dubák
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků