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.
A Select ellen régóta kampányolok itt, mert az esetek döntő többségében fölösleges. Azért Select-álsz valamit, hogy aztán a Selection által hivatkozott objektumon hajts végre valami műveletet. Ennek mi értelme? Az objektumokat direkben kell meghivatkozni, egyértelmű elérési úttal. Ha az objektumokra Selection-nel hivatkozol, akkor a kódod annyira lesz robusztus, mint mondjuk a kártyavár. Ráadásul a kód megírását is bonyolultabbá teszi. Próbáld ki. Másold be a kódmodulra ezeket:
Sub teszt()
'Select Range("A1").Select Selection
'No select Range("A1") End Sub
Tegyél a Selection után pontot, mintha pl. az Interior.ColorIndex-et akarnád beállítani. Mit tapasztalsz?
Most tegyél a Range("A1") után pontot, mintha pl. az Interior.ColorIndex-et akarnád beállítani. Mit tapasztalsz?
Az intellisense (intelligens kódkiegészítő) nem működik Selection-nel, mert f.ngja nincs, hogy a Selection milyen ojektumot takar. Range("A1") esetében tudja, és ezért csak azokat a tulajdonságokat és műveleteket hozza fel, amelyek a Range típusú objektumra értelmezettek.
A SendKeys meg végképp a programozás megcsúfolása. A legbizonytalanabb kimenetelű dolog, amit Excelben el tudok képzelni. A bolygók állásától talán nem függ az eredménye, de minden mástól igen. Vészhelyzetben oké lehet, de minden más esetben kerülendő. Például vegyük azt a kódot, amit beküldtem. Mi van, ha pl. elszámoltam a TAB-okat, és rossz helyen "nyomok" ENTER-t? Vagy mi van, ha az Excelnek idő kell, hogy egy SendKeys-sel indított feladatot végrehajtson, és addig nem tud fogadni új billentyűparancsokat, de a kódom meg rendületlenül küldi őket? A gép sebességétől függő számú lépés kimarad, aztán megy tovább?
Hogy ne kelljen Jimmynek elismételnie a mostanában a témában elhangzottakat, készítettem egy kis összeállítást az elmúlt negyedévben itt született indoklásokról a select utasítás mellőzésének érdekében:
Ha rejtett Comment-ek vannak, azokat előbb meg kell jeleníteni, hogy a Select ne akadjon ki:
Sub Megjegyzem() Dim sh As Shape, cm As Comment, i As Long For i = 1 To 2 For Each cm In ActiveSheet.Comments cm.Visible = True Set sh = cm.Shape sh.Select DoEvents Application.SendKeys "^1" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" cm.Visible = False Next Next End Sub
Meg fogom kövezni magam ezért a makróért, de nincs jobb ötletem, mint Select és Sendkeys, a két leginkább kerülendő cucc.
Sub Megjegyzem() Dim sh As Shape, cm As Comment, i As Long For i = 1 To 2 For Each cm In ActiveSheet.Comments Set sh = cm.Shape sh.Select DoEvents Application.SendKeys "^1" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Next Next End Sub
És hogy miért kell a For i = 1 To 2 ciklus?
Halvány lila gőzöm sincs. Azt tapasztaltam, hogy ha nincs ismétlés, akkor az első komment képe kimarad a formázásból. Ha kétszer egymás után lefuttatom ugyanazt, akkor az első is átállítódik.
Ami feltétlenül szükséges előkészület:
Egy képen csináld meg méret helyreállítását. Ez azért kell, hogy amikor legközelebb feljön a Megjegyzés formázása ablak, akkor a Méret fül legyen felül.
A kód működésére nincs garancia. Az egyik gépemen fut, a másikon nem...
Kitöltendő cellákra adatérvényesítést használok, részben szabály nélkül, csak a felirat kedvéért.
Rákattintva a megjelenő szövegre egy vatag keretet láttam körülötte. Ekkor egérrel odébb lehetett húzni.
Na ez az, amit nem kellett volna. Soha többé nem bírtam visszatenni a helyére, mert akárhogy próbálkozom, innentől fogva az ÖSSZES cella érvényesítő szövege azon a helyen jelenik meg, ahova azt az egyet húztam, bármelyik is legyen az. Akár méterekre a cellától, ahova tartozik. És nem lehet visszavonni. Mentést meg nem csináltam közvetlenül előtte.
Szerencsére két hasonló táblázatom van, a rontottat eldobtam, majd visszamentem a másikból.
A 2007-es excelben is úgy van mint a 2007-ben. A sorvektor hatványozásánál a pontosvessző az elválasztójel, az oszopvektor hatványozásánál pedig a backslash. Nagy meglátásod volt ezt felfedezni, mivel a súgóban erről sehol semmi.
És ezzel meg is van a többször visszatért kérdésemre a válasz, hogy mi a fenének kellett transzponálni a LIN.ILL képletben. Mert aki kiokumlálta a képletet, az is annyit tudott, hogy a default elválasztójel csak a sorvektoroknál müködik. Így hát transzponált. Ahelyett, hogy konzultált volna veled, hogy megmond neki, hogy egyszerűbb lenne backslasht használni :)))))
Szeretnék még megemlíteni neked valamit. Most hogy megint szóbahoztad hogy dátumok az x változóid, az az érzésem, hogy a trendszámításodhoz a harmadfoku polinomnál sokkal adekvátabb a Fourier analizís. Az Adatelemzés excelbővítmény tartalmazza.
Igen, köszönöm. Valószínűleg maradok az egy munkalapos verziónál. Ronda, de működni fog. (A probléma egyébként nem bővebb annál, ami le volt itt írva.)
Valóban, magában a fileban vannak a képek tárolva.
Viszont: Mi lenne, ha egyszer rászánnád magad és végigmennél a megjegyzéseken az alábbi makróval:
for each cmnt in activesheet.comments
cmnt.visible=true
stop
'itt átmész az adott oldalra és beállítod az alaphelyzetet, utána visszajössz.
hossz=cmnt.shape.height ' itt elmentheted a méreteket, ahova akarod, hogy később ne kelljen vele foglalkozni.
szel=cmnt.shape.width
cmnt.visible=false
next
A méret visszaállítás már a korábban leírt makróval megy, ahova a szélességet, hosszúságot az elmentett helyről veszed.
Cserébe még próbálkozom kibányászni az alaphelyzet beállítását - mert a metódus (SetShapesDefaultProperties)meg van rá, csak valamiért nem akarja megenni.
Szerintem az Excel a megjegyzésekben tárolt képeket nem külön tárolja, hanem a mentett fájlban...ezt a fájl méretéből okoskodtam ki, ami nálam 40Mb körül mozog.
ja, és hátha valakit érdekel e témában ha sok megjegyzéshez lenne kép rendelve és szeretné kibányászni mondjuk az összes képet, elegendő a mentés másként parancsnál weblap-ként menteni. Én is találtam, hasznosnak tartom ezért osztottam meg.
A hivatkozott hozzászólásban láthatod, ha az x adatok sorvektort alkotnak, akkor a hatványvektornak oszlopvektornak kell lennie, azaz nem backslash-sel, hanem pontosvesszővel kell az elemeit elválasztani.
Nálam a 2010-ben működik az alábbi képlet:
=LIN.ILL(G3:K3;G1:K1^{1;2;3})
ahol G1:K1 cellák a mai dátum + 4 nap.
Kíváncsian várom a Te eredményed!
(Hogy a 2007-ben mi a helyzet, talán Tbando tudna valamit mondani)
Más: már írtam, statisztikából úgy tanultam (és tanítottam), hogy idősorok trendszámításánál nem a dátumokat használjuk x adatokként, hanem az 1,2,3 ... stb. számokat.
Persze nyilván előfordulhat, hogy a valós számadatokat az excel képes dátumként is értelmezni - aztán számol is velük, mivel egyébként meg számnak tekinti.
Biztosan tartalmazza a sorokban egy-egy cella a képek útvonalát és nevét.
Nagyon zavar, ha egy makró újra betölti a képeket, onnan megjegyzi az eredeti méreteit, és átállítja eszerint a megjegyzés méreteit? A betöltött képet törli. A méreteket el is tárolhatja a saját rekordjába, hogy legközelebb ne kelljen újra betölteni a képet.
A megjegyzésben tárolt képek eredeti méretének beállítása egyszerű csak automatizálni nem tudom azért kellene a makró.
Megjegyzésben tárolt kép eredeti méretre állítása: - cellára jobb klikk - megjegyzés szerkesztése - megjegyzés peremére dupla bal klikk - méret - alaphelyzet - ok
ezt a folyamatot viszont nem lehet együtemben megcsinálni akkor, mikor a képet hozzáadtuk a megjegyzéshez.(részemről erre nincs is szükségem) Tehát előbb le kell okézni, kilépni a szerkesztésből majd a fentebb leírtakkal folytatni.
Ja és a makró eleve nem játszik, hiszen a felhasználók egy része eleve nem engedélyezi a külső forrásból származó makrókat. Mindent az Excel alapfunkcióival kell megoldanom.
Lehet, hogy az lesz a megoldás, hogy megszüntetem a másik munkalapot, és valahol ugyanazon a munkalapon elrejtett XY oszlopokban sorolom fel az elemeket. Az én életem lesz bonyolultabb tőle, de legalább jól érzi magát valaki Redmondban a bal kettőben...
Ezek nagyon bonyolult megoldások, egyrészt nem is ér ennyi munkát az egész, másrészt ugye itthon szerkesztem a táblázatot Excel 2000-ben, mert az biztos mindenhol megnyílik, elmentem xls-ben, aztán holnap odabent tudom 2010 alatt tesztelni, szóval még csak nem is egy kerületben zajlik a két esemény. :-)
Marad a figyelmeztetés.
Tudtommal a megnyitáskor nem történik verziók közötti konverzió, csak ha másként menti.
Ha a probléma a mentésnél van, akkor a mentést tedd egy command gombra és a beforesave eseményben makróval mentsd el a megfelelő formátumban a filet.
De lehet, hogy már a megnyitáskor van probléma. Ezt lehet kezelni az open eseménybe betett verzió vizsgálattal.
De valóban segíthet egy olyan figyelem felhívás is, hogy ne konvertálja, csak kompatibilis módban nyissa meg. Aztán ha nem tartja be, lehet neki hivatkozni a figyelem felhívásra.
(Azt nem tudom, hogy meg lehet-e akadályozni a konvertálást.)
Ez egy olyan űrlap, amit kiteszünk a honlapunkra, ahonnan az emberek letölthetik, és mindenki azzal tölti ki, amije neki van, aztán e-mailben visszaküldi. Ha én nyitogatnám meg, akkor nem lenne ilyen bonyolult...
Esetleg írjam oda, hogy hagyja meg xls-ben, és ne mentse át xlsx-be, mert akkor elromlik? Ez segít?