Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Data v Excelu - přidání řádků dle daných čísel

Dobrý den,

jako ubytovací zařízení musíme hlásit ubytování cizinců. Bohužel export dat z našeho systému vypadá takto: 6REhRg.png jsou tam všechna data, která potřebujeme, ale máme vždy řádek toho kdo rezervaci udělal a k němu hosty (zbytek rodiny) v předposledním sloupci. v Posledním sloupci je počet lidí celkem na daném místě.

Pokud bych měl vše po řádcích, tak si již pospojuji automaticky data, změním formátování apod. Nedokáži však automaticky udělat to, aby podle třeba čísla Excel přidal N-1 řádků a ty vyplnil podle vzoru "rezervátora" (ideálně i vypsal konkrétní jména a data narození do přidaných řádků, ale to bych si případně již vypsal ručně.

Asi na to půjde nějaké makro, neumíte ho někdo sepsat?

Díky za případné nápady!

Předmět Autor Datum
Co to udelat rucne abysme rozumneli jak to ma presne po "zasahu makrem" vypadat. Z toho popisu jsem…
Dwane Dibbley 11.07.2017 14:21
Dwane Dibbley
Takto by měl vypadat export prvního řádku Wr8DpU.png . Chápete to správně. Bohužel program je holand…
Adam T. 11.07.2017 14:32
Adam T.
rýchly nástrel, nestíham Sub Doplnenie() Application.ScreenUpdating = False prvy = 2 For i = 1 To R…
robert13 11.07.2017 14:30
robert13
Vyssie uvedene makro prejde cely zoznam a skopiruje riadok rezervatora podla poctu osob uvedenych v…
robert13 11.07.2017 15:08
robert13
Děkuji, to je přesně co jsem potřeboval :-):-) Já jsem právě zkoušel text oddělit, ale nedokázal js…
Adam T. 11.07.2017 15:42
Adam T.
Urobime to na komplet, excel dokaze vsetko... :-) Zajtra vsak budem potrebovat info alebo kopiu jedn…
robert13 11.07.2017 15:57
robert13
Pokud mi pošlete mail, napíšete z Vašeho na můj mail, či navrhnete jinou cestu, tak Vám rád pošlu či…
Adam T. 11.07.2017 16:30
Adam T.
Mozeme tu prejst na privatnu postu, tam mozes dat vzor. Samozrejme ziadne ostre udaje. Stacia mi zah…
robert13 11.07.2017 16:40
robert13
Mam neblahy pocit, ze udaj ve sloupci O ti je k prdu. Holandsky neumim, ale personen bude osoba a 8…
Dwane Dibbley 11.07.2017 17:16
Dwane Dibbley
Netráp sa, ja už viem na čo to potrebujem :-D
robert13 12.07.2017 10:17
robert13
Tak a jsu tady... Pokračujeme?
robert13 12.07.2017 10:17
robert13
Ten oddelovac, predpokladam pro split(), by snad mel fungovat Chr(10). Jestli dobre koukam co je tre…
Dwane Dibbley 11.07.2017 16:03
Dwane Dibbley
Ano chr 10, pokial je to v bunke zalamovane. Vyzera to tak. Chcelo by to roztiahnut ten stlpec
robert13 11.07.2017 16:08
robert13
Ahoj, sorry že se do toho pletu. Jelikož nemám noc rád Select (i když v tomto případě je to asi jedn…
Siki83 11.07.2017 17:49
Siki83
Ještě mě napadlo řešení bez cyklu. Sub Doplnenie() Dim prvy As Byte Application.ScreenUpdating = Fa…
Siki83 11.07.2017 20:21
Siki83
Ahoj Siki, dáwno som Ťa nevidel! Konečne sa tu zas objavilo niečo na Excel, však? :-D
robert13 12.07.2017 10:19
robert13
Chýbajú mi informácie, odpoveď si neposlal, takže zatiaľ len takto. Aplikuj na svoju tabuľku. Funguj…
robert13 12.07.2017 11:45
robert13
Děkuji, půjdu to zkusit - e-mail jsem Ti poslal před chvilkou, tam máš odpovězené i to m,v,mv (což n…
Adam T. 12.07.2017 11:49
Adam T.
Prípadne kapánek elegantnejšie: Sub Rozpis() Application.ScreenUpdating = False prvy = 2 For i = 1…
robert13 12.07.2017 12:36
robert13
OK, mail prišiel. Odpíšem po tom, čo budem mať možnosť si to preštudovať.
robert13 12.07.2017 12:49
robert13
Jasně - úplně v pořádku ;-)
Adam T. 12.07.2017 13:16
Adam T.
Ahoj Roberte, jo jo máš pravdu, v poslední době se mi nedostává volného času. Tak sem kouknu jen spo… poslední
Siki83 13.07.2017 22:58
Siki83

Co to udelat rucne abysme rozumneli jak to ma presne po "zasahu makrem" vypadat. Z toho popisu jsem nejak pobral ze ma byt snad kazdy clovek na radku zvlast (jakoze treba radek 2 by byl rozepsan na 4 radky)? (pak by bylo nejlepsi prepsat primo export, pokud je to tahano z nejake databaze).

rýchly nástrel, nestíham

Sub Doplnenie()
    Application.ScreenUpdating = False
    prvy = 2
    For i = 1 To Range("A1").End(xlDown).Row - 1
        For j = prvy To prvy + Range("O" & prvy) - 2
            Rows(j & ":" & j).Select
                Selection.Copy
                Selection.Insert Shift:=xlDown
        Next j
    prvy = prvy + Range("O" & prvy)
    Next i
    Application.CutCopyMode = False
    Range("A1").Select
End Sub

ďalej sa to dá tiež zautomatizovať.
Ak Ti s tým niekto zatiaľ neporadí, zajtra môžem pokračovať

Vyssie uvedene makro prejde cely zoznam a skopiruje riadok rezervatora podla poctu osob uvedenych v stlpci O.
Potom je treba uz len rozsekat hromadny udaj z predposledneho stlpca N a prepisat prislusne bunky prislusnikov.
Bolo by fajn, keby bol hromadny obsah predposledneho stlpca zalamovany... Alebo aspon mal oddelovace.
Pisem z tabletu, zajtra mozeme pokracovat.
Kazdopadne, ak vies, kam dat a ako spustit toto makro, mozes si to na kopii harka odskusat.
P.S. makro zacina duplikovat od druheho riadka... (len pre info, ak by si mal uz niekolko riadkov spracovanych a chcel zacat az niekde nizsie... Napr uz mas spracovanu davku ubytovanych a v dalsi den pribudnu dalsi... To by sa tiez dalo osetrit)
ALE: co ak tie osoby sice budu spolu ubytovane, ale maju odlisne bydliska?

P.S. P.S. inak suhlas s Dwane Dibbley: preco sa uz vo vstupnej databaze netvoria samostatne riadky podla poctu osob, kam by sa automatizovane preniesli spolocne udaje a doplnali tie individualne?
Ale zas chapem, ze Ty sa mas odrazit od toho, co mas k dispozicii...

Děkuji, to je přesně co jsem potřeboval :-):-)

Já jsem právě zkoušel text oddělit, ale nedokázal jsem specifikovat "oddělovač" je to něco na způsob enteru, ale nedokáži to zapsat, aby dokázal data automaticky oddělovat.

Makro jsem odzkoušel a je to opravdu dobré, už takto by to ušetřilo spoustu práce. Problem je, že data musíme posílat policii každé tři dny a jedná se občas i o stovky lidí, takže každý krok navíc nám udělá třeba i hodiny práce pro jednoho pracovníka navíc...

Nad tím, když má někdo jiné bydliště jsem také přemýšlel, ale po vytisknutí tabulky ve finální verzi musí každý host svůj řádek podepsat. Tím stvrdí údaje - či ručně přepíšeme změny, které nám řekne. Jelikož jsou u nás ale převážně rodiny s dětmi, tak to asi nebude často.

Já bohužel nedokáži udělat žádné změny v exportu. Ten je dělaný na "místa/pokoje" ne na export Lidí :-/

Myslíte Roberte, že byste si s tím dokázal poradit i dál? Jsem ochotný Vám za zautomatizování případně i zaplatit - nám to ušetří opravdu mnoho mnoho času i do budoucna. Případně pište na Adam-trcka@seznam.cz

Pokud mi pošlete mail, napíšete z Vašeho na můj mail, či navrhnete jinou cestu, tak Vám rád pošlu čistý export dat, ale tady ho nemohu nahrát a ani nechci, aby ho viděli všichni ;-) Rád Vám také pošlu tabulku, kam to všechno musíme dostat, abyste měl trochu představu o tom, co vlastně musíme udělat.

Mozeme tu prejst na privatnu postu, tam mozes dat vzor.
Samozrejme ziadne ostre udaje.
Stacia mi zahlavia zdrojovej a cielovej tabulky a jeden riadok udajov, dokonca staci len obsah jednej bunky zo stlpca O, aj tam mozu byt fiktivne udaje, ale struktura obsahu musi byt zachovana (trebars zmenit mena a datumy)
V pripade, ze sa nechces registrovat, poslem zajtra mail.

Ten oddelovac, predpokladam pro split(), by snad mel fungovat Chr(10). Jestli dobre koukam co je treba potom z jednotlivych radku extrahovat je jmeno (opet asi pres split, s defaultnim "mezernikem" jako oddelovac a vzit druhou polozku) a pak datum, coz by mela poslouzit funkce right() s delkou deset znaku (pote by uz slo snadno splitnout a prestavet pro zapis s teckami misto pomlcek).

Ahoj, sorry že se do toho pletu. Jelikož nemám noc rád Select (i když v tomto případě je to asi jedno), co takhle?:

