Dnes se podíváme ještě na jednu verzi „buňkového Gantta“. Ta nestaví ani na skládaném pruhovém grafu, ani na podmíněném formátu. Možná si vybavíte Walkenbachův příklad vykreslování grafu ze čtverečků pomocí funkce OPAKOVAT. A my si tuto metodu ještě o kousek vylepšíme.
Walkenbach ve svém postupu použil symbol čtverečku, který po stranách obsahoval drobnou mezeru. V málo používaném, ale báječném „wingdings“ písmu Segoe UI Symbol ovšem najdeme symboly vhodnější, které k sobě přiléhají.
Šikovným vzorcem nyní potřebujeme vykreslovat mezery (spodní čára, pro kterou by byla vhodnější mezera stejně široká jako čtvereček, ale jíž jsem nenašel) a čtverečky představující jeden den události (činnosti, akce). Je tu ovšem jeden problém. Musíme uvažovat měsíce o 28, 29, 30 a 31 dnech. Ve chvíli, kdy si postavíme z těchto bloků rok, je potřeba ještě korigovat únorový jeden den (čtvereček navíc). Obrázek ukazuje zjednodušenou verzi pro měsíce s 31 a 30 dny.
Nad vykresleným grafem jsem se rozhodl vypisovat dny, do kterých v daném měsíci akce zasahuje. Ano, tušíte správně, naběhl jsem si s pomlčkou, kterou chci zobrazovat uprostřed a musím tedy šikovně půlit měsíc jak pro liché, tak sudé počty dnů. Vzoreček není nijak složitý, jen je dobré si uvědomit, že levá hranice značí „od, včetně, vykresluj“ a pravá „do, bez, nevykresluj“.
A5: =OPAKOVAT(„_“;A4-1)&OPAKOVAT(„▇“;E4-A4+1)&OPAKOVAT(„_“;31-E4)
Symboly není možné dost dobře zobrazit na webové stránce, proto vzorec odsud nekopírujte, jen prostudujte.
Jak nastavit šířku krajních sloupců? Jednoduše. Do spojité buňky si naskládejte přesně tolik symbolů, kolik má měsíc dní a okraje sloupců zarovnejte. Po zpracování všech čtyř stavebních bloků si poskládejte rok. Únor si pohlídáte přes událostní proceduru listu Worksheet_Change aplikovanou na buňku udávající rok.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Private Sub Worksheet_Change(ByVal Target As Range) Dim rngSledovanaBunka As Range 'nastavení sledované buňky Set rngSledovanaBunka = Range("rngRok") 'změnila se sledovaná buňka? If Target.Address = rngSledovanaBunka.Address Then 'test na 29. únor daného roku If Month(DateSerial(rngSledovanaBunka, 2, 29)) = 3 Then 'nepřestupný rok 'změna šířky sloupců pro únor Range("U1").EntireColumn.ColumnWidth = 17.86 '130 px Range("Z1").EntireColumn.ColumnWidth = 12.14 '90 px Else 'přestupný rok 'změna šířky sloupců pro únor Range("U1").EntireColumn.ColumnWidth = 18.57 '135 px Range("Z1").EntireColumn.ColumnWidth = 12.86 '95 px End If End If End Sub |
Pozn. Excel je docela slabý při zpracování grafiky se změnou měřítka. Může se stát, že vykreslované čtverečky při specificky nastaveném zoomu najednou vizuálně odskočí od okrajů sloupců. Není moc co poradit. Na pohled musí vše vypadat fajn při 100 %.
Psal jsem, že na vzorci není nic světoborného. Situace se ovšem zkomplikuje ve chvíli, kdy si poskládáte rok a uvědomíte si, že akce bude zadána jedním intervalem v průběhu roku, ne zvlášť pro každý měsíc. Já se vydal po cestě sledující dny roku a tyto údaje jsem nakonec v listu nechal. Vzorce si nastudujte v přiloženém sešitu.
Za námět musím poděkovat Karlovi Koutnému, který kdysi ve fóru předložil tuto podobu Gantta jako úkol.
Příklad ke stažení:
excel-gantt-opakovat.zip