Ganttův graf (diagram) podruhé

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.

Ganttův graf s pomocí funkce OPAKOVAT
Ganttův graf s pomocí funkce OPAKOVAT

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

Ganttův graf - výběr symbolů
Ganttův graf – výběr symbolů

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

Ganttův graf - rozbor
Ganttův graf – rozbor

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