| Kdo je online |
Hosté online: 2
Žádný člen není online
Registrovaní členové: 536
Neaktivovaní členové: 48
Nejnovější člen: Libor
|
|
| Pohotovost Excel |
 |
|
|
|
| Statistiky |
 |
|
|
|
|
Doplněk Kalendář |
Vkládání datumu do buňky patří k častým úlohám. Asi každý uživatel zná funkci DNES() vracející aktuální datum. Nicméne nezřídka požadujeme, aby "dnes" bylo zítra "včera". Pro tyto účely slouží ke vložení pevného datumu klávesová zkratka Ctrl + ; (středník). Co když ale potřebujeme načíst datum až na základě pohledu do kalendáře (příští středa, za 14 dní, poslední sobota v červnu, ...)?
Jako první se nabízí otázka, kde vzít kalendář. Jednou z možností je sáhnout si pro Ovládací prvek Kalendář (Calendar, je potřeba jej ručně přidat v průběhu instalace samotných Microsoft Office, viz součásti Microsoft Access), případně roletkovou verzi kalendáře představovanou prvkem Microsoft Date and Time Picker (DTPicker, MSCOMCT2.OCX, nutná registrace v systému příkazem regsvr32.exe MSCOMCT2.OCX). Na listu mám bohužel špatnou zkušenost se zobrazováním prvku Kalendář (občas chybné vykreslení, zpracování vlastnosti Visible aj.), navíc u obou prvků postrádám štábní kulturu odpovídající dnešním standardům na vzhled. Na obrázku je prvek Kalendář vlevo dole a Data and Time Picker vpravo nahoře.

Velmi dobrý nápad měl svého času tuším John Walkenbach, když přišel s nápadem sestavit takový kalendář z prvků plovoucího panelu nástrojů. Já sám jsem si takový v Excelu 2003 udělal a fungoval by dodnes, kdyby pár chytrých hlav nepřišlo v Excelu 2007 s Ribbonem. Ten sice umí přelouskat doplňky ze starších verzí Excelu včetně panelů nástrojů, ale ignoruje původní rozvržení ovládacích prvků (pro kalendář je potřeba 7 sloupců a 7 řádků včetně hlavičky plus místo pro další obslužné prvky). Pás karet přitom nezvládá plovoucí panely a maximálně nabízí 3 řádky pro umístění prvků. Teoreticky by šlo nasadit v Pásu karet prvek Galerie (gallery, viz článek), nicméně možnosti správy ve VBA (přes tzv. Callbacks) jsou velmi omezené. Pokud jste programátory, pak se nabízí zpracování kalendáře ve Visual Studiu. Vidím jako řešení Podokno úloh (TaskPane), které nakonec může být i plovoucí a v něm standardní ovládací prvek kalendáře z Windows Forms. Vraťme se ale na začátek k řešení, které je pro smrtelníky nejschůdnější - vlastní formulář zobrazený v pravou chvíli a na správném místě a bez ohledu na verzi Excelu.
Abych vám čtenářům ušetřil drobná trápení týkající se návrhu a správy prvků pro jednotlivé dny, výpočtu čísla týdnů podle ISO normy, zpracování událostí, oříznutí formuláře o titulkovou lištu a jeho umístění na základě vybrané buňky, nabízím vám dnes doplněk s přístupným kódem VBA ke studiu i použití v praxi. Uvítám komentáře a návrhy rozšíření.


 posun o jeden měsíc či rok dozadu a dopředu
vkládá pohled na kalendář do listu
označení pro dnešní den
nastaví kalendář pro zobrazení dnešního dne v kalendáři
zavírá formulář
Doplněk najdete v sekci Ke stažení a zde je přímý odkaz.
|
|
Komentáře |
, 01.03.2009
Krása snoubící se s nádherou. Moooc děkuji.
Byla by dobrá korekce polohy formu, pokud neni maximalizovane okno sešitu v aplikaci.
Vůbec nechápu proč řešíte polohu formu přes funkci Min...? Je to osetreno pro pripad ze je vybrana oblast více buněk?
Me.Left = WorksheetFunction.Min(RL + 35 + Selection.Cells(1).Offset(0, 1).Left, RR - Me.Width)
Me.Top = WorksheetFunction.Min(RT + 40 + Selection.Cells(1).Offset(0, 1).Top, RB - Me.Height)
Funguje to fakt užasně...
Náměty na rozšíření:
1. svátky - např. v rámečku
2. načtení datumu z activ. buňky (pokud je) a inicializace kalendare na měsíc dle datumu
j. |
, 01.03.2009
Neminimalizované okno pravděpodobně neošetřím. Je to alchymie a dost dobře to nejde (nemluvě o lupě, rozdělení okna atd.).
Funkce MIN je tam proto, aby dialog zůstal na monitoru a "nevyjížděl" ven dole a vpravo.
Se začleněním svátků (po najetí myškou na den) a načtením aktivního datumu počítám. |
, 01.03.2009
S oknem se vypořadám...
Po úpravách se mi procedura "lblControl_Click" provádí opakovaně aniž k tomu je důvod.
Po vložení datumu na sheet mi jede Worksheet_Change s Application.EnableEvents = False, ale stejně se mi vrátí do "lblControl_Click". Může to být chováním třídy? S třídama se moc nekamaradim... |
, 01.03.2009
Jěště jedna otázečka.
Formulář je nemodální, jak se dá aktivovat sheet aby šlo např. mazat klávesou delete? |
, 02.03.2009
K dispozici je verze 0.9c. Přidány byly svátky a zvýraznění datumu podle aktivní buňky. Formulář z důvodů další funkcionality nyní předkládám v základní formě modální. Přiklání se tak více koncepci dostupnosti z kontextového menu (bez titulkové lišty, pro aktivní buňku, nepřesunutelný). |
, 02.03.2009
Svátky podle jmen taky užitečná věc.
Měl jsem na mysli svatky jako pracovní volno, proto ten rámeček.
Moc neprefuruji spouštění z kontext. menu a jěště jako modální. Příhodnější mi příjde zjevení u buněk typu date, nebo s možností volby u všech buněk.
Načtení datumu z activ. buňky (pokud je) a inicializace kalendare na měsíc dle datumu mi příjde dost užitečné, na dnes se lehce dostanu tlačítkem. |
, 02.03.2009
Objevil jsem jednu vec, pri načtení datumu z buňky nekorektně řadí na dny v týdnu. Např. 17.3.2009 zobrazuje jako Čt, ale je to úterý... |
, 04.03.2009
Chybka byla (doufám) opravena cca hodinu po zveřejnění aktualizace, nad prvky "pracovního" kalendáře pouvažuji, ono musí to mít svou hranici, svého času jsem měl kalendář o dvou záložkách cca 10 x 10 cm, kde byly i astrofunkce, výpočty s časem atd. Kód je dostupný, není problém zobrazovat titulkovou lištu a změnit modalitu. Další příspěvky na zlepšení prosím soukromě přes ICQ, mail apod. |
, 04.03.2009
Každopádně diky, me to hodne pomohlo, a jako studijni materiál výborné. Všichni kdo dokáži takto rychle vytvořit něco užitečného mají můj obdiv. Mnoho zdaru... |
|
|
Přidat komentář |
|
Pro přidání komentáře musíte být přihlášeni.
|
|
|