Stránka 1 z 1

Excel - Makro ke zkopírování daných dodnot z listu na list

Napsal: 23 úno 2014 18:34
od Tomek001
Dobrý večer,
tvořím si excelovský sešit na automotické zpracování dat a nemohu se pohnout, protože neovládám makra.
Sešit, který je ke stáhnutí zde http://leteckaposta.cz/412336316 obsahuje list KIN, na kterém jsem zabarvil 3 důležité sloupečky o které mi jde. Hodnoty ve žlutých sloupcích potřebuji pomocí makra nakopírovat na list Kinetic do zažlucených spoupců. Problém je, že ty hodnoty potřebuju rozdělit podle čísla, které je uvedeno v zeleném sloupci.
Tzn. všechny hodnoty ze žlutých sloupců na listě KIN kterým přísluší hodnota "0" (zelený sloupec) potřebuji nakopírovat na list Kinetic do žlutých sloupců C a E. Dále "jedničky " nakopírovat do žlutých slopuců AM a AO a tak dále. To samé udělat pro zbývající hodnoty (v tomto případě až do 12). Toto je jen příklad souborů kterých mám spoustu a nemusí končit u čísla 12, ale třeba 20 - maximum ale nedokážu odhadnout. Nicméně struktura listu KIN je vždy stejná - vždy se ale různí počet řádků.

Moc Vám děkuji za konkrétní makro.

Hezký večer.

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 24 úno 2014 15:20
od Azuzula
Zdravím,
makrem by to šlo taky, ale můžu nabídnout už hotovou jednoduchou funkci (vzorec) který najde ty správné hodnoty.

Kód: Vybrat vše

Function NajdiVice(Hledat As Variant, Oblast As Range, prohledat_sloupek As Integer, vzit_sloupek As Integer, poradi As Integer) As Variant
'funkce na vyhledání položky v zadaném sloupci a v zadaném pořadí
Dim a As Long, x As Integer
x = 1
With Oblast
    For a = 1 To .Rows.Count
        If .Cells(a, prohledat_sloupek) = Hledat Then
            If x = poradi Then
                NajdiVice = .Cells(a, vzit_sloupek)
                Exit Function
            Else
                x = x + 1
            End If
        End If
    Next
End With
NajdiVice = CVErr(xlErrNA)
End Function

Funkci nakopírujte do klasického modulu jako makro a do buněk kam potřebujete hodnoty zapište vzorec.
příklad vzorce pro vzorový sešit a buňku:
do C38: =NajdiVice(0;KIN!$A$97:$AL$2762;10;1;B38)
do E38: =NajdiVice(0;KIN!$A$97:$AL$2762;10;36;B38)
Pro bližší info si stačí označit buňku se vzorcem a kliknout na tlačítko fx v "Řádku vzorců".

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 25 úno 2014 21:46
od Tomek001
Dobrý večer, děkuji moc za reakci.
Zatím si myslím, že je to perfektní - jen nedá se to udělat tak, aby na tom listě Kinetic místo těch nulových hodnot na konci (které vlastně nesplňují zadanou podmínku) bylo třeba =NEDEF()?
Vím, že se to dá udělat pomocí funkce KDYŽ - ale těch hodnot bude v sešitě spousta, tak chci raději ty vzorce co nejvíce zefektivnit. Tím se chci teda optat, jestli to NEDEF() nelze zaimplementovat do toho modulu (?).

Moc děkuji a omlouvám se za svůj amaterismus.

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 25 úno 2014 22:23
od Azuzula
Ano, jde to. Na možné chyby a jejich zobrazení jsem zapoměla.
Na konec funkce přidejte řádek s:

Kód: Vybrat vše

NajdiVice = CVErr(xlErrNA)

Doplněno i v předchozím příspěvku.

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 25 úno 2014 23:00
od Tomek001
Výborné - moc Vám děkuji! :-)
PS: A proč se ty "chyby" zobrazují u všech čísel tak jak mají, ale pro nulu to nefunguje? :-)

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 26 úno 2014 11:39
od Azuzula
Teď nevím jaké nuly myslíte. Nuly ve zdroji kde se hledá, nebo ty co funkce vracela na konci sloupečku když nenašla shodu podle zadání?

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 26 úno 2014 17:51
od Tomek001
Mám namysli nulu ve zdroji kde se hledá:
=NajdiVice(0;KIN!$A$97:$AL$2762;10;1;B38)
stále se tam na konci sloupečku objevují nulové hodnoty když se nenalezne shoda (viz obrázek).

Od jedničky už to funguje:
=NajdiVice(1;KIN!$A$97:$AL$2762;10;1;B38)
=NajdiVice(2;KIN!$A$97:$AL$2762;10;1;B38)
=NajdiVice(3;KIN!$A$97:$AL$2762;10;1;B38)
...

Děkuji za Váš čas :-)

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 26 úno 2014 19:42
od Azuzula
Testováno v Excelu 2007 a 2010. Nikoho s verzí 2013 neznám abych to otestovala, takže netuším v čem je problém.
Jedině někdo s vaší verzí excelu kdo by se na to podíval. Tady už asi víc nezmůžu.

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 26 úno 2014 22:59
od Tomek001
Já už vím - zkuste si číslo 2762 změnit na na nějaké vyšší, třeba 10000 (viz dole). Jak jsem totiž psal, počet řádků může být (silně) odlišný v každém záznamu - tak jsem si to do budoucna pojistil takto vysokou hodnotou
=NajdiVice(;KIN!$A$97:$AL$2762;10;1;B38)
==>
=NajdiVice(;KIN!$A$97:$AL$10000;10;1;B38)

Re: Excel - Makro ke zkopírování daných dodnot z listu na li

Napsal: 27 úno 2014 08:48
od Azuzula
Aha, už to chápu, nula je stejná jako prázdná buňka proto po zvětšení oblasti to vyhazovalo nuly. Jasné.

Spíš než zvětšování oblasti na tvrdo, bych použila následující vzorce pro dynamický výpočet řádků oblasti dat. Rychlostně to bude možná pomalejší než původně pevně definovaná oblast KIN!$A$97:$AL$2762, ale takhle se bude zvětšovat a zmenšovat podle množství řádků vstupu a zároveň bude rychlejší než prohledávání všech 10tis řádků.

buňka C38: =NajdiVice(0;POSUN(KIN!$A$97;0;0;POČET(KIN!J:J);36);10;1;B38)
buňka E38: =NajdiVice(0;POSUN(KIN!$A$97;0;0;POČET(KIN!J:J);36);10;36;B38)