Přeskočit navigaci | Přeskočit na novinky

Jste zde: Úvodní stránka » excel » vba-listy-sheet » Worksheet_Change-udalost-listu

Worksheet_Change - událost listu

Videokurzy Excel

Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:

Reagujte na změnu v listu pomoci události Worksheet_Change.

Úvodem do 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)

Příklad 1

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 Sub

Zacyklení Worksheet_Change

Změ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í.

Zacyklení příklad

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

Zamezení Zacyklení

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

Příklad 2

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

Závěrem

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

Odměna

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.


Pavel Lasák - autor webu

Pavel Lasák

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ů.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil


Komentáře


Petr

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

Jojo

Přidáno: 09.07.14 14:54

To Petr: For sh = 1 To Worksheets.Count Sheets(sh).Cells(1, 1) = 1 Next sh

Michal

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

Jojo

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á"

Hat

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?

Melian

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ěď

Marek

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






Excel


Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Reklama


TOPlist Licence Creative Commons webarchiv rss XML

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 |