Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Jobban belegondolva, ha munkafüzetek megnyitása van a ciklusmagban, akkor a DoEvents által okozott lassulás valószínűleg nem is vehető észre.
Én úgy teszteltem, hogy ciklusban felvettem a ListBoxba 2000 UUID-t, és ott a DoEvents kb. kétszeresére növelte a futási időt. De még így is csak 12 másodperc volt, szóval... :-)
Azt lehetne, hogy egy mini adatbázist tárolni egy (rejtett) munkalapon, ahol az egyes cellákhoz tartozó képek elérési útvonala van, vagy inkább rögtön a méretadatok. Abból egyszerűen helyre lehetne állítani a méreteket. Persze egyszer meg kell csinálni a listát, ezt nem lehet el/megkerülni, de aztán már csak karban kell tartani, ami talán nem olyan vészes.
Már csak azt nem értem, hogy az otthoni 2007-es Excel miért tudta eredetileg a negyvenezres dátumokkal is kiszámolni, míg a munkahelyi 2010-es nem; megnéztem, a beállításoknál ugyanúgy (a default) mindkettő.
Szerintem félreérted a feladatot (vagy én értem félre). Arról van szó, hogy adott egy munkalap, amin már eleve vannak képes megjegyzéssel ellátott cellák.
Tehát nem most teszem be a képet, hanem eleve adva van. Ha most tenném be, akkor gyerekjáték lenne a méreteit meghatározni, és a comment szövegdobozát aszerint formázni. De ha már benne van a kép, akkor hogyan szeded ki belőle? Én erre nem találtam megoldást, kezelőfelületen sem, és programban sem. Erre a kérdésre a te ötleted sem válasz.
Akkor viszont a worksheet calculate eseményét kell kihasználni:
Private Sub Worksheet_Calculate() If Range("Z1").Value <> Range("H2").Value Then Application.EnableEvents = False Range("F3").Value = Range("H3").Value Range("Z1").Value = Range("H2").Value Application.EnableEvents = True End If End Sub
Ez akkor fut le, amikor a munkalap adatai újraszámolódnak.
Viszont nekünk csak akkor kell a folyamat, ha a H2 cella értéke megváltozik. Ezért ezt el kell tárolnunk valahova, erre szolgál a Z1 cella a példában (de bárhova is teheted).
Ha a Z1 értéke nem egyezik a H2 értékével, akkor lefut a kívánt akció és a Z1 értékét is átállítja.
Legközelebb, ha kiváltódik az esemény - újraszámolja a munkalapot - de a H2 cella értéke nem változik, nem fut le az akció.
Ez nagyon állat, működik is, viszont csak akkor, ha én írom át a cella értékét. Egyébként ez a cella egy szummázás végösszegét tartalmazza, aminek az értéke változik a többi munkalap adataitól függően. Valahogy el kéne érni, hogy fusson a makró akkor is, ha egy másik munkalap megváltoztatásának hatására változik meg a folyamat beindítására használt cella értéke. Remélem ez sem bonyolítja túl a helyzetet, mert már majdnem tökéletes!!!
Private Sub Worksheet_Change(ByVal Target As Range) If Not Nothing Is Application.Intersect(Target, Range("H2")) Then Application.EnableEvents = False Range("F3").Value = Range("H3").Value Application.EnableEvents = True End If End Sub
Ezt másold be az adott munkalap kódlapjára.
Ha a bal oldalon kiválasztod a worsheet-et, akkor jobb oldalon megjelennek az események. Itt válaszd ki a Change eseményt.
Ekkor a kódlapon megjelenik a fentiekben nem vastagított 2 sor.
Átrágtam magam az ajánlott könyvön, valamit talán még tanultam is belőle, de hogy új makrót írjak, arra nincs sok esélyem.
Viszont most talán pontosabban meg tudom fogalmazni, hogy mit csináljon a makró. Ha valaki össze tudja dobni, az nagy segítség lenne. Tehát az adott munkafüzet h2-es cella értékének a változására kellene lefutnia és egész egyszerűen a h3-as cella értékét kellene átmásolnia az f3-as cellába. Persze több másolás kell majd, de a többivel talán majd én is tudom bővíteni. Nagy problémám, hogy nem tudom például a kijelöléseket megszűntetni. Valahogy úgy kéne lefuttatni a makrót, hogy ne generáljon smmi más változást beleértve a kijelölések megváltoztatását, egyszerűen csak kerüljön bele a célcellába a másolt cella értéke. Lehet ilyet csinálni?
Rögzítettem egy makrót, majd itt-ott töröltem belőle.
A lényeg, hogy behívom a képet, elteszem a 2 méretét 1-1 változóba, törlöm a képet.
Beszúrok egy megjegyzést, ehhez az előbb tárolt 2 méretet rendelem, majd be(le)szúrom ismét a képet. Itt nem foglakoztam a képernyőfrissítés tiltásával és engedélyezésével. Kicsit kacifántos módszer, de működik.
Teheted ciklusba, ha az egyes képek útvonalát és nevét előbb tároltad az egyes sorokban.
Sub Rögzítés1() Dim magassag As Double, szelesseg As Double ActiveSheet.Pictures.Insert("E:JpgLóÁtló.jpg").Select Selection.ShapeRange.LockAspectRatio = msoFalse magassag = Selection.ShapeRange.Height szelesseg = Selection.ShapeRange.Width Selection.Delete Range("A1").AddComment Range("A1").Comment.Shape.Select True Selection.ShapeRange.Height = magassag Selection.ShapeRange.Width = szelesseg Selection.ShapeRange.Fill.UserPicture "E:JpgLóÁtló.jpg" Range("A1").Comment.Text Text:="" End Sub
Nagyobb berendezéseket gyártottunk, amiknek az állapotáról havonta kellett tájékoztatni a vezetőséget. A munkaszámokat tartalmazó cellákhoz megjegyzésben csatoltam a berendezések aktuális állapotáról a felvételeket. Szerintem nagyon hasznos funkció.
Arra is jó, hogy pl. az ügyfelek fotóját tegyük a megjegyzésbe. A nevek kiesnek a fejemből, de egy fotó sokat segít az azonosításban.
"Jelenleg azt gondolom, hogy rövidebb időbe fog telni neked megcsinálni az átméretezéseket manuálisan, mint nekem az, hogy erre programot eszkábáljak össze, úgyhogy átengedem a megoldás lehetőségét."
Sajnálom az elvesztegetett idődet, nem kitolásból tettem fel a kérdést hanem, mert több szem többet lát, hátha valakinek semmiség az ami nekem lehetetlen.
Manuálisan átméretezni? Már megfordult a fejemben de visszatart az, hogy valaminek a hatására (más szempont szerinti rendezés, törölt sor, stb...mittudomén) a képek méretei megváltozhatnak (ez már megtörtént, ezért vagyok itt) és akkor oda a belefektetett idő. Ilyenkor jönne jól egy makró, mely néhány másodperc alatt elintézné a problémát. Persze ha lehetetlen, akkor mást kell kitalálnom.
Inkább tenném mellé egy külön cellába, hogy állandóan láthassam. :-)
Az én felfogásom szerint a megjegyzés csak olyasmire való, aminek nincs "üzemszerű" helye a táblázatban, nem funkcionális és csak a cellák kis részénél használjuk. Elég visszafogottan érdemes használni. De persze ez vitatható egyéni állláspont.
Amit írtam ötletet az működik, egy dologra kell vigyázni:
A megjegyzés szerkesztésénél a méret fülön levő dolgokat nem szabad piszkálni. (Érdekes módon ott engedi az eredeti méret és a rögzített arány bejelölését is, ezeknek jelöletlennek kell lenni).
Egyébként, ha programból szúrod be a képeket, akkor úgyis megtudod a méretet is.
Már elcs.sztem vele 4 órát eredmény nélkül. Most nincs több kidobni való időm.
Annyi bizonyosnak tűnik, hogy az objektum nem publikál semmiféle fogódzót, amivel a megjegyzés hátterének beállított kép tulajdonságait le lehetne kérdezni. Talán valami Windows függvénnyel meg lehetne ragadni, de erre sem találtam semmi értelmes tippet.
Jelenleg azt gondolom, hogy rövidebb időbe fog telni neked megcsinálni az átméretezéseket manuálisan, mint nekem az, hogy erre programot eszkábáljak össze, úgyhogy átengedem a megoldás lehetőségét.