Örökmozgó szövegdoboz - ötletelés objektumok automatikus mozgatásáról

2018. június 25. - Office Guru

Adott egy rendkívül nagy adathalmazunk egy-két-három oszloppal és több tízezer sorral, amelyekből készül egy aprócska kalkulációs táblázatunk a nyers adatok mellé helyezve. Bárhova is görgetünk az adathalmazunkban, szeretnénk, ha ez a kis kalkulációs tábla végig velünk maradna - tehát kövesse a görgetésünket. Ez lenne a mai feladvány, kezdve az adathalmazzal:

tabla1.JPGEz meg a kis kalkulációs táblánk lenne, szimplán cellákba betöltve:

tabla2.JPGÉs valami ilyesmi eredményt akarunk elérni:

tabla3.JPGLátható, hogy az alapkalkulációkat egyszerűen csak beletettem egy szövegdobozba - azt akarjuk, hogy ez a szövegdoboz végig jöjjön velünk, ahogy görgetünk fel- vagy lefelé az adatok között. Azt már most kijelenthetjük gyorsan, hogy a szövegdoboz nem kezelhető megoldás erre a problémára, így szimplán jelöljük ki az eredeti kalkulációs táblázatunkat, majd nyomjunk egy CTRL+C-t és tegyük a vágólapra.

Ezután jobb egérgombbal kattintva hívjuk elő a context menünket és illesszük be a vágólapról a kalkulációt képként:

tabla4.JPGValahogy így fog majd kinézni:

tabla5.JPGAzt mindenképpen tegyük meg, hogy a képen állva a Formula Barban egy egyenlőségjel után adjuk meg azt a tartományt, amiből a képet készítettük, így automatikus frissülni fognak az értékeink a képen is:

tabla6.JPGUserform készítése nem az első helyen szerepel a megoldási javaslataim között, hiszen az már formátumát tekintve sem hasonlít igazán az elvárt eredményre, viszont javaslatként kipróbálhatjuk a legegyszerűbben megadható választ, a View ribbonfül Window szekciójából a Freeze Panes funkciót:

tabla9.JPGAhogy látható, ezzel rögzítettük szépen a képünket és bárhova is görgetünk, fixen látható lesz a sheetünk tetején, viszont ezzel meg az a probléma, hogy a felső néhány sor az adathalmazunkban is rögzült. Tehát megoldásnak megoldás, de nem tökéletes.

Egy fokkal jobb megoldás a munkalapon való kijelölés-változtatás eseményhez (SelectionChange) hozzárendelni egy aprócska VBA-kódot, amivel azt fogjuk elérni, hogy bármilyen kijelölés-változtatás esetén a kis képünk odaugrik, ahova akarjuk. Lépjünk tehát ALT+F11 lenyomásával át a VBA-editorba, majd kezdjük el szépen hozzárendelni a Worksheet_SelectionChange eseményhez a következő kódunkat.

Változókkal kezdünk, mint mindig, szükségünk van egy Object típusú változóra a képünknek, amit mozgatni fogunk, aztán kell kettő, mondjuk Double típusú változó a felfelé és a balra mozgatáshoz megadandó koordinátáknak, végül pedig még egy változót célszerű felvenni, ami mindig a legalsó sorunk koordinátáit tartalmazza.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim Kep As Object
Dim Fent As Double
Dim Balra As Double
Dim Alsosor As Range

Ha ezzel megvagyunk, az aktív munkalapunk látható részét fogjuk (ActiveWindow.VisibleRange), majd egy r nevű változóba beszámoljuk, hogy hány sor van éppen a képernyőn, majd egy c nevű változóba azt is beszámoljuk, hány oszlop látható, majd r és c változók fogják megmondani, hogy milyen cellakoordinátákat fog felvenni "Alsosor" nevű változónk, azaz pontosan melyik cella a legalsó és egyben legszélső cellánk a látható képernyőn.

With ActiveWindow.VisibleRange
r = .Rows.Count
c = .Columns.Count
Set Alsosor = .Cells(r, c)
End With

Tehát megvannak a koordináták, már csak meg kell mozdítanunk a képet minden egyes kijelölés-változtatásnál. Szépen adjuk meg, hogy melyik képről is beszélünk, az én esetemben ez az aktív munkalap első számú képe:

Set Kep = ActiveSheet.Pictures(1)

Azt elvileg tudjuk, hogy "Alsosor" nevű változónk Range típusú, és a tartományoknak van egy .Top nevű tulajdonsága, amely megadja az első sor teteje és a tartományunk teteje közötti távolságot. Ennek tükrében már értelmet is nyer a következő definiálás:

Fent = Alsosor.Top - Kep.Height - 120

Tehát fogjuk a látható képernyőnk legalsó sorát és kiszámoljuk az első sor és az utolsó sor közötti távolságot, amiből kivonjuk a kép magasságát és még 120 képpontot (mert nagyjából kikísérleteztem, hogy ennyi képpont kell még, hogy a kalkuláció oda kerüljön, ahova akarom), azaz 120 képponttal és a kép magasságával csökkentett értéket fogja felvenni a "Fent" nevű változó. Ugyanezen logika mellett működik a Range.Left tulajdonság is, csak ez a legelső oszloptól számol a tartományunk első oszlopáig:

Balra = Alsosor.Left - Kep.Width - 300

Ezután már nincs más hátra, mint a képünk koordinátáit a fenti két, "Fent" és "Balra" nevű változóból kinyerni, minden kijelölés-változtatásnál:

With Kep
.Top = Fent
.Left = Balra
End With
End Sub

És ezzel szépen jön velünk a kis kép, ahogy mozgunk és kattintunk a sheetünkön. Viszont ez még mindig csak két, nem teljesen az elvárásnak megfelelő megoldási javaslat volt - kedves Olvasók, bármilyen más ötlet?

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr2214071355

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.