Stránka 1 z 1
Makro - kopírování hodnot v tabulce
Napsal: 04 dub 2012 11:34
od VALL
ahoj,
Pokouším se napsat makro, které za daných podmínek zkopíruje hodnotu do další buňky. Chci, aby se spustilo při každém zápise v sešitě PomVypocet.
Podmínka:
If Range("a6") = "" Then
Exit Sub
ElseIf Range("b6") <> "" Then
Range("a7") = Range("b6").Value
Aby to fungovalo i pro další řádek, přidal jsem další podmínku IF, která ale nefunguje. Nevím proč.
Podmínka2:
ElseIf Range("b7") <> "" Then
Range("a8") = Range("b7").Value
Nicméně tabulka má více řádků, takže výše uvedený postup je dost pracný. Hledal jsem i řešení přes proměnné, ale tam se mě nepodařilo nic vykoumat.
Cílem je kód. Který bez ohledu na počet řádků, vždy provede tento úkon:
ElseIf Range("b6") <> "" Then
Range("a7") = Range("b6").Value
Oblasti range nahradit proměnnýma tak, aby se makro vždy podívalo na další řádek, zda splňuje uvedenou podmínku u buněk +1.
Re: Makro - kopírování hodnot v tabulce
Napsal: 04 dub 2012 13:13
od Azuzula
Ahoj,
spuštění makra po každé změně v listu zařídí:
Kód: Vybrat vše
Private Sub Worksheet_Change(ByVal Target As Range)
'volání makra které se má spustit nebo přímo to makro
End Sub
stačí vložit do listu (v editoru VBA) ve kterém se má automaticky spouštět to makro.
Proměnné v range se dají napsat třeba jako
Kód: Vybrat vše
'Range("A" & i).select kde i = číslo řádku, které se dá získat třeba pomocí cyklu
For i = 1 to 7
'tělo cyklu
Next
'nebo Cells(i, j).select kde i = číslo řádku, j = číslo sloupku.
'přechod na další řádek se dá hezky udělat pomocí
activecell.offset(1, 0).select
A nakonec blokové If - nezapoměňte pokaždé ukončit tagem End If, v sešitu to tam v jednom makru chybělo proto asi ta chyba, jinak tam jinou chybu nevidím.
Re: Makro - kopírování hodnot v tabulce
Napsal: 04 dub 2012 14:32
od VALL
Doplnil jsem End If a stejně to nefunguje :(.
Díky za nakopnutí v druhém kódu. Mám ale obavu, že v případě většího rozsahu např., 1000 řádků, se stane sešit nepoužitelným pro práci.
Re: Makro - kopírování hodnot v tabulce
Napsal: 04 dub 2012 19:32
od cmuch
Pokud se do makra na začátek dá Application.ScreenUpdating = False a na jeho konec
Application.ScreenUpdating = True tak jednak nebude vidět, že makro něco dělá a zároveň průběh bude rychlejší.
Re: Makro - kopírování hodnot v tabulce
Napsal: 05 dub 2012 08:35
od VALL
Díky všem za radu,
Pokusil jsem se to udělat dle rady Azuzuly a někde se mě to zacyklilo. Když doplním hodnotu do B6 tak vše ok, výpočet proběhne.
Když doplním hodnotu do B7, tak se to zacyklí.
kód:
Kód: Vybrat vše
Private Sub worksheet_change(ByVal target As Range)
If Range("A6") = "" Then
Exit Sub
End If
For i = 6 To 16
If Range("B" & i) <> "" Then 'b6
Range("A" & i + 1) = Range("B" & i).Value 'A7, B6
ElseIf Range("B" & i + 1) = "" Then 'B7
Exit Sub
End If
Next
End Sub
Už si nevím rady
Re: Makro - kopírování hodnot v tabulce Vyřešeno
Napsal: 05 dub 2012 09:29
od cmuch
Do kódu doplň Application.EnableEvents = False a Application.EnableEvents = True
Ty jak přepíšeš hodnotu z jedný buňky do druhý tak znovu vyvoláš tento proces.
Kód: Vybrat vše
Application.EnableEvents = False
Range("A" & i + 1) = Range("B" & i).Value
Application.EnableEvents = True
Re: Makro - kopírování hodnot v tabulce
Napsal: 05 dub 2012 09:44
od VALL
dík, funguje skvěle.
--- Doplnění předchozího příspěvku (05 Dub 2012 10:01) ---
Můžu tě ještě požádat k čemu se obecně Application.EnableEvents používá a jaký je jeho význam. něci jsem vygooglil, ale jsem z toho zmatený.
Re: Makro - kopírování hodnot v tabulce
Napsal: 05 dub 2012 10:26
od cmuch
Používá se v událostech Excelu (SelectionChange, Change) kdy se provádí nějaké akce s následnou změnou buněk nebo jejich opravu.
Tím, že v těle procedury události změníte obsah buňky, můžete spustit cyklus, kdy se stále znovu a znovu vracíte do události,
protože se událost vyvolá vždy při změně znovu.
Použij vždy před jakoukoliv změnou vlastnost EnableEvents,
která dočasně vypne zpracování událostí objektu a umožní vám provést změny bez nového vyvolání události.
Syntaxe:
Application.EnableEvents = True Zapne zpracování událostí
Application.EnableEvents = False Vypne zpracování událostí