< návrat zpět

MS Excel


Téma: kopírování tabulek na nový list rss

Zaslal/a 19.5.2019 22:49

Zdravím, jsem začátečník a potřebuju vytvořit makro, které má vytvořit nový list a zkopírovat do něj tabulku z prvního listu, a pod něj tabulky z ostatních listů (už bez hlavičky), aby to bylo celé jako jedna tabulka, počet řádku se v jednotlivých tabulkách liší a sloupců to vybírá z ostatních tabulek jen tolik kolik jich je v první tabulce, ostatní případné sloupce vynechá, počet listů může být variabilní a počet sloupců v první tabulce také. Napsala jsem toto a překvapivě to nefunguje :) ani nevím, jestli to není úplně nějaký nesmysl a nemám to řešit úplně nějak jinak :(
V příloze je sešit s mým makrem.

Sub makro()
Dim ws As Worksheet
Worksheets(1).Copy Before:=Sheets(1)
Set ws = ActiveSheet
ws.Name = "tabulka"
Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long
a = Worksheets.Count
Worksheets(1).Select
c = Columns.Count
d = Rows.Count
For list = 3 To a
For b = 1 To c
For e = 2 To 100
If Len(Text) = 0 Then
Exit For
End If
Worksheets(list).Select
Text = Cells(e, 1)
Worksheets(1).Select
Cells(d + 1, b) = Text
d = d + 1
Next e
Next b
Next list
End Sub

Příloha: xls43376_kopirovani-tabulek.xls (45kB, staženo 21x)
Zaslat odpověď >

#043378
elninoslov
Makro čo som Vám dal v predošlej téme sedí presne na Váš súbor, len si ho skopírujte.citovat
#043380
avatar
Díky :) Funguje super :) Sice bych raději přišla na to, co mám špatně ve svém kódu ale na to přijdu později. Teď spěchám. Dík moc :)

elninoslov napsal/a:

Makro čo som Vám dal v predošlej téme sedí presne na Váš súbor, len si ho skopírujte.
citovat
#043381
elninoslov
Čo je na ňom zlé? No, ... celý koncept je zlý.
Napr.:

- viete čo urobí tento riadok ?
If Len(Text) = 0 Then Exit ForNič! A to je práve ono. Každý prechod každým cyklom príde najskôr na tento riadok, kde otestuje či je Text nulovej dĺžky. A on skutočne je, lebo ho nikde predtým nenastavíte. Až za tým. Ale tam sa nikdy nedostane.

- For List = 3 To a
...
Worksheets(List)
Prečo sa začína od listu číslo 3

- Select - toto sa naučte používať iba keď je to nutné - veeeľmi zriedka. Odkazujte sa rovno na list, lebo každý má nejaké meno. Prípadne na jeho odkaz v kolekcii Worksheets.

-Alebo
d = Rows.Count
...
Cells(d + 1, b) = Text
Do "d" uložíte počet riadkov daného Excelu, v tomto prípade staršieho XLS je to 65536. To je maximum, viac mať XLS nemôže. A potom k tomu pripočítate +1, teda vznikne 65537. Bác chyba, taký riadok v XLS neexistuje (XLSX je to až 1048576).

- Nejdem to pitvať, len ako posledný príklad uvediem
Text = Cells(e, 1)Áno načítate si do premennej Text (ktorá mimochodom nieje deklarovaná, síce je typu Variant, ale aj tak pre prehľadnosť musí byť v deklarácii, premenná List takisto), ale vždy iba z 1. stĺpca. Darmo prechádzate cyklom ostatné stĺpce, keď vždy načítate 1.

Plus samozrejme nejaké logické veci, ako napr. ten spomínaný test If Len(Text) = 0. Ak by ste ho aj zaradili na správne miesto, čo ak bude niektorá bunka v tabuľke prázdna? Bác, cyklus sa ukončí a ostatné neskopíruje.
WS.Name = "tabulka" - čo ak ten list už existuje ? No nastane chyba.
Nepočíta sa tam so žiadnou chybou. Preto ja v mojom kóde testujem existenciu spoločného listu, vynechávam ho zo súhrnu, a testujem počet riadkov (či obsahuje list vôbec dáta).
-Prechádzanie všetkých Cells po jednej, je strašne pomalé. Preto som použil bleskové polia.

Ale neľakajte sa problémov, a upozornení na chyby (to nie sú výtky v pravom slova zmysle). Veď začínate, je to v pohode. Treba sa ozvať, keď niečo nepôjde.citovat

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje