Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
Reagujte na změnu v listu pomoci události Worksheet_Change.
Tato událost je jednou z nejpoužívanějších při programování ve VBA. Reaguje na změny provedené na listu. Její deklarace je:
Private Sub Worksheet_Change(ByVal Target As Range)
Jednoduchý kód který při změně na listu vyvolá dialogové okno s hláškou: Došlo ke změně na listu.
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox ("Došlo ke změně na listu.") End SubZměna v buňce, kterou provede událost Worksheet_Change, může být příčinou zacyklení. V případě do události vložíte místo dialogové hlášky nějakou změnu na listě (vyplnění buňky tetem), pokud toto operaci správně neošetříte, zaděláte si na problém. Dojde k zacyklení.
Příklad: Provede se změna na listu tato vyvolá událost, která provede změnu na listě, ale tato změna je změnou na listu což provede opět událost ... takže jste v nekonečné smyčce. Proto pokud tato událost provádí na listě změnu musí dojít k dočasnému vypnutí...
V ukázce je chyba která kousne Excel !!
Private Sub Worksheet_Change(ByVal Target As Range)
Range("C5").Select
ActiveCell.FormulaR1C1 = "test"
End Sub
Pro zamezení zacyklení slouží příkaz: Application.EnableEvents nejprve FALSE a poté vrrácení na TRUE.
Application.EnableEvents = False
... Potřebná změna v buňce ...
Application.EnableEvents = True
Kód zapíše do buňky A1 Správne heslo., pokud do buňky B2 bude zadano HESLO, jinak zapíše do A1 text Nesprávné heslo.
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B2").Value = "HESLO" Then
Application.EnableEvents = False
Range("A1").Select
ActiveCell.FormulaR1C1 = "Správne heslo."
Application.EnableEvents = True
Else
Application.EnableEvents = False
Range("A1").Select
ActiveCell.FormulaR1C1 = "Nesprávné heslo."
Application.EnableEvents = True
End If
End Sub
Máte nějaké zajímavé příklady, které používají událost Worksheet_Change (změna listu)? Můžete doplnit do komentářů.
Článek byl aktualizován: 19.09.2020 11:07
Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.
Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.
Přidáno: 16.03.14 10:13
Dobrý den, poradte mi prosim, jak zmenit v sesitu na kazdem z jeho listu hodnotu v jedne konkretni bunce. Hodnota v bunce muze byt bud 1 nebo 0. Diky Petr
Přidáno: 09.07.14 14:54
To Petr: For sh = 1 To Worksheets.Count
Sheets(sh).Cells(1, 1) = 1
Next sh
Přidáno: 21.08.14 13:07
dobrý den, mohl by jste mi poradit jak můžu v jednom listě vytvořit více maker, které se spouští změnou v sešitu? pokaždé musím mí název Worksheet_Change a tak mi připadá že můžu mít napsaný jenom jedno makro. Rád bych ještě poprosil o radu. mam range("A1:A10")kde postupně zapisuji např 1, 2, 3 a já podle toho co tam napíšu, tak bych rád aby se ve vedlejší buňce podle zrovna zapsané hodnoty zase něco objevilo. Děkuji za radu Michal
Přidáno: 07.10.14 15:00
To Michal: -- 1) použiť "If" alebo "Select Case" + podľa potreby http://office.lasakovi.com/excel/vba-teorie-zaklady/promene-excel-vba/ 2) detto + napr If Cells(1, 1) = 5 Then Cells(1, 2) = "Podmienka splnená"
Přidáno: 13.01.15 10:39
Je nějak možné odchytit typ změny? Myslím například změna hodnoty v buňce, smazání sloupce, smazání řádku atd?
Přidáno: 05.03.15 11:19
Dobrý den, potřebovala bych poradit, jak vytvořit Makro k uskutečnění těchto kroků: Mám jeden pevný hlavní list "Evidence" a postupně budu vytvářet další listy "Josef", "Marie" atd. dle potřeby. Chtěla bych se zeptat, zda by šlo vytvořit makro pro jednotlivý přesun dat z přidávaných listů, tak aby mi vzalo určité informace z aktuálně otevřeného listu (Josef, Marie,...) a přeneslo je do hlavního listu Evidence, tak aby data přibývala na nových řádcích. Např. údaje z listu Josef budou na ř. 3, údaje z listu Marie budou na ř. 4. listu Evidence. Takto by data na řádcích přibývala s přibývajícími listy. Toto makro bych pak chtěla spouštět vždy z jednotlivého listu např. skryté pod tlačítkem. Předem děkuji za odpověď
Přidáno: 12.04.16 10:35
Ahojte, neviete preco mi nefunguje toto makro? V bunke P5 mam rozbalovacie pole s Yes a No a chcem aby pri zmene mi pustilo pridelene makra. Dik Private Sub Worksheet_Change(ByVal Target As Range) If Range("P5").Value = "Yes" Then Application.EnableEvents = False Call Makro3 Application.EnableEvents = True Else Application.EnableEvents = False Call Makro4 Application.EnableEvents = True End If End Sub
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2024 |