Šířka sloupce a výška řádku v Excelu

Z nápovědy Microsoftu na internetu:

„V listu můžete určit šířku sloupce v rozsahu od 0 (nula) do 255. Tato hodnota představuje počet znaků, které se mohou zobrazit v buňce formátované standardním písmem.“

„Standardní šířka sloupce je průměrná šířka číslic 0-9 standardního písma.“

Lidsky: Standardním písmem (lépe řečeno výchozím písmem stylu Normální) je běžně v Excelu 2003 font Arial (dříve Arial CE) velikosti 10, v Excelu 2007/2010 písmo Calibri velikosti 11.

Standardní písmo - styl Normální
Standardní písmo – styl Normální

Pro určení šířky sloupce se používá číslice 0 standardního písma.

Šířka buňky - units a pixely
Šířka buňky – units a pixely

Je vidět, že do buňky s písmem Calibri 11 o šířce 145 „obrazovkových“ pixelů se vejde 20 celých znaků nula. Pozn. Excel velmi často prapodivně vykresluje grafické elementy i písmo se změnou měřítka (lupy) nebo stylem zobrazení. Stane se, že při zvětšení (zmenšení) vám nuly přetečou nebo naopak nedotečou do krajů buňky. Smutně řečeno, držte se zobrazení 100%.

Pro zajímavost porovnejte rozdíly mezi standardním fontem Calibri 11 a Courier New 11.

Porovnání - písma Calibri a Courier New
Porovnání – písma Calibri a Courier New

Pixely můžeme považovat za rozumnou „obrazovkovou“ míru, v praxi je ovšem často potřebná míra „papírová“ (centimetry, milimetry). Přepočet těchto veličin je alchymie a doporučuji nevěřit žádnému článku na internetu. Excel ve verzi 2007 přišel naštěstí se zobrazením Rozložení stránky (viz karta Zobrazení nebo ikona ve stavovém řádku), které obsahuje pravítka a zobrazené míry podle mých zkušeností odpovídají tiskovému výstupu. V Excelu 2003 máme lidově řečeno smolíka a vyplácáme dost a dost papíru na pokusech.

Šířka buňky v zobrazení Rozložení stránky
Šířka buňky v zobrazení Rozložení stránky
Nastavení pravítek pro zobrazení Rozložení stránky
Nastavení pravítek pro zobrazení Rozložení stránky

Povšimněte si, že pro stejnou šířku sloupce se v závislosti na způsobu zobrazení (Normálně/Rozložení stránky) liší rozměr v pixelech – 156 px namísto 145 px (proto jsem nuceně musel v textu rozlišit „obrazovkové“ pixely oproti „tiskovým“). To je ostatně vidět (a nutné zohlednit) i v následujícím kódu VBA.

Jak je to ve VBA?

šířka sloupce vyjádřená nulami standardního písma (units) … vlastnost ColumnWidth
šířka sloupce v jednotkách Excelu (points) … vlastnost Width

Přibyla tedy vlastnost v dalších nepraktických jednotkách a k pixelům si budeme muset dopomoci sami.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Sub SirkaSloupce()

    Dim rngBunka As Range
   
    Dim dblSirkaSloupcePoints As Double
    Dim dblSirkaSloupceUnits As Double
    Dim dblSirkaBunkyMilimetry As Double
    Dim intSirkaBunkyPixely As Integer

    Const dblPocetMilimetruNaPalec As Double = 25.4
   
    'dots per inch (DPI)
    Const intPocetBoduNaPalec As Integer = 72
    'pixels per inch (PPI)
    'Microsoft: 96 PPI, Apple: 72 PPI
    Const intPocetPixeluNaPalec As Integer = 96

    'sledovaná buňka
    Set rngBunka = Range("A1")

    '****************************
    'zobrazení Normálně
    '****************************

    ActiveWindow.View = xlNormalView

    'zobrazená šířka: 20,00 (145 pixely)
   
    '20 (units)
    dblSirkaSloupceUnits = rngBunka.ColumnWidth

    '108,75 (points)
    '.Width pouze ke čtení
    dblSirkaSloupcePoints = rngBunka.Width

    '145 (pixely)
    intSirkaBunkyPixely = rngBunka.Width / intPocetBoduNaPalec * _
        intPocetPixeluNaPalec

    '38,364583 (milimetry)
    dblSirkaBunkyMilimetry = rngBunka.Width / intPocetBoduNaPalec * _
        dblPocetMilimetruNaPalec

    'centimetry (milimetry) na points
    'viz také Application.InchesToPoints
    '108,75 (points)
    dblSirkaSloupcePoints = _
        Application.CentimetersToPoints(dblSirkaBunkyMilimetry / 10)

    '****************************
    'zobrazení Rozložení stránky
    '****************************

    ActiveWindow.View = xlPageLayoutView

    'zobrazená šířka: 4,13 Centimetry (156 pixely)

    '20 (units)
    dblSirkaSloupceUnits = rngBunka.ColumnWidth

    '117 (points)
    '.Width pouze ke čtení
    dblSirkaSloupcePoints = rngBunka.Width

    '156 (pixely)
    intSirkaBunkyPixely = rngBunka.Width / intPocetBoduNaPalec * _
        intPocetPixeluNaPalec
    '41,275 (milimetry)
    dblSirkaBunkyMilimetry = rngBunka.Width / intPocetBoduNaPalec * _
        dblPocetMilimetruNaPalec
       
    'centimetry (milimetry) na points
    'viz také Application.InchesToPoints
    '117 (points)
    dblSirkaSloupcePoints = _
        Application.CentimetersToPoints(dblSirkaBunkyMilimetry / 10)
       
End Sub

Kód jsme pracně vypotili, šířku sloupce dokážeme zjistit v obrazových i „papírových“ jednotkách a zdá se, že je hotovo. Omyl. Umíme pouze číst šířku sloupce, ne ji prakticky zadávat. Co je na tom? Šířku budeme chtít nastavit v milimetrech (centimetrech) nebo rozumných obrazovkových jednotkách – pixelech. Stačí tedy opačný přepočet a… jsme v … Obě míry vycházejí z vlastnosti Width, která je jen pro čtení. Rozměr jak vidno můžeme nastavovat pouze v units, tj. s využitím vlastnosti ColumnWidth. Stanovit vztah mezi pixely (milimetry) a units je ovšem „takový nepěkná věc“ a podle mého názoru neexistuje spolehlivý výpočet. Jediná rozumná cesta je tabulka experimentálních hodnot. Pro standardní font normálního stylu Calibri 11 ji nabízím v příloze (včetně kódu pro generování).

Tabulka pro převod šířky - Calibri 11
Tabulka pro převod šířky – Calibri 11

Tahle Dantova Božská komedie ještě nemá konec a už vůbec neobsahuje třetí část (Ráj), která, obávám se, vyjde stejně jako ta původní až po autorově (mé) smrti. Proč? Někdy příště si ukážeme práci se sloučenými buňkami. Zatím budiž řečeno, že pokud všechny sloupce takové oblasti nejsou stejně široké, vrací vlastnost ColumnWidth pro sloučenou oblast hodnotu Null.

Pár řádek se sluší říct i k řádkům a výšce buňky.

Rozměry výšky se vypisují v normálním zobrazení v points (tedy ne v units jako u šířky!) a v pixelech. Snímek níže ukazuje rozměry v zobrazení Normálně a Rozložení stránky.

Výška řádku v Excelu
Výška řádku v Excelu

Pokud chcete mít buňku stejně širokou i vysokou (čtvercový rastr), řiďte se pixely.

Výška řádku v Excelu - čtvercový rastr
Výška řádku v Excelu – čtvercový rastr

Výšku řádku ve VBA vrací vlastnosti Height a RowHeight. Obě obsahují hodnotu v points.

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
26
27
28
29
30
31
32
33
34
Sub VyskaRadku()

    Dim rngBunka As Range

    Dim dblVyskaRadkuPoints As Double
    Dim intVyskaBunkyPixely As Integer
    Dim dblVyskaBunkyMilimetry As Double

    Const dblPocetMilimetruNaPalec As Double = 25.4

    'dots per inch (DPI)
    Const intPocetBoduNaPalec As Integer = 72
    Const intPocetPixeluNaPalec As Integer = 96

    'zobrazeno Výška: 15,00 (20 pixely)

    'sledovaná buňka
    Set rngBunka = Range("A1")

    '15 (points)
    dblVyskaRadkuPoints = rngBunka.Height

    '15 (points)
    dblVyskaRadkuPoints = rngBunka.RowHeight

    '20 (pixely)
    intVyskaBunkyPixely = rngBunka.Height / intPocetBoduNaPalec * _
                          intPocetPixeluNaPalec

    '5,291667 (milimetry)
    dblVyskaBunkyMilimetry = rngBunka.Height / intPocetBoduNaPalec * _
        dblPocetMilimetruNaPalec

End Sub

Specifickým problémem (nad rámec tohoto článku) je přizpůsobení výšky řádků (AutoFit) ve sloučené oblasti.

Ještě nemáte dost? Uvádím doplňující informace stran jednotek

Didotův měrný typografický systém
1 typografický bod [., b] (typicky velikost písma) = 0,3759 mm
1 cicero [c] = 12 typografických bodů

Angloamerický (monotypový) systém
1 point [pt] = 0,3528 mm
1 pica (čti pajka) = 12 points
1 palec [inch, in, „] = 72,27 points (původně) = 72 points (dnes, zavedeno firmou Adobe) = 25,4 mm = 6 pica

Pozn. V českých překladech se „point“ označuje také jako „bod“, nicméně aby nedocházelo k záměně s typografickým bodem, doporučuji užívat nepřeložený název jednotek. Osobně moc nerozumím tomu, proč velikost písma vztahujeme k Didotovu typografickému bodu, když většina jednotek sazby vychází z moderní (Adobe) verze angloamerického systému. Ale to bychom se možná dostali ještě k pojmu kuželka a dalším. Pro dnešek končíme.

Sešit ke stažení:
sirka-sloupce-generator.zip