< návrat zpět

MS Excel


Téma: vnořené cykly for - přetečení? rss

Zaslal/a 19.5.2019 20:23

Zdravím, nevěděl by někdo co je na tomto začátečnickém :) kódu špatně? Píše to overflow v šestém řádku (For d = 1 To c). Má to kopírovat tabulku pod sebe. Vážně netuším :(

Sub makro()
Dim a, b, c, d As Integer
Worksheets(1).Select
b = Columns.Count
c = Rows.Count
For a = 1 To b
For d = 1 To c
Text = cells(d, a)
If Len(Text) = O Then
Exit For
End If
cells(c + 1, a) = Text
Next d
Next a
End Sub

Zaslat odpověď >

#043371
Stalker
Chyba je v deklaraci proměnné d viz
http://wall.cz/excel-navod/deklarace-promennych-a-prehled-datovych-typu-vba

protože c= rows.count > c = 1048576citovat
#043372
avatar
Díky:) Já jsem to teď přepsala takto a zase to nefunguje, pouze jeden cyklus (který kopíruje pod tabulku jeden řádek tabulky) je ok:

Sub makro()
Dim a, b, c, d As Integer
Worksheets(1).Select
b = Cells(1, Columns.Count).End(xlToLeft).Column
c = Cells(Rows.Count, "A").End(xlUp).Row
For a = 1 To b
For d = 1 To c
Text = Cells(d, a)
If Len(Text) = O Then
Exit For
End If
Cells(c + 1, a) = Text
Next d
Next a
End Sub

Stalker napsal/a:

Chyba je v deklaraci proměnné d viz
http://wall.cz/excel-navod/deklarace-promennych-a-prehled-datovych-typu-vba

protože c= rows.count > c = 1048576
citovat
#043373
Stalker
Za prvé si řádně deklaruj proměnné, a, b a c máš deklarovány jako Variant a d jako Integer

Zobraz si v editoru okno Locals ať vidíš jakých hodnot proměnné nabývají. Hlavně proměnná c (počet řádků). Být Tebou tak změním d na Long.

Taky si oprav tu podmínku.
If Len(Text) = O Then - Tohle není NULA, ale velké ó.citovat
#043374
avatar
To jsem nevěděla, tak jsem si je řádně deklarovala, pořád nevím proč long, tak jsem si tak preventivně deklarovala všechny, hlavně potřebuju, aby to fungovalo, na tu chybu v cyklu jsem už přišla. Celé makro 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 samozřejmě to nefunguje :) ani nevím, jestli to není úplně nějaký nesmysl a nemám to řešit úplně nějak jinak :(

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

Stalker napsal/a:

Za prvé si řádně deklaruj proměnné, a, b a c máš deklarovány jako Variant a d jako Integer

Zobraz si v editoru okno Locals ať vidíš jakých hodnot proměnné nabývají. Hlavně proměnná c (počet řádků). Být Tebou tak změním d na Long.

Taky si oprav tu podmínku.
If Len(Text) = O Then - Tohle není NULA, ale velké ó.
citovat
#043375
Stalker
V tom případě sem vlož vzorový soubor a někdo se na to určitě mrkne.citovat
#043377
elninoslov
No ak pominieme nejaké nelogickosti, ktoré treba dotiahnuť, tak napr. takto.

-Čo ak spoločný list už existuje ? Zmazať v ňom dáta, a nahradiť novými ? Alebo nové pridať pod staré ? Teda inak povedané, je potrebné list Spolu vynechávať zo zlučovania dát ?
-Kde ma byť to makro umiestnené ? Ako sa má spúšťať ? Veď keď máte meniaci sa počet listov, a neistú existenciu spoločného listu, tak makro by mohlo byť asi iba v doplnku či ako tlačítko v lište nástrojov Excelu. Pretože listy meníte, asi aj mažete, a nevieme zabezpečiť existenciu nejakého tlačítka v každom liste.
-Počet stĺpcov sa líši. Je teda možné, že určitý stĺpec bude na inej pozícii ? To by sa muselo ošetriť.

Tých vecí k zamysleniu je viac.

Ale na toto by sa viac hodilo PowerQuery.
Příloha: zip43377_zluc-listy.zip (21kB, staženo 17x)
citovat
#043379
elninoslov
Prípadne, ak by hrozilo, že výsledná tabuľka bude mať viac ako 32767 riadkov, tak sa nedá použiť transpozícia poľa, lebo je obmedzená na tento počet riadkov, ale použite túto úpravu.

PS: Transpozícia je potrebná pri poliach, ktorých veľkosť meníte za behu. A to preto, že meniť veľkosť môžete iba poslednému rozmeru poľa, čo je inak povedané na šírku. A keďže nám sa tabuľka zväčšuje na výšku, preto je potrebná pri takomto použití transpozícia poľa. Každopádne toto druhé riešenie, najskôr zistí celkový počet dát, a pole nastaví rovno na výšku, teda transpozícia nieje potrebná.

Stále si ale myslím, že na toto je lepší PowerQuery, ktorý ale ja príliš neovládam (tie čachre s počtom stĺpcov). Tak snáď niekto iný...
Příloha: zip43379_zluc-listy-notranspose.zip (26kB, staženo 18x)
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