K čemu by tabulka jako pozadí na ploše mohla sloužit? Představte si sešit Excelu, v němž uživatelé často mění data. Nechcete jej opakovaně otevírat a zajímá vás jen určitý výřez buněk. Co takhle si oblast buněk dát jako obrázek na pozadí Plochy a aktualizovat při každém uložení sešitu?
V první fázi se musíme naučit přebírat oblast buněk jako obrázek a ukládat ji do souboru. Běžný postup využívá plochy grafu. Tento způsob se táhne napříč celým internetem, ačkoliv už v roce 2000 přišel Stephen Lebans s řešením čistě přes API funkce. Za to mu patří dík. V níže přiloženém souboru je jádro řešení umístěno v modulu modAPIBitmapToFile. Výřez buněk nemusí být viditelný a není ovlivněn buňkovým kurzorem.
Ve svém příkladu jsem použil obrázek na pozadí (karta Rozložení stránky), schoval přebytečné řádky a sloupce (pozadí se pod nimi dlaždicově opakuje a toto chování nelze ovlivnit) a skryl mřížku a záhlaví (viz karta Zobrazení). S užitím obrázku na pozadí jsem si ovšem naběhl. Excel obsahuje bug, kdy po otevření sešitu a listu s pozadím a bez záhlaví je pozadí odskočeno od počátku tak, jako by na listu záhlaví zobrazeno bylo. Napravit to můžeme tak, že buď znovu Excelu řekneme, že záhlaví je skryté, nebo změníme a vrátíme měřítko zobrazení, aby došlo k překreslení. Ach jo.
V tabulce (víko notebooku) je použita funkce RANDBETWEEN, jejíž výsledky se změní pro přepočtu listu (F9). Oblast pro export je ohraničena buňka A1 a K26 (vpravo dole) a je totožná s viditelnou oblastí. Okamžikem pro uložení je událost Workbook_BeforeSave.
Modul ThisWorkbook:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 'aktualizace výřezu na Plochu při ukládání souboru Call KopieVyberuNaPlochu End Sub Private Sub Workbook_Open() 'ošetřeni bugu 'správné usazení obrázku na pozadí při skrytém záhlaví 'i když už skryté bylo... ActiveWindow.DisplayHeadings = False End Sub |
Standardní modul:
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 | Sub KopieVyberuNaPlochu() Dim strPozadi As String strPozadi = ThisWorkbook.Path & "\excel_pozadi.bmp" On Error GoTo Konec 'kopie oblasti jako obrázek do schránky 'může být i jiný výběr než tabulka (obecně Selection) Worksheets(1).Range("A1:K26").CopyPicture xlScreen, xlBitmap 'převzetí ze schránky hBitmap = GetClipBoard 'transformace formátu Set hPix = BitmapToPicture(hBitmap) 'uložení (vždy bitmapa) SavePicture hPix, strPozadi 'odstranění objektu apiDeleteObject (hBitmap) 'uložení na pozadí SystemParametersInfo SPI_SETDESKWALLPAPER, 0, ByVal strPozadi, _ SPIF_UPDATEINIFILE Exit Sub Konec: MsgBox "Uložení se nezdařilo, opakujte akci.", vbExclamation + vbOKOnly End Sub |
Procedura KopieVyberuNaPlochu obsahuje poněkud ledabylé ošetření jakéhosi chybového stavu. Nahodile (cca jednou z dvaceti pokusů) se mi stávalo, že zkrátka nedoběhla v pořádku. Stačilo přitom spustit ji znovu, a tak jsem po příčině dále nepátral. Uložený obrázek je typu BMP velikosti cca 1,5 MB, i když by byl v našem případě vhodnější JPG (fotografie na pozadí), v ostatních potom PNG nebo i zastaralý GIF. Protáhnout ale formáty JPG/GIF celým procesem není dost dobře realizovatelné, u PNG prakticky nemožné. O samotné uložení se postará další API funkce.
Drobnou vadou na kráse je fakt, že je obrázek jakoby o 1 px posunutý/oříznutý (vlevo viditelná svislá bílá linka).
Nezobrazuje se vám obrázek na pozadí ve Windows (8.1)? V rámci Ovládacích panelů a usnadnění nesmí být zatržena volba Odebrat snímky pozadí.
Windows obsahují bohužel ještě jeden bug, kdy po hrátkách se zobrazením ikon na Ploše může pozadí zčernat. Pokud je mi známo, není jiné cesty, než v takovém případě restartovat Průzkumníka (Explorer.exe).
V příkladu ukládáme výřez buněk na Plochu počítače, v němž je sešit uložen, nicméně při použití WMI (s administrátorským oprávněním) pod VBA bychom pravděpodobně dokázali ovládat i Plochy dalších počítačů v síti. Nápomocen by nám mohl být i PowerShell.
Příloha:
excel_vyber_jako_obrazek.zip