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.
Pro určení šířky sloupce se používá číslice 0 standardního písma.
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.
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.
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í).
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.
Pokud chcete mít buňku stejně širokou i vysokou (čtvercový rastr), řiďte se pixely.
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