Sub Doplnenie()
    Application.ScreenUpdating = False
    prvy = 2
    For i = 1 To Range("A1").End(xlDown).Row - 1
        For j = prvy To prvy + Range("O" & prvy) - 2
           With Rows(j & ":" & j)
                .Copy
                .Insert Shift:=xlDown
           End With
        Next j
    prvy = prvy + Range("O" & prvy)
    Next i
    Application.CutCopyMode = False
    Range("A1").Select
    Application.ScreenUpdating = False
End Sub

Ještě mě napadlo řešení bez cyklu.

Sub Doplnenie()
    
Dim prvy As Byte
    
Application.ScreenUpdating = False
    
    prvy = 2
           With Rows(prvy & ":" & prvy)
                .Copy
                .Resize(Range("O" & prvy) - 1).Insert Shift:=xlDown
           End With
    Application.CutCopyMode = False
    Range("A1").Select
Application.ScreenUpdating = False
End Sub

Chýbajú mi informácie, odpoveď si neposlal, takže zatiaľ len takto.
Aplikuj na svoju tabuľku.
Funguje to za predpokladu, že v stĺpci N sú zalamované údaje (čo predpokladám, že sú).
Ostáva poroztínať mená a dátumy narodenia...

Sub Doplnenie()
    Application.ScreenUpdating = False
    prvy = 2
    For i = 1 To Range("A1").End(xlDown).Row - 1
        zac = prvy
        pocet = Range("O" & prvy)
        For j = prvy To prvy + pocet - 2
            With Rows(j & ":" & j)
                .Copy
                .Insert Shift:=xlDown
            End With
        Next j
        Range("P" & zac) = Range("N" & zac)
        Application.CutCopyMode = False
        
        ria = zac
        PocOs = 0
dalsi:
        For k = 1 To Len(Range("P" & zac))
            If Mid(Range("P" & zac), k, 1) = Chr(10) Then
                Vymaz (ria + 1)
                Range("D" & ria + 1) = Mid(Range("P" & zac), 1, k - 1)
                PocOs = PocOs + 1
                Range("P" & zac) = Mid(Range("P" & zac), k + 1)
                ria = ria + 1
                GoTo dalsi
            End If
            If k = Len(Range("P" & zac)) And Range("P" & zac) <> "" Then
                Vymaz (ria + 1)
                Range("D" & ria + 1) = Range("P" & zac)
                PocOs = PocOs + 1
                Range("P" & zac) = ""
                Exit For
            End If
        Next k
        If PocOs <> (Range("O" & zac) - 1) Then
            MsgBox "Počet spoluubytovaných na riadku " & zac & " nesúhlasí s počtom osôb celkom", vbCritical, "Chyba"
            Exit Sub
        End If
        prvy = prvy + pocet
    Next i
    Range("A1").Select
End Sub
Sub Vymaz(rv)
    Range("A" & rv & ",D" & rv & ":F" & rv & ",M" & rv & ":O" & rv).ClearContents
End Sub

Je tam ošetrený prípad nesúladu medzi počtom uvedených spolubývajúcich v stĺpci N s počtom osôb celkom, uvedených v stĺpci O.
V takom prípade sa síce vytvorí plná kópia riadku rezervátora, ale ďalej sa nespracuje a postup sa zastaví.

Možno to ošetriť tak, že po zastavení sa údaje manuálne skorigujú a spustí sa makro od riadku s rezervátorom, u ktorého sa vyskytla chyba (treba dopracovať)

Mám pokračovať?

P.S. Skratky v, m a mv sú nespracovávané?

Děkuji, půjdu to zkusit - e-mail jsem Ti poslal před chvilkou, tam máš odpovězené i to m,v,mv (což není důležité je to muž/žena/nevyplněno), uděláme trochu jiný export, kde bude celkový počet hostů, ale o tom již také v e-mailu. Export dá bohužel počet do tří sloupců, které se budou muset prvně sloučit/sečíst.

Prípadne kapánek elegantnejšie:

Sub Rozpis()
    Application.ScreenUpdating = False
    prvy = 2
    For i = 1 To Range("A1").End(xlDown).Row - 1
        zac = prvy
        pocet = Range("O" & prvy)
        For j = prvy To prvy + pocet - 2
            With Rows(j & ":" & j)
                .Copy
                .Insert Shift:=xlDown
            End With
            Range("A" & j + 1 & ",D" & j + 1 & ":F" & j + 1 & ",M" & j + 1 & ",O" & j + 1).ClearContents
        Next j
        Application.CutCopyMode = False
        
        Range("N" & zac + 1).Select
        Delenie = Split(Selection.Value, Chr(10))
        Selection(1).Resize(UBound(Delenie) + 1) = Application.Transpose(Delenie)
        
        prvy = prvy + pocet
    Next i
    Range("A1").Select
End Sub

Samozrejme, treba tiež dopracovať v delení mien s dátumami narodení + táto verzia je zatiaľ bez kontroly súhlasu počtov
Ale ako medzitým vidím, asi tam budú zmeny...

Zpět do poradny Odpovědět na původní otázku Nahoru