Excel - zpracování celé tabulky pomocí makra

Programy pro práci s textem, tabulkami, prezentacemi

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod pitris24 19. 3. 2010 22:29

Ahoj,

chěl bych poprosit o radu jak docílit toho, abych makrem zpracoval celou tabulku.

Příklad:

tabulka o třech sloupcích a 50 řádcích např.

Sloupec A=cena sloupec B=množství sloupec C = celková cena (cena x množství)

Jak docílit toho, aby se pomocí makra spočetlo všech 50 řádků? Řekněme že chci tabulku počítat denně a pokaždé je tam jiný počet řádků. Případ je to značně zjednoudušený ale vystihuje podstatu toho k čemu se potřebuji dobrat.

Díky
Lenost je hybnou silou pokroku.
<odkazy jsou zakázány>
pitris24
Junior
Uživatelský avatar

Odeslat příspěvekod krasan1 20. 3. 2010 09:39

Zkusil bych maticový vzorec {=SUMA(A1:C50)} . Kdyby jsi potřeboval ze součtu vyloučit nuly, nebo písmena, tak to se maticemi dá taky řešit.
krasan1
Kolemjdoucí

Odeslat příspěvekod pitris24 20. 3. 2010 21:08

Potřebuji tam vyhodnocovat víc věcí - mj. je tam cena a cenový koeficient (na řádku) kterých je asi pět různých. Výsledek je tedy cena krát cenový koeficient (který je daný písmenem a v makru ho musím převést na číslo).

To mi na řádku funguje, jak ale docílit toho aby mi makro po spuštění projelo všechny neprázdné řádky v tabulce v daném sloupci ve kterém to potřebuji spočítat?
Lenost je hybnou silou pokroku.
<odkazy jsou zakázány>
pitris24
Junior
Uživatelský avatar

Odeslat příspěvekod petrfilipi 20. 3. 2010 21:55

Zadání není sice úplně jednoznačné, ale třeba takto:

Sub nasobeni()
For i = 1 To 500
If IsEmpty(List1.Cells(i, 1)) = False Then List1.Cells(i, 3) = List1.Cells(i, 1) * List1.Cells(i, 2)
Next i
End Sub

Makro se jmenuje "nasobeni". Funguje to tak, že projíždí řádky 1..500. Když není 1. buňka na právě zpracovávaném řádku prázdná, tak to do 3. buňky uloží součin 1. a 2. buňky.
Program nekontroluje 2. buňku (to by se do podmínky v cyklu muselo přidat "and IsEmpty(List1.Cells(i, 2)) = False"). Program zpracovává prvních 500 řádku v Listu 1. Ze zadání není patrné, zdali je tabulka souvislá či nikoli.
Než jsem před rokem přišel na funkci "IsEmpty", tak jsem prázdné buňky kontroloval pomocí funkce "if cells (i,1)<>Empty". Jenže tahle funkce vrací pravdu i tehdy, když je obsah buňky roven nule. Koukal jsem na to jako trubka. Jo, VBA není někdy sranda.
Jako podmínka v makru by mohlo být asi i toto: if List1.Cells(i, 1) <>"" then ...
Petr Filipi
petrfilipi
Junior

Odeslat příspěvekod pitris24 21. 3. 2010 10:11

Děkuji moc - asi jsem to pochopil, nicméně nefunguje :( Resp mi to neproběhne

tabulku mám takovou

A | B | C
0,72 | 100 | výsledek

Navržené řešení vyhovuje a tabulka nemá prázné řádky ani buňky (které se počítají).
Ale proč mi to neběží? :hm :-)

Upřesnění: Běží, ale s "activesheet". List1 se mu nějak nelíbí (ale název jsem neměnil). Každopádně díky moc za tip !
Lenost je hybnou silou pokroku.
<odkazy jsou zakázány>
pitris24
Junior
Uživatelský avatar

Odeslat příspěvekod petrfilipi 22. 3. 2010 18:20

Problém s List1 může být v tom, že když v Excelu smažete jeden ze tří defaultních listů a pak vytvoříte nový, tak Excel čísluje dál, tzn. nehledá volná čísla. Pokud spustíte editor maker (otevřete Excel, stiskněte Alt+F8, napište nějaký název makra a klikněte na Vytvořit, pak v levé části editoru vidíte detaily VBA Projektu (seznam objektů, modulů, ...). Tak se tedy podívejte, jak se jmenuje list s makrem, kde nefunguje List1, a napište tento název namísto List1.
Jinak pokud to funguje s ActiveSheet, tak není co řešit.

Petr Filipi
petrfilipi
Junior

Odeslat příspěvekod pitris24 28. 3. 2010 12:40

Mám ještě jeden dotaz....

potřeboval bych cyklem vyplnit řádky vzorcem funkce svyhledat

Worksheets(2).Activate

Application.ScreenUpdating = False

For i = 16 To 1000

If IsEmpty(Cells(i, 1)) = Fale Then Cells(i, 14) = "=KDYŽ(JE.CHYBHODN(SVYHLEDAT(D16;List1!$1:$65536;4;0));"";SVYHLEDAT(D16;List1!$1:$65536;4;0))"

Next i

pokud smažu "=" těsně u KDYŽ, buňky se vyplní, pokud tam "=" těsně u KDYŽ nechám, objeví se chyba Run-time error 1004 Application-defined or object-defined error

Lze to nějak ošetřit?
Lenost je hybnou silou pokroku.
<odkazy jsou zakázány>
pitris24
Junior
Uživatelský avatar

Odeslat příspěvekod obcasny_navstevnik 28. 3. 2010 15:27

Ve VBA nazvy do bunek vkladanych funkci a oddelovace argumentu funkci musi byt nelokalizovane do narodni mutace, tedy anglicke
Vzorec pro vlozeni ve VBA by mohl vypadat takto:
Kód: Vybrat vše
...
Cells(i, 14).Formula = "=IF(ISERROR(VLOOKUP(D16,List1!$1:$65536,4,0)),vbnullstring,VLOOKUP(D16,List1!$1:$65536,4,0))"
...
obcasny_navstevnik
Junior

Odeslat příspěvekod pitris24 28. 3. 2010 16:22

Perfektní - děkuji ! Ta informace o lokalizaci bude určitě užitečná i pro ostatní nováčky.

Vzorec ale trošku zlobí, to vbnullstring se vloží do buňky jako text a výsledek je #název? - pokud místo toho dám "" tak vše funguje.

edit: + je nějak nutno ošetřit absolutní adresu (D16) ale na to už nějak přijdu :hm
Lenost je hybnou silou pokroku.
<odkazy jsou zakázány>
pitris24
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků