Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
Jak pomocí VBA zapsat do buňky aktuální čas. Zareaguje například na změnu v jiné buňce. Stisk tlačítka na listu atd.
V tomto článku dozvíte jak na vkládání data (času) do buněk pomocí VBA v Microsoft Excelu. Pro přehlednost je dělen do kapitol:
V tomto článku předpokládám, že umíte použít funkce pro vložení datumu (času) pomocí VBA. Pokud ne doporučuji si tento článek přečíst.
Nejprve musíte odchytit událost, při změně v buňce.
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "Změněna byla buňka: " & Target.Address
End Sub
Do dialogového okna se vypíše adresa buňky.
Podobně lze vypsat řádek a sloupec
MsgBox "Změněna buňka v řádku: " & Target.Row
MsgBox "Změněna buňka ve sloupci: " & Target.Column
Budete-li chtít odchytávat událost jen pro druhý sloupec.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
MsgBox "Změněna byla buňka: " & Target.Address
End If
End Sub
Například do buňky A1 zapíšete aktuální čas.
Range("A1").Value = Format$(Now, "yyyy/mm/dd hh:nn:ss")
Případně takto:
Cells(1, 1).Value = Format$(Now, "yyyy/mm/dd hh:nn:ss")
Takže celkový kód, kdy pokud dojde ke změně v sloupci 2, bude do buňky A1 zapsán aktuální datu a čas.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
Cells(1, 1).Value = Format$(Now, "yyyy/mm/dd hh:nn:ss")
End If
End Sub
Pokud chcete zapsat do stejného řádku, ve kterém došlo ke změně. Což už je jednoduchý. Zjistíte řádek.
i = Target.Row
Na totmo řádku zapíšete:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
i = Target.Row
Cells(i, 1).Value = Format$(Now, "yyyy/mm/dd hh:nn:ss")
End If
End Sub
Při provádění události Worksheet_Change může dojít k zacyklení. Událost Change - provede se zápis do buňky, což je opět událost Change atd. Takže kód pro zápis do buňky je nutno doplnit o vypnutí zachytávání této události.
Application.EnableEvents = False
' zapsání do buňky
Application.EnableEvents = True
Poznámka: Děkuji Petrovi Pecháčekovi z excelplus.net za rychlý postřeh, je rychlejší než moje schopnost dopsat článek.
V přípravě
V případě námětu můžete doplnit v komentářích.
Článek byl aktualizován: 19.09.2020 11:06
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: 15.06.13 09:19
Protože dost často pročítám komentáře, věřím, že někomu se hodí:
Tato procedura (nejen ona) se dá použít i tak, aby jste náhodně či i někdo vědomně nemohl údaj o čase a datumu změnit nebo smazat a to uzamčením listu. Pro sloupec 2 nebo i jiné, které je třeba plnit daty nastavit "neuzamykat" (vybrat buňky, které chceme mít odemčené - formát, zámek, uzamčeno - nezatrhávat volbu - implicitně je zatrženo). Excel by ovšem při zadání dat a následném spuštění rutiny hlásil, že nelze vkládat do uzamčené buňky. Následující úprava kódu to vyřeší. Vhodné až nezbytné (to záleží jaké mají vaši uživatelé znalosti a na důležitosti vašich dat) je nastavit pro čtení a úpravy kódu VBA heslo (Tools, VBAProject_properties..., karta Protection). Jinak by uživatel, který nemá oprávnění pro změny, mohl nahlédnout do VBA a zjistit, jakým heslem lze odemknout list.
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect Password:="vaše heslo"
procedura popsaná výše (nebo i jiná)
ActiveSheet.Protect Password:="vaše heslo"
End Sub
List nemusíte uzamykat před použitím. Při vložení prvního (a každého dalšího) údaje a spuštění takto upravené rutiny se list uzamkne.
Pozor na malé úskalí - pokud sešit odemknete ručně a opět ručně zamknete, ale s jiným heslem (omyl, záměr?!?!), než je uvedeno v kódu, stane se to, že kód list neodemkne, zahlásí chybu, excel vložený údaj v buňce povolí a uloží, ale kód neproběhne (v našem případě nezapíše datum ani čas zápisu). Chybové hlášení spustí okno pro spuštění ladění kódu a teď - v případě že máte spuštění VBA povoleno jen s heslem - zvýrazní se v okně hlášení pouze tlačítko pro ukončení (End). Tlačítku Debug nelze použít. Pokud ovšem pro VBA heslo nemáte (nedoporučuji), pak lze tlačítko "Debug" použít. Uživatel se tak přepne do VBA pro "úpravu" kódu a tam lze přečíst původní (nyní nesprávné) heslo pro odemčení listu. To sice neoprávněnému neumožní odemknout list, ale nemusí nic říci, jen nahlásí že "To ňák blbne". Další si lze domyslet, ale to už je na jinou diskuzi ...
Na závěr díky autorovi za dost dobrý stránky :-), návody, nápady a rady.
Možná, že lze nějak pomocí kódu i ručně zapsané heslo zjistit a použít. To ale neumím, pokud to jde. Jde to ale jinak. Obecně - hesla v MSOffice jsou jak záclony.
Přidáno: 15.06.13 20:28
To Stanislav Roth: Určitě se někomu bude hodit.
Přidáno: 21.09.14 17:58
Dobrý den, Potřeboval bych do listu vložit zaškrtávací políčko a aby se po zaškrtnutí políčka zapsal aktuální čas do určité buňky. Jak na to?
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 - 2025 |