

Excel VBA - Formátovanie
Zdravím,
chcel by som poprosiť o riešenie, ktoré by z vygenerovanej tabuľky, naformátovalo list pre tlačenie údajov nasledovne( neovládam VBA):
Na liste „PrvaSK4“ mám vygenerovanú tabuľku, ktorá obsahuje vždy trojice opakujúcich sa stĺpcov (t.j. B3:D24; E3:G24; H3:J24; ...atd až do max. 50 troj-stĺpcov – posledný je ES3:EU24) s rôznymi údajmi. Počet stĺpcov a riadkov sa dynamicky mení a to tak, že počet troj-stĺpcov sa mení podľa obsahu bunky D17 na liste 2 a počet riadkov sa mení podľa obsahu bunky D20 na liste 2.
Každý troj-stĺpec má v druhom stĺpci v riadku 25 ( C25, F25, I25, .... ET25) vygenerovanú nejakú hodnotu.
Rovnakým spôsobom je na liste „DruhaSK4“ vygenerovaná rovnaká tabuľka ako predchádzajúca, s inými údajmi.
Prvé makro:
Pri zmene niektorej z buniek D17 alebo D20 potrebujem , aby sa z aktuálneho počtu troj-stĺpcov s počtom riadkov= D20 z listu „PrvaSK4“, prekopírovala vždy prvá dvojica stĺpcov (t.j. B,C; E,F; H,I; .... až do počtu= D17) do listu „PTPRVA“ a to tak, že sa od bunky A1 kopíruje max. 12 dvoj-stĺpcov, ďalších max. 12 dvoj-stĺpcov sa kopíruje pod prázdny riadok pod predchádzajúce skopírované dvoj-stĺpce. Prázdny riadok treba vždy vytvoriť. Kopírovať len hodnoty, nie formáty buniek.
Kopírovať stĺpce je možné po riadok 44 t.j. kopírovaný stĺpec nemôže byť rozdelený riadkom 44. Ak je takýto prípad, musí kopírovanie stĺpca začínať na riadku 45 (Napr. 43 stĺpcov a 13 riadkov bude rozdelených nasledovne: A1:X13, A15:X27, A29:X41, A45:N57).
Kopírovanie sa vmestí do A1:X88.
Bunky do ktorých sa nekopíruje sa musia vynulovať – musia byť prázdne.
Druhé makro:
Kopírovanie stĺpcov s väčšou hodnotou
Ak je na liste 1 v bunke K21 = 0, skryť na liste 1 stĺpce G, H a súčasne skryť listy „DruhaSK4“ , „PT21“ a „PT22“. Ak K =1 tak uvedené stĺpce a listy zobraz.
Ak K21 = 1, potom porovnaj zodpovedajúce hodnoty v riadku 25 (C25, F25, I25, .... ET25 - viď začiatok textu) v daných stĺpcoch na listoch „PrvaSK4“ a „DruhaSK4“. Ak je hodnota na liste „PrvaSK4“ >= hodnote na liste „DruhaSK4“ , skopíruj dvoj-stĺpec z „PrvaSK4“ do listu „PT21“ rovnakým spôsobom ako pri prvom makre. Ak je hodnota na liste „PrvaSK4“ < ako hodnota na liste „DruhaSK4“ , skopíruj dvoj-stĺpec z „DruhaSK4“ do listu „PT22“ rovnakým spôsobom ako pri prvom makre.
Excel 2003, Windows XP.
Vopred ďakujem
Druhé makro pre list PT21, ktoré počíta s tým, že počet stĺpcov v tabuľkách na listoch PrvaSK4 a DruhaSK4 je rovnaký (počet riadkov nemusí byť rovnaký), môže vyzerať takto:
Pre list PT2 treba v makre nahradiť riadok
za riadok
a obidva riadky
za riadky
Moje veľké Vďaka,
teraz to už pracuje skoro tak, ako som si to predstavoval. Chcelo by to ešte podľa zadania úpravu a to:
ďalších max. 12 dvoj-stĺpcov sa kopíruje pod prázdny riadok pod predchádzajúce skopírované dvoj-stĺpce.
Teraz ďalších max. 12 dvoj-stĺpcov sa kopíruje od riadku 45 a ďalších
12 dvoj-stĺpcov od riadku 68, 91 a dva dvoj-stĺpce od riadku 114 . Kopírovanie nekončí posledným plným stĺpcom, ale makro kopíruje aj prázdne stĺpce do počtu 50 tich dvojstĺpcov.
Kopírovanie na riadku 45 má začínať vtedy, ak by predchádzajúce 12 dvoj-stĺpce mali byť riadkom 44 rozdelené, alebo ak dvojstĺpce končia na riadku 44. Riadkom 45 začína nová stránka.
Rovnako pracuje aj makro 2, ináč perfektne.
Trochu rušivo pôsobí, že pri každom opätovnom klepnutí na listy PTPRVA, PT21 alebo PT22 aj keď sa dáta už nemenia, dochádza k novému prepočítaniu.Prvotné zadanie dát sa robí na liste 1 a zmeny sa prenášajú na listy PrvaSK4 a DruháSK4. Ak by na liste 1 nedošlo k žiadnej zmene potom by bolo žiadúce, aby sa už listy PTPRVA, PT21 a PT22 pri ich opätovnom preklikávaní nemenili. Táto skutočnosť vyplynula až teraz keď som to uvidel. Pokiaľ by to bolo možné realizovať a našli by ste si voľný čas bol by som Vám veľmi vďačný.
K tomu rušivému prepočítaniu: Najjednoduchšie by asi bolo pridať tlačidlá, ktorými by používateľ spúšťal prepočet explicitne a automatické prepočítavanie by tam nebolo.
Ak to ale chceš prepočítavať automaticky po zmene na liste 1, tak do neho môžeš pridať takéto makro:
Potom by malo stačiť už len upraviť začiatok makier na ostatných listoch na niečo takéto:
Ešte by som doplnil, že sa kopírujú aj prázdne riadky. Tabulky PrvaSK4 a DruhaSK4 majú v každej bunke B3:EU24 funkciu. Za plné riadky a stĺpce považovať len tie, ktoré obsahujú hodnoty, nie funkcie.
Po dlhšom čase sa mi podarilo zistiť, prečo makrá nechodia tak, ako by mali. Problém je v tom, že prvý a každý ďalší tretí stĺpec na liste Prva SK4 má v každej bunke generované fciou =IF(ISERROR(VLOOKUP(List3!B3;List1!$A$3:$B$24;2;0) );" "; VLOOKUP(List3!B3;List1!$A$3:$B$24;2;0)). Táto fcia mi síce vizuálne v tabuľke vytvára prázdne riadky a stĺpce, ale v skutočnosti sú tam medzery (" ")a tieto sú potom pri počítaní plných riadkov a stĺpcov započítané. Preto sa potom kopíruje plná tabulka.Túto fciu k vôli rýchlosti nechcem nahradiť makrom.
Počet skutočných riadkov už mám v D20 na liste2 a počet trojstĺpcov je v D17 na liste2. Nešlo by upraviť makrá tak, aby sa automaticky nepočítali riadky a stĺpce tabuľky, ale použili sa hodnoty D17 a D20?
Ďakujem
Vo všetkých makrách nahraď priradenie do premenných nRows a nColumns za:
Ďalej vo všetkých cykloch odstráň delenie číslom 3, čiže tam bude len toto:
A nakoniec v makrách pre PT21 a PT22 nahraď priradenie do premenných aCell1 a aCell2 za:
Vďaka za odpoveď,
u makra1 som narazil na nepresnosť. Ak tabuľka Prva SK4 má nRows=14, nColumns=48, potom do PTPRVA sa kopíruje nasledovne: Prvé a druhé 12 dvojstĺpce sa kopírujú OK (do A1:X14 a A16:X29). Tretie 12 dvojstĺpce by sa mali skopírovať do oblasti A31:X44 avšak tie sa už kopírujú do A45:X58 (nie sú ešte rozdelené riadkom 44). Štvrté 12 dvojstĺpce by sa potom mali skopírovať do A45:X58 avšak sa kopírujú do A60:X73.
To isté platí u makra2, ak je počet v PT21 alebo PT22 väčší, ako 24 dvojstĺpcov. Toto neviem odstrániť.
Premenné aCell1 a aCell2 musia mať v Offset (22,1) - hodnoty sa musia porovnávať vždy na riadku 25.
Chyba je v podmienke, ktorá kontroluje, či oblasť prechádza riadkom 44. Správne to má byť takto:
Super, chyba sa odstránila, ale ešte je tam menšia maličkosť. Posledných 12 dvojstĺpcov sa nezačína na riadku 45 (A45:X58), ale na riadku 46 (A46:X59). Na Riadku 45 by mala byť nová strana.
Tak to by tá podmienka mohla nakoniec vyzerať ešte trochu inak:
Teraz kopírovanie funguje presne, pokiaľ pri testovaní nenarazím na nejaký skrytý problém, tak to považujem za ukončené. Zatiaľ som nenašiel, ako to označiť za ukončené.
Mám ešte jednu špecialitku, ale tú v novom vlákne
Veľmi pekne ďakujem. Ste maestro. " Kdo umí ten umí, kdo neumí ten ..."
Nahoře pod dotazem je zelená fajfka...