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.
Ha "csak" százezer sorból áll a tábla, akkor viszont hol a SUM hol a SUMPRODUCT a gyorsabb. 10 kisérletből: - a SUM gyorsabb 4 esetben (legnagyobb eltérés 14%) - pontosan azonos időt fut mindkét függvény 4 esetben - a SUMPRODUCT gyorsabb két esetben (7% legnagyobb eltérés).
Szóval úgy tűnik, hogy "kis" adattábláknál a SUM a jobb megoldás, nagy tábláknál a SUMPRODUCT annyira szétbontva amennyire csak lehet.
Persze jobb lett volna nagyobb mintán kisérletezni, úgy hogy csak egy oprendszer meg az excel fut, de sajnos a világ nem tökéletes :-)
Ha a SUMPRODUCT-ot szétbontottam úgy, hogy minden egyes elem önálló tömb a számolásban (vagyis nincs szorzásjel a SUMPRODUCT-on belül), akkor egy kicsit még gyorsabb lett.
A függvény amit futtattam: =SUMPRODUCT(--(YEAR(A2:A1000002)=2010), --(MONTH(A2:A1000002)>=7), --(MONTH(A2:A1000002)<=9), --(C2:C1000002="IGEN"),(B2:B1000002))
Csináltam egy gyors kisérletet, ha valakit érdekelnek az ilyen dolgok beteszem ide.
Szóval létrehoztam két táblázatot, mindegyikben 1 millió sorral. Az egyik táblázatot SUM függvénnyel, a másikat SUMPRODUCT függvénnyel összesítettem számos feltétel mentén. A függvények:
Ezekután lemértem, hogy melyik függvény mennyi idő alatt boldogul a számolással. Itt az eredmény: Jól látszik, hogy a SUMPRODUCT gyorsabb.
Ezek után átalakítottam a SUMPRODUCT függvényt a következőre: =SUMPRODUCT((YEAR(A2:A1000002)=2010)* (MONTH(A2:A1000002)>=7)* (MONTH(A2:A1000002)<=9)* (C2:C1000002="IGEN"),(B2:B1000002)) A változás annyi, hogy a számokat számoló részt (B2:B1000002) kivettem egy vessző mögé (vagyis egy külön tömböt képeztettem vele.
Ezt összehasonlítottam az első változat SUMPRODUCT-jával (SUMPRIODUCT1 a grafikonon) és ezt kaptam:
A SUMPRODUCT gyorsabb, ha kettébontottam a számolást, különböző vektorokra.
Mondjuk, nehéz leírni azt a pillanatot amikor néhány óra munka után egy képlet végre elkezdi azt csinálni, amit csinálnia kéne!
Még egy megjegyzés: Ha a negyedik negyedévet nézed akkor felesleges betennie a: HONAP(datum)<=12 részt, mert ez mindenre igazat ad. Ilyenkor elég csak azt ellenőrzizni, hogy a HONAP(datum)>=10. Nyilvánvaló okokból hasonló logika vonatkozik az első negyedévre is.
Függvények más függvényből való "fejlesztésekor" gyakran előfordul, hogy felesleges feltételek bentmaradnak, mert csak a régi függvényt tartalmát alakítjuk át, nem pedig a működését gondoljuk újra.
Most fogok elővenni valami nagy és nehéz tárgyat, mellyel erőbehatásokat lehet eszközölni a számítógép érzékeny részeire...grrrr 4 órakor kidob az ágy, mert az agyam nem hagy nyugodni és folytatom a táblázatot :-)
Amit ajánlottál: =SUMPRODUCT(--(YEAR(B13:B16)=2000* MONTH(B13:B16)>=7)*(MONTH(B13:B16)<=9*(F13:F16=M3)*(H13:H16=H5)))
remekül működik...de, csak ezzel a negyedévvel. Ha a 7 helyett 10-et, a 9 helyett 12-t írok akkor hibásan számol. Konkrétan megszámol mindegyik sort, a hónapoktól függetlenül.
Már mér ne kéne értened? Úgy látom jelentős időt rászántál arra, hogy a tömbfüggvényekkel foglalkozz és ez egy fontos része.
Szóval, leegyszerűsítve a problémát, mondhatjuk azt, hogy vannak esetek amikor az excel - makacs módon - egy logikai teszt eredményét IGAZ/HAMIS-nak veszi, nem pedig 1/0-nak.
Mivel a tömbfüggvények egyik fontos hasznosítási területe ez, meg kell oldani, hogy pld egy IGAZ értéket egy számmal szorozzunk. Erre szolgál a dupla negatív.
Más szóval: vannak esetek amikor IGAZ*2000 hibát ad. Ekkor lehet a következőt csinálni: --(IGAZ)*2000, és ez már nem hibát jelez, hanem 2000-t ad eredményül.
Mivel lusta vagyok megjegyezni, hogy milyen függvény-környezetben jön elő a hiba, én inkább - szinte - mindíg odateszem a dupla negatívot, abból baj nem lehet.
Megszokás... A dupla negatív átváltja a TRUE/FALSE értékeket számmá. Én mindíg be szoktam rakni a képletekbe, mert lusta vagyok megjegyezni, hogy mikor kell meg mikor nem :-)
A tartomány elnevezéseket már használtam máskor is, itt most nem jutott eszembe. A képlet elején a 2 kötőjel (--) miért van? Én nem tettem bele és működik.
Adott ez a valószínűleg hosszú képlet! Ez így működik, gyönyörűen adja az eredményt, de jó hülyén néz ki.
Negyedév adatait szerettem volna összegezni, de a hónapokat nem tudtam egyszerűbben meghatározni, pedig SQLkerdes segített, de az általa leírtak (11544-45) nem működnek.
Az Index fórum kedvenceim között láttam, hogy ebben a topikban a te hozzászólásod az utolsó, de amikor idejöttem, akkor nem láttam a hozzászólást magát. Ilyenkor segít, ha ez ember posztol egy kommentet, az "előcsalogatja" a - valamilyen technikai okból - láthatatlan hozzászólást.
A te problémáddal az a baj, hogy: - nem lehet előre megmondani max hány számla kombinációjából jön ki az elutalt összeg, viszont ilyet leprogramozni nem lehet. A megoldás amit én választottam az volt, hogy feltételeztem, hogy 6-nál nem nagyobb ez a szám. Minél nagyobb ez a szám, annál bonyibb megírni a kódot. - továbbá, minél nagyobb a fenti szám, annál többször fog előjönni ugyanaz a "megoldás" különböző variációkban (100+400, 400+100, etc.).
Szóval nem egyszerű összerittyenteni egy ilyen kódot, ezért is van, hogy nem nagyon tolonganak a jelentkezők... És nem fogok hazudni, most hogy amit eddig csináltam elszállt, nehéz újra nekiülni a másik gépen elszállt file-ok visszaállítása helyett :-(
Köszönöm szépen a segítséget és a javaslatokat! Igen, valóban igaz, a FOR-ba nem jó információ meghatározó részt tenni, nem is szoktam, most valamiért a gyors próba után úgy maradt ;-)
Ez a kód pld kiszinezi az autoszűrt cellákat az A oszlopban
Sub Macro1()
Dim myrange, workrange As Range
Set myrange = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
For Each workrange In myrange workrange.Interior.ColorIndex = 15 Next
End Sub
Kiszinezés helyett akár ki is olvashatod mindegyik cella sorának számát és ezt felhasználva már bármit csinálhatsz az adott sorban. Mondjuk úgy is tudsz bármit csinálni az adott sorban, hogy az OFFSET-et használod és a műveleti cellát a workrange cellától jobbra v. balra x darab cellával elmozgatod. Élek a gyanúperrel, hogy az OFFSET-es megoldás gyorsabb, mint a workrange cella sorának meghatározása és utána ez alapján műveletezés.
Pld: Csinálsz egy Range object-et ami csak bizonyos cellákat tartalmaz (mivel autoszűrve van a cucc, a te konkrét esetedben nyilván a látható cellák érdekelnek):
Set myrange = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
(Ez pld. xl2007-ben gyakorlatilag a [HOME / FIND & SELECT / GO TO SPECIAL] VBA változata)
Ezután egy FOR Each Range in MyRange ... NEXT ciklusban megcsinálod amit akarsz.
Előnye akkor van ennek a megközelítésnek, ha nagyon sok sor van kiszűrve. Vegyük a lenti példádat. Ha van összesen 1 millió sorod amiből 20 db maradt meg az autoszűrés után, akkor a te lenti kódod mind az 1 millió sort végigjárja, kiértékeli, stb.
A fenti megoldás csak a 20 darab ténylegesen látható sorral fog törődni.
Köszi, de amint írtam, több ezer sorból van autoszűrővel kiválasztva több különböző szűrőbeállítással az eredmény (több különböző sor). Nekem tulajdonképpen a kiválasztott sorokon kellene végigmenni, mert egy következő művelethez ezen sorok különböző celláinak értékeire van szükségem. Ja, és az autószűrővel történt kiválasztást is makró végzi.
"Alternatívaként egy vektorváltozóba beteheted az autoszűrés eredményeként megmaradt számokat (Special Cells, Visible) és ezen szaladsz végig egy FOR NEXT ciklussal."
Én fordítva csinálnám. Nyilván van valami feltételed az autoszűrőben, pld .value>0 (pozitív számok). A ciklust megcsinálnám minden számra, de a cikluson belülre tennék egy IF-et ami kiértékeli a szűrési feltételt. Ha a feltétel igaz, megcsinálja amit kell, ha nem akkor bármi action nélkül kidob a Next-hez.
Alternatívaként egy vektorváltozóba beteheted az autoszűrés eredményeként megmaradt számokat (Special Cells, Visible) és ezen szaladsz végig egy FOR NEXT ciklussal.
A kérdésem az lenne, hogyan lehet egy autoszűrővel szűrt állományon egy ciklussal végigmenni úgy, hogy csak a szűrt sorok értékeit szeretném vizsgálni. Pl. egy több ezer soros állományból a szűrés eredményeként látható a 2.; 12.; 35.; 50.; 135. sor és csak ezeket szertném vizsgálni.
Ez van végül is egymás után 3x, annyi különbséggel, hogy a hónapok változnak 7, 8 és 9. Ezt a hármat szummázom, mert arra nem jöttem rá, hogyan lehetne a hónap feltételnél mind a 3 hónapra összesíteni. Az megvolt, hogy valami "és"-sel, de nem jött össze a függvény
Van egy több ezer rekordos listám, benne az egyik mező városneveket tartalmaz. Hogyan tudnék a listából olyan kigyűjtést csinálni, hogy minden városnév egyszer szerepeljen?
Ez negyedévenként összesít 4 változó alapján. 2010, július, augusztus és szeptember adataiból azokat, amelyek mellett az egyik sorban szerepel az "anyagi" szó, illetve egy másikban megegyezik az M3-ban lévő (egyébként "DP") szóval. Mindegyik feltételnek teljesülni kell, és azokat számolja össze. Nem értékeket összegez, hanem a feltételek teljesülését számolja össze.
Ráadásul nem tömbképletként vannak bevíve.
De, ha jól értem, amit írtatok, ennek nem kellene működnie.
Az eredeti kérdéshez visszakanyarodva. Lassú a számolás. Most úgy oldottam meg, hogy a második fülön (az elsőbe viszem be az adatokat, a 2. összesít) van egy újraszámol gomb ezzel:
Sub Gomb1_Kattintáskor() Application.Calculation = xlCalculationAutomatic End Sub
Az adat fülön lévő bevitelnél, a makrók futásánál ki van kapcsolva ez a számolás, így az adatbevitel gyors. Majd amikor kész vagyok, akkor vagy rányomok az újraszámol gombra, vagy rámentek/bezárom.
A bonyolultnak tűnő függvények miatt elképzelhető a lassú számolás? Vagy fogadjam el SQLkerdes véleményét, hogy sokat számolunk, sok időt vesz igénybe?
Szóval klasszikus kipontozást akarsz csinálni. Ehhez tudni kell, hogy hol vannak a tábládban a bejövő pénzösszegek és hogy hol vannak a számlák. Milyen struktúrában?
Jól értem, hogy egy sorban szerepel az összes bejövő utalás összege? Hol vannak a számlák? Hány számla van? Csinálj egy screenshot-ot a file-ról és rakd ide be. Nem az adatok érdekelnek, hanem a tábla szerkezete.
olyan excelproblémával már találkoztatok, hogy bizonyos felhasználónál nem lehet a cellákba írni. Minden más (word, notepad) szoftverbe tudok írni.... Rendszergazda alól simán megy. Valamilyen jogosultsági probléma...de nem tudom, hogy hol állíthatnám be. Már kapott a felhasználó rendszergazda jogot is, de így sem ment. Csak helyi rendszergazdával tudtam a cellákat módisítani..
Szerintem válaszoltam: 1 oszlop - 0 sor (nincs üres oszlop)
Igen bejövö utalásom van (érték).
Egy francia vevömnek több vevöi kódja van, és utalásoknál nem tünteti fel, hogy mely számlákat egyenlítenék ki. Mert van úgy, hogy mivel egy cég, de több telephely, több vevöi kódon vannak a számlái..
Szóval le tudom szürni az összes nyitottszámlájukat, ezt teszem egy oszlopba. Ebben az oszlopban kellene meglelni, hogy az utalás mely nyitott számlák kombinációja lehet, hogy tudom a bankot velük kiegyenlíteni.
Az utolsó, ; után bevitt tartománynak az összegzendő értékeket kell tartalmaznia. IGEN értékeket nem tud összeadni.
Nálad valamelyik oszlop értékeinek az összegét kellene kiszámolnia a képletnek, ha a B oszlop kezdete 2010.07 , és a G oszlop IGEN. De melyik oszlop összegeit számolja? Ezt az utolsót kell ;-vel írni az előző 3 után, és ebbe már nem jön feltétel.
Ezt a képletet csak az Adat lapon lehet alkalmazni, vagyis a feltételeknél azt nem kell megadni.
Tömbfüggvényekben való hibakeresés módja: - jelöld ki az - esetedben - SZORZATÖSSZEG egy önálló elemét. A lenti példádban, pld HÓNAP(Adat!$B$12:$B$2000)=7 - nyomd le az F9-et (ez megmutatja az adott művelet eredményét, az összeset) - UNDO-val csináld vissza - ezt csináld meg mindegyik önálló elemre - ahol hibát látsz eredményként az f9 után, ott a problémád
Ha nincs az egyedi elemek között hiba, akkor jelöld ki az egyedi elemek valamely kombinációját (lenti példa szerint: HÓNAP(Adat!$B$12:$B$2000)=7)*(ÉV(Adat!$B$12:$B$2000)=2010)
F9, hiba keresése, UNDO
Ezt addig kell csinálni amíg meg nem leled a hibát.
Ez a technika sokat segít abban hogy megértsd az adott függvény működését.
Boolean adatot (IGAZ v. HAMIS) a SUMPRODUCT nem tud szorozni. Amikor két boolean eredményt szorzásjellel összeszorzol a SUMPRODUCT-on belül, akkor az excel automatikusan számmá alakítja az eredményt (1 v. 0 lesz belőle). Ha viszont a SUMPRODUCT-ot próbálod meg arra használni, hogy az IGAZ v. HAMIS-t alakítsa át számmá, akkor az nem megy.
Szóval a nem működő képleted megpróbál pld. egy TRUE-t meg egy 1-est összeszorozni, mivel ez nem megy neki, hibaüzenetet ad.
Ezért van az, hogy az IGAZ, HAMIS eredményt adó dolgokat a SUMPRODUCT-on belül átalakítjuk. Ennek módjai: - dupla negatív előjel - 1-el szorzés, vagy - N függvény.
Az utolsó mondatot alapján (A feltételek egy pár zárójel között vannak, és közöttük * jel van, az összegzendő tartomány ;-vel van elválasztva az előbbiektől.) értettem meg a szorzatösszeg teljes lényegét...
1. Nem másoltam minden sorba, hanem teljes tartományt számol. 2. Sokadik próbálkozásra jött ki ez. 3. Az enyémből töröltem az 1-eket, és működik:-). Ez okozhat lassulást?
Kicsit átalakítottad a szorzatösszeg függvényt, de nem tudom, miért. Mit keresnek benne a *1-ek? Ezt a függvényt nem kell minden sorba lemásolni, a teljes tartományról ad képet egy cellában.
Az eredeti így nézett ki: =SZORZATÖSSZEG((HÓNAP(A1:A100)=10)*(ÉV(A1:A100)=2010);B1:B100)
a mostani: =SZORZATÖSSZEG((HÓNAP(Adat!$B$12:$B$2000)=7)*1;(ÉV(Adat!$B$12:$B$2000)=2010)*1;(Adat!$G$12:$G$2000="IGEN"
(a vége lemaradt).
A feltételek egy pár zárójel között vannak, és közöttük * jel van, az összegzendő tartomány ;-vel van elválasztva az előbbiektől.
A #777-ben leírt kérdésekre nem válaszoltál! Hány oszlop, hány sor, etc.
A számok mit reprezentálnak? Pld van egy vevői számlád és több vevői bejövő utalásod és ki akarod találni, hogy melyik utalások teszik ki pontosan a számla összegét? Más szóval, mi az alapproblémád?
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("B12:B2000")) Is Nothing Then Target.Value = Date Cancel = True End If
If Not Intersect(Target, Range("Q12:AC2000, G12:G2000, K12:K2000")) Is Nothing Then Target.Value = "IGEN" Cancel = True End If End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("K12:K2000, G12:G2000, Q12:AA2000")) Is Nothing Then Target.Value = "NEM" Cancel = True End If
End Sub
A fenti makrók közül csak a dátum beírása lassul le, illetve írja ki a végén, hogy cellák újraszámolása.
Az első sor a sorszámokat tartalmazza előre beírva, emiatt a kijelölendő terület mindig a teljes lesz :-(
Most az egész táblázatot elölről kezdtem, és csak 2000-ig számoltatom, illetve keresek adatokat a szorzatösszeg különböző variációival. Pl.: =SZORZATÖSSZEG((HÓNAP(Adat!$B$12:$B$2000)=7)*1;(ÉV(Adat!$B$12:$B$2000)=2010)*1;(Adat!$H$12:$H$2000="Anyagi")*1)
A képletekkel nincs is gond, remekül működnek. Vagy a hónapot/évet, vagy a 3. változót cserélgetem.
Most, hogy egy jó darabon fel lett töltve a táblázat, észrevettem, hogy lassulnak a makrók (a szorzatösszeg függvények számának emelkedésével).
Beraktam az ajánlott esemény tiltás, újra számolás, képernyő frissítés variációkat, valamint ezek engedélyezését a a makró(k) végére. Most villámgyorsan beviszi a makró műveletet, azonban UTÁNA homokozik egy cseppet, és kiírja, hogy cellák újraszámolása.
Szerintetek ez ellen lehetne valamit tenni? Megfelelőnek tartjátok-e, ha a függvényeket tartalmazó fülön egy gombot létrehoznék, ami újraszámol?
Hát, a kérdésed azt sugallja, hogy eddig nem sok makrót írtál. Azt kell mondjam ez nem az a probléma, amivel a makróírást elkezdeném.
Amire szükséged van, az egy ún. brute force módszer, vagyis minden sor minden adatának minden variációját végig kell próbálja.
Hány oszlopban és hány sorban van adatod? Mindegyik oszlop tartalmaz adatot (vagyis az a jó, ha mindíg pld 12 számot kell variálni, nem pedig az 1. sorban 12-t, a másodikban meg csak 3-at). Az egyes sorok számai között vannak üres cellák?
Lehet, hogy az alapproblémád leírása is segítene, mert gyakran előfordul, hogy a kérdező kitalál valamilyen megoldást a problémájára és csak a makró futtatása során tapasztalt dolgok miatt jövünk rá, hogy lett volna egyszerűbb megoldás is.
Van az A oszlopodban egy halom keresztnév, mellettük a B és C oszlopokban összegek. A feladat, hogy a sorban, ahol a Vilhelmina név szerepel, a D oszlopba a B és C szorzata kerüljön. Többezer sor van.
Sub szoroz() Dim sor As Integer
For sor = 2 To Range("A65536").End(xlUp).Row If Cells(sor, 1) = "Vilhelmina" Then Cells(sor, 4) = Cells(sor, 2) * Cells(sor, 3) Exit For End If Next End Sub
A feltétel az If-es sor. Tudjuk, hogy csak 1 Vilhelmina van, ezért a művelet elvégzése után nem nézetjük tovább a rengeteg további nevet, hanem kilépünk a ciklusból. Ebben az esetben Exit Sub is lehetett volna a kilépés.
Nincs mit. Arra figyelj, hogy ebben a makróban a Target tartomány jelöli a megváltozott cellákat. Egyszerre ugyanis nem csak egy, hanem több cella is megváltozhat, pl. értékek törlésekor, másolás-beillesztéskor, stb. Nagyon kifinomult szűréseket is lehet csinálni arra nézve, hogy milyen Target esetén fusson le a makró, és mikor ne. Én most azt a feltételt adtam meg, hogy a megváltozott tartomány egyoszlopos legyen, és ez az egy oszlop az első (A) oszlop legyen. Nem tudom, hogy a céljaidnak mi a legmegfelelőbb.
már csak azt kellene tudnom, hogy mit változtassak ha a pl: E oszlopba szeretnék írni és ennek hatására a 15-ik oszlopba kellene hogy beírja az időpontot
Igazándiból, ebből számomra nem látszik, hogy mitől lassult le, de, ha vannak a munkalapon képletek, ennek folyamatos újraszámoltatása okozhatott lassulást.
Ebből kiindulva az újraszámolás ki/be kapcsolása segíthetett.
Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range If (Target.Columns.Count = 1) And (Target.Column = 1) Then For Each c In Target.Offset(, 2) If c = "" Then c = Now Next End If End Sub
egy excel táblában azt szeretném, hogy pl: az A oszlop egyik cellájába adatbevitelkor, az ugyanabban a sorban lévő C oszlopba írja be a bevitel dátumát, idejét és ez frissítéskor ne változzon meg.
Eljutottam odáig hogy ide célszerú VB-t használni.
A következő már majdnem jó:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Const LNG_OSZLOP As Long = 3 Dim lngSor As Long lngSor = ActiveCell.Row - 1 If Cells(lngSor, LNG_OSZLOP) = "" Then Cells(lngSor, LNG_OSZLOP) = Now() End If End Sub
csak itt az a probléma, hogy akárhova írok a táblázatba, beteszi a dátumot/időt, holott csak az A oszlop azonos sorába íráskor kellene hogy működjön.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("B12:B65000")) Is Nothing Then Target.Value = Date Cancel = True End If
If Not Intersect(Target, Range("Q12:AC65000, G12:G65000, K12:K65000")) Is Nothing Then Target.Value = "IGEN" Cancel = True End If
End Sub
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("K12:K65000")) Is Nothing Then Target.Value = "NEM" Cancel = True End If
If Not Intersect(Target, Range("G12:G65000")) Is Nothing Then Selection.ClearContents Cancel = True End If
End Sub
EDDIG ezek futottak vánszorogva. Aztán a tegnapi hóka-móka (amit ajánlottál) után, már rendesen futnak.
Aztán ezek mellett vannak még ezek: Sub Gomb9_Kattintás() Range("A12:AD65000").Select Selection.Sort Key1:=Range("A12"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Range("A12").Select
Ez(ek) a fejlécgomb(ok) sorba rendezik az adott oszlop alapján az egész táblát. Ez is kínkeserves volt. Ez elé, illetve mögé nem írtam semmit, de már ez is normálisan fut.
Az Application.EnableEvents = false volt a ludas, ezt ki kell venni, illetve a kattintások közötti feldolgozási rész eljére tenni (a végén pedig visszakapcsolni). Egyébként még be lehet illeszteni a képernyő frissítések ki/be kapcsolását is, ez is lassíthat.
Application.ScreenUpdating = False 'kikapcsolás
Application.ScreenUpdating = True 'bekapcsolás
Mondjuk, a leghatékonyabban úgy tudnánk segíteni, ha mutatnál kódot (kódrészletet) ami lassan fut.
1. Beírtam a kérdéses makró elejére és végére, amit ajánlottál. 2. Erre gyorsan (nem vacakolva) beírt egyet, de utána a dupla klikk, illetve maga a makró nem működött. 3. Mentettem, bezártam 4. Újra megnyitottam, a dupla klikk és a makró ugyanúgy nem működött. 5. Töröltem az általad leírtakat a makró elejéről-végéről, majd ment/bezár 6. Megnyitottam újra, és tökéletesen működik, semmi tökölés, villámgyorsan ír be, de az eredeti állapothoz képest (elvileg) nem változott semmi.
Érdemes lehet szemügyre venni magukat a makrókat is. Általában lehet a meglévőnél hatékonyabb algoritmust találni. Tipikus hiba, amikor ciklusban sorra Select-áljuk a cellákat. Semmi értelme, viszont hálából 10-szeres lassulást okoz.
Ha sok a képlet a munkalapon, esetleg érdemes kikapcsolni a képletek újraszámolást, mert minden változáskor ez lefut. Aztán még meg lehet próbálni az események futását is kikapcsolni a makró futásának idején, hátha ez is lassít valamit:
Application.EnableEvents = False ' ne fussanak az események Application.Calculation = xlCalculationManual 'ne számolja újra a képleteket
Ne felejtsd el a nakró végén ezeket visszakacsolni:
Application.EnableEvents = True ' fussanak az események Application.Calculation = xlCalculationAutomatic 'mehet a képletek újraszámolása
Ezen a ponton már érdemes foglalkozni az algoritmusok hatékonyságával. Például egy rendezésnél, aminek a lépésszáma az elemszámmal közel négyzetesen nő, bizony előfordulhat ez. Tehát érdemes körülnézni a rendezési algoritmusok elméletében.
Azért nem, mert egy "üres" lapot tölt ki a felhasználó adatokkal. Ebben az "üres" lapban vannak adatbevitelt könnyítő makrók, valamint sorba rendező makrók amiknek természetesen az egész lapon kellene működniük.
De, ha bármilyen okból több ezer sort vizsgálnánk (mert szükséges), akkor természetes ez a lassulás?
Jó a kérdésed, őszintén szólva, most kipróbáltam, szóval, ha az adott oszlop 65536. sorában van valami adat, akkor is az ettől felfelé az első értéket képviselő sort adja eredményül, vagyis, ebben az esetben nem ad jó eredményt...
Jó, hogy felvetetted, használat előtt ezentúl már ezt is vizsgálni fogom pl. így:
If Range("A" & Rows.Count) = "" Then MsgBox "Az 'A' oszlop utolsó sora: " & Range("A" & Rows.Count).End(xlUp).Row Else: MsgBox "Az 'A' oszlop utolsó sora: " & Rows.Count End If
Köszönöm, így már teljesen világos. Ha én írtam volna ezt a Basicet, lenne valami egyszerűbb megoldás, amit megérteni is egyszerűbb lenne, mondjuk Last néven. :-) Jut eszembe, ez a megoldás akkor is működik, ha a 65536. sorban is van adat? Mert a lenti kísérletem nem erre utal.
Rows.Count = a munkalap utolsó sorának száma (Excel2003 esetében ez 65536)
End(xlUp).Row = az utolsó sorhoz képest felfelé az első értéket képviselő sor
Range("A" & Rows.Count).End(xlUp).Row = az "A" oszlopban az utolsó értéket képviselő sor, és mindegy, hogy előtte vannak üres sorok is vagyis nem folytonos a kitöltés.
Hát igen, nehéz egy mondatban összefoglalni, de pontosan arról van szó, amit leírtál. Talán azt lehetne mondani, hogy az aktuális összefüggő adattartomány adott irányba eső végére ugrik, ha pedig éppen a végén vagy, akkor a következő, adott irányba eső összefüggő adattartomány közelebbi végére.
A teljességhez hozzátartozik, hogy makróban az End művelet az aktív cellát nem viszi sehová, nincs is semmi köze az aktív cellához. Csak átdefiniálja a tartományt, amelyre a tényleges művelet majdan vonatkozni fog. Ez a sor
Range("C122")
önmagában semmi, csak egy tartománydefiníció. Ehhez adódnak hozzá módosítók, mint pl. az End, Offset, Resize, stb.
Range("C122").End(xlUp)
A Range("C122") -höz képest megkeresi a következő adattartomány-határt, és ez lesz a módosult tartománydefiníció. Módosítókat halmozni is lehet, pl
tudom macerás, nem automata, de megoldás, miszerint, ha pl a böngészőben az éppen olvasott weblapot mentés másként címmel lementitek, akkor az excel simán meg tudja nyitni, mindent lehet vele csinálni.
hogy kevesebbet kelljen mentegetni, itt akár 500 hozzászólás is lehet egy filécske.
vagy van pl. winhtrack nevű oldalletöltögető progi, ami az egész, összes hozzászólást lementi, persze be kell állítani, hogy ne keressen túl távoli linkek után, tehát ne töltsön az igényeidnek mélyebb fastruktúrát.
ilyesmi oldal letöltögető természetesen elég sok féle van, ki melyikre esküszik.
a lényeg, hogy a bármimódon lementett html, vagy mht, vagy bármi webformátumot az excel simán kezeli.
Ez kicsit zavaros. Ha üres cellán állok, felugrik a fölötte levő legalsó adatra. Ha nem üres a cella, de felette üresek vannak, akkor felugrik a "luk" feletti legalsó adatra. Ha viszont folytonosak az adatok, akkor átugorja a felette levőket, és a folyamatos adattartomány legfelső nem üres cellájára ugrik. Ha nincs a cella fölött adat, akkor meg az oszlop tetejére.
A makrók futása iszonyatosan lelassult egy táblázatban.
Ha duplán kattintok (mert a dátumot íratom be), akkor a lap alján kiírja, hogy: "számítás (2 processzor):" majd százalékérték emelkedik 100%-ig. Amikor 100 lesz, akkor fejeződik be a makró futása, de ez vagy 6 másodperc.
3-4 egyéb makró van benne, meg alig pár adat, még csak most kezdtem felépíteni. 2003 és 2007 alatt is produkálja. Más dokumentumban lévő makrók rendben futnak.
Azt hiszem, le is fagyna két hétre a gépem... Egyszer már nekiláttam fejleszteni egy programot, amelyik Pegasus Mail formátumú levelekké konvertál egy topikot, és így szét lehet dobálni folderekbe, csak aztán leálltam. Igazából azt hiszem, a wiki az ilyen szerteágazó ismeretek rendszerezésének a korszerű módja, a másik gépemen van is már telepítve egy saját wiki, csak az éppen megmurdelt alaplapilag.
A tervedhez adok egy ötletet. Hívd be az egész topikot, van ennek valami módja, valaki már megírta nekem, csak már elfeljtettem hova tettem. Majd Ctrl+C CTRL V-el másold át Éxcelbe Egy bekezdés-egy cella. Ami jól olvasható, ha rámutatsz az egérrel. Persze állíthatsz is a cellaméreten, de az babrásabb. Na most ezt végigolvasva a szomszédos cellában megjelölheted a téged érdeklő postokat, akár le is tárgyszavazhatod őket, majd a téged nem érdeklőket törlöd. Elötte persze még érdemes a sorokat sorszámmal ellátni, hogy törlés után a sorrendet helyreállíthasd.
Találkoztatok már azzal a buggal, ami az Autamatikus javítások-ra való klikkelésnél nem a megfelelő lapra, hanem a Windows XP filekeresőjére ugrik (Excel 2003-ban). Mert nálam momentán ez van, és elég bosszantó. Ha nálatok jelentkezne ilyesmi, hogy próbálnátok meg a helyreállítani?
Van valami mód makrók nélkül arra, hogy megvizsgáljuk, a mai dátum meghaladta-e az egyik cellában beállított dátumot? Hogy lehet lekérdezni az épp aktuális dátumot?
Gondolom, igen, ugyanezzel a logikával. ÉV(A1:A100)=2010 -- ez egy logikai kifejezés, amely az igazhoz egyet, a hamishoz nullát rendel. Ha a B1 helyébe azt írod, hogy (B1:B100="B"), akkor valósznűleg minden B betűhöz egyet rendel, és megkapod a darabszámot összegként.
Köszi, akkor fel is hozom ide, hogy könnyebb legyen megtalálni (előzmény). Csak azt hiszem, hogy ezt elég nehéz módosítani, ha a 30. sor alá újabb adatokat viszünk be, tehát bizonyos értelemben nem illeszkedik az Excel filozófiájába, de kétségtelenül nagyon hasznos.
Már többször elhatároztam, hogy egyben végigolvasom és kijegyzetelem az egész topikot, mivel elképesztő mennyiségű bölcsesség van itt felhalmozva, de mindig megálltam egy bizonytalan jövő idejű elképzelésnél. :-)
Akkor nem fogalmaztam világosan, mert akik ezt csinálják, sosem hallottak tömbfüggvényről. Beírja a tag az 1. sorba, hogy A1:A30, noha ott éppen csak az első sor adatával dolgozik (mindegyik mellett egy eredménynek kell látszania), majd megfogja a jobb alsó sarkát az egérrel, és folytatja a 30. sorig. Ahol lesz belőle A30:A59, de ennek már semmi köze a táblázat adataihoz.
Mondjuk még a felvetésedhez hozzátartozik az, hogy a HA(A1>100...) egy cellába kerül, addig a HA(A1:A30>100...) egy 30*1-es tömbbe. És a tömbfüggvényes változatot nem sima ENTER-rel, hanem tömbfüggvényhez méltóan CTRL+SHIFT+ENTER-rel kell lezárni.
A tömbfüggvény kevesebb helyet foglal memóriában, bár én a mai számítási és merevlemez kapacitások korában ezt nem érzem átütő érvnek...
Az ellenszenvedet :-) az okozza, hogy a HA függvényt tömbfüggvényként használják, ami szerintem teljesen helyes, néha helyesebb is mint a nem tömbfüggvény.
Én azt szoktam mindíg mondani, hogy ha egy új oszlopot csak azért készítünk, hogy oda kiszámoljunk valamit, amit majd valami más függvény fog bemeneti adatnak használni, akkor az rossz. Többek között az ilyen esetekre találták ki a tömbfüggvényeket.
Vegyük Redlac lenti problémáját. A Hónap adatot csak azért raktad volna egy új oszlopba, hogy utána kielemezhesd, hogy az adott sor egy bizonyos hónaphoz tartozik-e. Felesleges adat a képernyőn, még akkor is ha elrejted.
Helyette a jó megoldás a feladat memóriában elvégeztetése ahogy Delila meg én csináltuk, beágyazva valamilyen más függvénybe (Delila a sumproduct-ot használta én a sum-ot).
Pld. tegyük fel, hogy az A1:A100 tartomány egyszerre tartalmaz string és szám adatokat és meg kellene tudjuk határozni a számok közül az 5. legnagyobbat. (A SMALL függvénynek nem adhatjuk meg a teljes A1:A100 tartományt, mert nem számok is vannak benne).
Hagyományos megoldás az lehet, hogy a B oszlopba berakunk egy HA függvényt, ami ISNUMBER igaz esetén a releváns cella tartalmát (ami szám), hamis esetén nullát (v. egy kellően kis számot ad vissza ami tuti nem kerülhet be az 5 legnagyobb szám közé (pld mínusz egymillió). Ezek után a B oszlopot már vizsgálhatjuk a SMALL (B1:B100,5) függvénnyel, hogy az áhított eredményt megkapjuk.
Ezzel szemben a helyes megoldás a cseréket memóriában elvégezni egy IF függvénnyel és ezt az egészet beágyazni a SMALL függvénybe, valahogy így: =SMALL(IF(ISNUMBER(A1:A100);A1:A100;-1000000),5).
Látszik hogy az IF tökéletesen funkcionál tömbfüggvényként.
Ez nagyon elegáns megoldás! Nekem nem jutott volna eszembe ez sem, hogy ilyen módon lehet tartományokra hivatkozni egy szorzásnál.
Ehhez kapcsolódó kérdés: Gyakran látom, hogy mondjuk a1:a30-ban van valamilyen szám, és akkor a HA(A1>100;'nagy';"kicsi") típusú függvény helyett emberek HA(A1:A30>100;'nagy';"kicsi")-t írnak, aminek a vége persze a sorozat kitöltése után már HA(A30:A59>100;'nagy';"kicsi") lesz, miközben a 30. sor alatt egészen más van. Én erre azt szoktam mondani, hogy rossz, fogalmilag zavaros, noha meglepetésemre a helyes eredményt mindig kiadja. Lehet, hogy tévedtem? Tekinthető ez elvileg egyenértékű helyes megoldásnak? Mert míg egy szorzatösszeg eleve tartományokat szoroz, a HA függvénynek ebben az alkalmazásban értelmezésem szerint csak egy sorban levő adatokkal lehet dolga egyszerre.
Excel array formula series Itt is van. Asszem főiskolán tanít a csóka és a tananyagot felteszi youtube-ra. El sem tudom mondani mennyit tanultam ezekből a videókból. (elsősorban alázatot, mert eddig azt hittem, hogy jó vagyok excelből...)
Tömbképlet, ahogy nagyon helyesen gyanítottad is. Az angol helpben array function címszó alatt érdemes keresni. Ha jobban érdekel akkor a youtube-on keress rá az: "array function" excel -re és találsz rengeteg segítséget.
Külön ajánlom az excelisfun nevű felhasználót. A csóka agyát halála után valszeg el fogja lopni a Microsoft... Persze lehet már előre megvették rá az opciót :-)
Ja, már látom nem a kérdésedet választoltam meg. Szóval feltételezve, hogy: - a dátumok az A1:A100 tartományban vannak, - az összesítendő adatok a B1:B100-ban (pld. számlák nettó összegei).
A 2010. 10. havi számlák összesenje: =sum(--(month(a1:a100)=10)*--(year(a1:a100)=2010)*b1:b100)
helyesen a második függvény, lentebb rossza a zárójelezés: =sum(--(month(a1:a100)=10)*--(year(a1:a100)=2010))
Szólj ha pld az adott hónap kibocsátott számláinak (vagy bármi is van a többi oszlopodban) összesenjét is szeretnéd látni, bár innen már relative könnyen kikisérletezhető.
Hát ez nem túl elegáns megoldás, de én kitenném a hónapot egy külön oszlopba, mondjuk b1=hónap(a1), amit el is lehet rejteni, és ezt használnám kritériumnak. Gyanítom, hogy valami tömbképlet lehet a kanonikus megoldás.
Szumha függvényt már használtam, csak annyi lenne a kérdésem, hogyan határozom meg azt a kritériumot, hogy adott hónap adatait számolja. Tehát egy tartományba különböző jellemzőket írunk be. Az első oszlop a teljes (2010.07.01) dátumformátum. Naponta több adat is kerülhet bele. Utána pár oszlop melyekből gyűjtenék. Ezeket szeretném havi összesítőbe rendszerezni.
Adott egy közös használatú excel file, amit 8-10 felhasználó tölti fel adatokkal. Vegyesen 2007 illetve 2003-as office-ok vannak. 14 munkalap van, semmi bonyolult képlet, nincs makró, fájlhivatkozások... stb, szóval viszonylag egyszerű.
Nos a file mérete 1MB-ról indult ami drasztikusan növekszik, akár néhány adat beírása után a duplájára. Gondolom a kompatibilitási mód a 2007 és 2003 között okozza ezt, de valahogy meg kellene állítanom.
Most 24MB méretnél tartunk, az utolsó mentés előtt még 12MB volt.
Tapasztaltatok már ilyet? Hol kellene keresgélnem?
Talán azzal, amelyikhez van jó könyved, vagy tudsz segítséget kapni a környezetedben. Ha rendszeresen akarsz Excel-problémákat megoldani makróval, akkor akár a Visual Basic is lehet. A Basicet ugyan sokan fújolják, de generációk tanulták rajta a programozást, olyan rossz nem lehet.
Az a jelvény mizéria... Évekig ugrattak vele. Ne kezdd Te is! De ha már szóba elegyedtünk, megkérdezném, hogy szerinted melyik programozási nyelvvel, fejlesztőkörnyezettel érdemes kezdeni a tanulást abban az esetben, ha teljesen kezdők vagyunk programozás terén.
... nos, igen. Sajnos a gazdasági válság elérte a "céget" is. Nekem kell az irodai munkát is elvégezni. Helikopteres üldözésre, államokon átívelő hajtóvadászatra már nincs keret.
Makró írással kapcsolatban szeretnék segítséget kérni. Van 3 oszlopom. A, B és C. A-ban a dátum van, B-ben a dátumhoz kapcsolódó összeg, a C pedig egyelőre üres. Azt szeretném, hogy ha azokat az összegeket, amelyekhez a mai, vagy egy korábbi dátum tartozik, átmásolná át a C oszlopba. 2 órája küzdök vele, de semmire nem jutottam. Előre is köszönöm a segítséget.
Nálam a 11415 indentálva van, a 11412 meg nincs. FF, legújabb frissítés. Talán a beírásnál számít a böngésző. Viszont: az amit lejjebb írtam, mindig működik, és egyszerű szövegcserével berakható.
Az xl2007-ben a View menüben van egy View Side-by-side rész, én ott keresgélnék.
1.) View/New window (ez csinál egy új ablakot a munkafüzetednek, így már kétszer láthatod ugyanazt). 2.) View/View side by side (ez egymás alá rakja a munkafüzeted két ablakát 3.) View/Arrange All, ezzel vertikálissá teheted a két ablakot 4.) View/Synchronous scrolling (ezzel lekapcsolod a két ablak szinkron görgetését).
Hogy ezt ne kelljen minden egyes alkalommal megcsináljad, én javasolnám a View/Save Workspace alkalmazását.
Előrebocsátom, hogy nem tudom mi a megoldás, de arra gyanakszom nem a SelectionChange.
Mert te itt arról beszélsz, hogy ha gördíted a táblázatot ... és a scrollozás nem jár kijelöléssel.
Esetleg azt lehet VBA-n kívül megpróbálni, hogy a munkalapot két részre bontod. Az egyiken lesz a táblázatod (amit gördíthetsz ahova akarsz) a másikban pedig mozdulatlanul vigyázzban áll a chart.
"a sor eleji space-eket az Index lakapta... ". Nem mindegy, melyik böngészőből hívod meg a fórumot, erre Jimmy jött rá. Az IE szépen hozza a tagolást (csak itt használom).
Itt a módosított verzió:
Sub summa_1() Dim oszlop As Integer, lap As Integer, oszlop_1 As Integer Dim sor As Integer
For lap = 1 To ThisWorkbook.Sheets.Count - 1 Sheets(lap).Select
For sor = 1 To 150 If Sheets("Összesítő").Range("IV" & sor).End(xlToLeft).Column = 1 Then oszlop_1 = 4 Else oszlop_1 = Sheets("Összesítő").Range("IV" & sor).End(xlToLeft).Column + 1 End If
For oszlop = Range("IV" & sor).End(xlToLeft).Column To 1 Step -1 If Cells(sor, oszlop) > "" Then Sheets("Összesítő").Cells(sor, oszlop_1) = Cells(sor, oszlop) oszlop_1 = oszlop_1 + 1 End If Next Next Next
Valamiért nem bírtunk leszakadni erről a 10. sorról, miközben a sok információ között elrejtve :) ott lapult, hogy van vagy 150 vizsgálandó sorom is (!) munkalaponként. Nyafogás helyett (nagy kedvvel, de segédlet nélkül) belevetettem magam a VB makróírásba, így most már van egy új ciklusom az eddigieken felül (ováció!). Már csak egyetlen kérdésem lenne: nem találom a szintaktikáját a Range változó (?) argumentumának. A te makródban ez "IV10", ami, ahogy rájöttem a ctrl-end megfelelője a 10. sorban (ugye?). Hogy lehet ezt "univerzálissá" tenni, hogy az esetemben "For sor=1 to 150" ciklus bármely sorában érvényes legyen? Ui. akármilyen szintaktikával próbálkoztam, nem jött be.
jelenleg így állok:
Sub summa() Dim oszlop As Integer, lap As Integer, oszlop_1 As Integer, sor As Integer
For sor = 1 To 150 'paraszt módszer/1 oszlop_1 = 4 'nekem így jó For lap = 1 To ThisWorkbook.Sheets.Count - 1 'ez tiszta Sheets(lap).Select For oszlop = 1 To 20 'paraszt módszer/2-kínomban, és step -1 nélkül a fasza If Cells(sor, oszlop) > "" Then Sheets("Összesítő").Cells(sor, oszlop_1) = Cells(sor, oszlop) oszlop_1 = oszlop_1 + 1 End If Next Next Next Sheets("Összesítő").Select End Sub
Range("IV150"), Range ("IV"; sor) és hasonlókkal próbálkoztam, de egyik sem kóser...
Adott egy táblázat (70 sor, 9 oszlop). Az első 3 sor rögzítve van. A táblázat mellett van egy chart (5. sortól). Amit szeretnék megoldani, az az hogy ha a táblázatot gördítem hogy az alsó sorok is látszódjanak, akkor a mellette levő chart is mozogjon - maradjon látható. (excel 2007)
Azt sejtem hogy a munkalap SelectionChange eseménye lesz a barátom, de hogyan?
Ha a sorrend mindegy, ez a makró elintézi. Az utolsó lap legyen az, ahol összesítesz, a makróban ez Összesítő névre hallgat.
Sub summa() Dim oszlop As Integer, lap As Integer, oszlop_1 As Integer
oszlop_1 = 1 For lap = 1 To ThisWorkbook.Sheets.Count - 1 Sheets(lap).Select For oszlop = Range("IV10").End(xlToLeft).Column To 1 Step -1 If Cells(10, oszlop) > "" Then Sheets("Összesítő").Cells(10, oszlop_1) = Cells(10, oszlop) oszlop_1 = oszlop_1 + 1 End If Next Next
Ilyen függvény, ha van is, a nem-éri-meg kategóriába tartozik. Ez makro lesz, nem túl bonyi, de most el kell menjek, szóval a kódot hátha valaki beszúrja. Délután megint erre járok, ha addig nincs meg, akkor megírom.
Egyáltalán van-e ilyen mátrixfüggvény. Ha nincs, nyilván az utolsó fül tartományon belüli minden cellájának tartalmaznia kell egy rohadt hosszú vizsgálati képletet (ezt akartam elkerülni).
És ezek milyen sorrendbe kerüljenek az összesítő fülre? Mondjuk ha a Munka1-en van 2 adat a 10. sorban, a Munka2-ben meg csak egy, akkor az Összesítő A10 és B10 mutassa a Munka1 adatait, majd az Összesítő C10 a Munka2-t?
Szóval csak balról jobbra feltöltve?
Vagy: Ha a Munka1-en a D10-ben van adat akkor az az Összesítőn is a D10-be kerüljön (persze ehhez biztosnak kell lenni benne, hogy semmi más munkalapon nem lesz tartalma a D10-nek, mert akkor kettő tartalmat kellene betaposni egy cellába).
Nem, semmi összehasonlítás, csak annak vizsgálata kellene, hogy van-e szám az adott cellában (ez esetben röpül az érték az utolsó fül adott sorának a végére), vagy nincs.
Ja, csak egy, vagy egy sem, esetleg 13, esetleg az összes, ahogy a számítás adja (A feltételek nem teljesülése esetén a cellák értéke: "" ,azaz semmi.) (De lehet nulla is, ha úgy könnyebb.)
Köszi, Delila, de biztosan pontatlan voltam, ez így nyilvánvaló.
A harmadik fül (pl.) 10. sorában kellene kigyűjteni a többi fül 10. sorát, ui. nem feltétlenül a B,F,C,K stb. oszlopokban jelenik meg érték, hanem a 10-es sorok (egyéb képletek által generált) BÁRMELY cellájában (oszlopában) megjelenhet!!!
(A valóságban van vagy 30 fül és mindegyiken 25 oszlop-50 sor, a 31-edikben szeretnék összesítést készíteni soronként!)
Ugyanúgy ahogy a munkalapokon. A Find résznél kattints rá az Options gombra és ott be lehet állítani, hogy munkalapot (Sheet) v. munkafüzetet (workbook) nézzen át.
Sziasztok! Egy kis segítséget kérnék: különböző füleken található (azonos) sorok tartalmát szeretném egy külön fülön kigyűjtögetni, szépen sorban egymás mellett.
Pl. az első fül tizedik sorában van 2 szám (mondjuk a "B10" és az "F10" cellában), a második fül "C10" és "K10" cellájában szintén egy-egy szám stb., ezeket szeretném kigyűjteni harmadik fül 10. sorába, A10,B10,C10,D10... cellákba.
Köszi neked is. Majd kipróbálom a részösszeget is, de egyelőre a fejléc tűnt a legjobb megoldásnak, mert így kevesebbet kell formáznom (oda, ahol a fejléc kerül, nem kell rács, a táblázat többi része meg rácsos.... csupa-csupa felesleges klikk :)
Én 2007-essel néztem és "rossz" volt. Felmerül bennem a kérdés hogy mivel mentetted el? 2003-as v. 7-es? Bár alighanem nem bír semmilyen jelentőséggel.
Excel 2003-ban készítettem egy kimutatást, abból egyszerűen csináltam egy kimutatás diagramot, csodásan működik.
Excel 2007-ben megnyitva viszont nagyon sz.r lett: - A külön fülön levő kimutatásdiagram, nem az lett, mert nincsenek rajta a kimutatás szűrők (azaz a feltételelek), így aztán át kell menni a kimutatásra, szűrni, majd vissza a diagramra, hát ez így nagyon vacak! - Ha Excel 2007-ben készítek a kimutatásból diagramot, akkor meg nem külön fülre teszi, pláne nem szűrőkkel, így meg aztán lehet kerülgetni a kimutatást, h a diagram is jól látszódjon.
Ezt hogy bírták így elrontani, nem értem, vagy csak én nem értek hozzá?
A workbook kódlapjára rakd ezt a kódot. Teendők: változtasd meg a strsheetname="sheet1" sort úgy, hogy a sheet1 helyére a te munkalapod nevét írod. Pld. ha az autoszűrést tartalmazó munkalapodnak az a neve, hogy leltár, akkor a kód helyesen úgy néz ki, hogy: strsheetname="leltár"
Ez a kód azt csinálja, hogy minden nyomtatás előtt automatikusan beállítja a fejlécet a megfelelő szövegre 15-ös betűtipussal. Ha nagyobbat akarsz akkor a kódban lévő két 15-öt cseréld ki arra a számra, amit betűméretnek szeretnél. Mindkettőt!
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim intVisible As Integer Dim rng As Range Dim strSheetname As String
strSheetname = "Sheet1"
For Each rng In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Areas intVisible = intVisible + rng.Rows.Count Next rng
intVisible = intVisible - 1 'A fejléc nem számít bele
Sheets(strSheetname).PageSetup.CenterHeader = "&15 A lista tartalmaz " & intVisible - 12 & " elemet. &15"
Az új kód a betűméret változtatás nélkül: ****************************************
Sub ChangeHeader()
Dim intVisible As Integer Dim rng As Range
For Each rng In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Areas intVisible = intVisible + rng.Rows.Count Next rng
intVisible = intVisible - 1 'A fejléc nem számít bele
With ActiveSheet.PageSetup .LeftHeader = “” .CenterHeader = "A lista tartalmaz " & intVisible-12 & " elemet." .RightHeader = “” .LeftFooter = “” .CenterFooter = “” .RightFooter = “” End With End Sub
Azt meg lehetne csinálni, hogy azt a számot írja ki, hogy mennyivel nagyobb, mint 12? És úgy, hogy a szám ne a sor végén legyen? És lehet-e betűméretet növelni? Próbálkoztam, de nem sikerült...
Pl.: A lista tartalmaz .... (autoszűrőzött eredmény mínusz 12) elemet
köszönöm szépen a válaszokat és főleg, hogy ilyen gyorsan jött
az első kérdésemmel kapcsolatban azért szenvedtem, mert én fordítva akartam módosítani, tehát kettőspontosra akartam módosítani a simát :D Ebből látszik, hogy amikor sietne az ember, nem tud józan paraszti ésszel gondolkozni :D
Ha már nem frissítettem az előbb: A nagy lista mellé készítesz egy oszlopot a kis listából így: =HELYETTE([kicsi.xls]munkalapneve!A2;":";""), és ezt lefelé folytatod. Mind a két táblázat legyen megnyitva.
Most már egymás mellett vannak, vagy a nagy lista elemei mellé írsz egy darabtali függvényt, ami mutatja, hányszor szerepel az adott elem a kicsiban (praktikusan 0 vagy 1), és aszerint rendezel, vagy feltételesen formázod ugyancsak a darabteli függvénnyel.
Az a lényeg, hogy a nagy listában ki kell jelölnöm azokat az eszközöket, amelyek a kicsiben benne vannak. Amik pedig nincsenek benne, azokat az eszközöket kell majd a késbbiekben begyűjtenem.
A lépések: 1.) a MAC címek azonos formátumra hozása 2.) egyezőségek azonosítása
Megoldás:
1.) SUBSTITUTE függvény. Ha pld a 00:0X:08:Y0:XY:88 formátumú MAC cím a B1 cellában van, akkor el tudod távolítani a kettőspontokat a következő módon: =SUBSTITUTE(B1,":","")
2.) VLOOKUP függvényt teszel a nagyobb lista minden sora mellé, hogy keresse meg van-e egyező MAC cím a kisebb listában. Ha megadod a két táblázat szerkezetét, akkor a VLOOKUP megírásával is szívesen segítünk. Mit akarsz látni ha egyezés van? A kis lista egy elemét (pld felhasználónév) vagy csak annyit, hogy "Van kislista elem"?
3.) akár még Feltételes formázással is megjelölheted a nagy lista azon elemeit amiknek nincs kislista párjuk (de ehhez is kell mindkét lista szerkezete)
van két táblázatom, az egyikben több ezer sor, a másikban kb 1000 sor, a feladatom az lenne, hogy megnézzem a kisebb lista szerepel-e a nagyobbik listában.
A gond csak az, hogy egy oszlop egyezés van a kettőben, ami viszont MAC cím, és más formában van két listában. Az egyikben 000X08Y0XY88, míg a másikban 00:0X:08:Y0:XY:88.
A kérdésem az, hogy lehet módosítani az első formátumot a másodikra, hogy egyezést találjon az excell? Illetve, ki lehet valahogy íratni, vagy jelöltetni a nagy táblában, hogy melyek azok, amelyek nincsenek benne a kicsi listában?
Ma volt egy érdekes hiba, amire nem tudtam mit mondani. Office 2002 van a gépen, és amikor egy hálózati meghajtón található XLS-re kattintott kétszer a felhasználó, akkor elindult az Excel, csak éppen az állomány nem jelent meg benne. Csak egy szürke mező látszott, alul pedig kiírta, hogy Kész, és semmi más nem történt. Ugyanakkor - illetve utána - a Megnyitás funkcióval már sikerült megnyitni az állományt, és látszott rendesen. Viszont amikor újra kipróbáltuk, azaz becsuktuk az Excelt (még a Feladatkezelőben is ellenőrizve, hogy már nem fut), és újra megpróbáltuk kettős kattintással megnyitni az XLS-t, akkor ismét ugyanez történt. Látott már valaki ilyet? Mi lehet a gond, illetve a megoldása? A gépen Windows XP van, SP3-mal.
Nem tom. RESZOSSZEG? Ha a RESZOSSZEG(102,A:A) függvényt használod, akkor a függvény maga ne legyen az A oszlopban (különben beleszámolódik) és vonj le az eredményből 1-et (a fejléc miatt).
Na, szóval itt van. A makrót minden nyomtatás előtt le kell futtatni. A kért adat a középső fejlécbe kerül, minden más fej- és lábléc üressé válik. Ha máshol van szöveg akkor a releváns részt érdemes kivenni a kódból.
Sub ChangeHeader()
Dim intVisible As Integer Dim rng As Range
For Each rng In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Areas intVisible = intVisible + rng.Rows.Count Next rng
intVisible = intVisible - 1 'A fejléc nem számít bele
With ActiveSheet.PageSetup .LeftHeader = “” .CenterHeader = "A szûrés utáni sorok száma: " & intVisible .RightHeader = “” .LeftFooter = “” .CenterFooter = “” .RightFooter = “” End With End Sub
Sub ChangeHeader() With ActiveSheet.PageSetup .LeftHeader = “” .CenterHeader = "" .RightHeader = “” .LeftFooter = “” .CenterFooter = “” .RightFooter = “” End With End Sub
Az idézőjelek közé kell betenni a kiirandó tartalmat. Arra tuti van valami függvény, hogy az autoszűrt sorok számát kiszámold, csak én nem tudom. Szóval ha jár erre valaki, aki tudja a megfelelő kódot erre az egy adatra, akkor azt a kódot kell betenni a megfelelő idézőjelek közé.
Delila, aki feketeöves a change események kódolásában, lehet még azt is meg tudja csinálni, hogy az autószűrő alkalmazásakor automatikusan lefussan a megfelelő kód.
A lapvédelem jelszót beleírtam a levélbe, nyugodtan kotorássz a táblázatba :-)
De rájöttem még valamire:
2 oprendszer van a gépemen, az egyiken O2003, a másikon O2007.
A hiba csak a 2003-as office-on jön elő! A 2007-esben tökéletesen működik. A munkahelyünkön természetesen 2003 van. Így gondolom neked is 2007-ed van.
Tehát a probléma összefoglalva (hátha vannak új betérők :-)):
Adott egy fkeres függvény, ami időpontokat keres kb. 200 sorban. Az időpontok formátuma teljesen mindegy, mert próbáltam sima időponttal és számmá alakítottal is. Az időpontok egyformák, mert saját másolatuk. Minden időponttal remekül megy minden, de a 05:42-t nem találja. Hangsúlyozom minden más időpontot megtalálja, és bármelyik sorba írom a 05:42-t, AZT nem találja csak. Ráadásul, hogy hab is legyen a tortán, a problémát csak 2003-as Office alatt produkálja, 2007-es alatt minden szép és jó.
Erre varrjon valaki gombot...lepke ment a gépezetbe?
Figy. Ha az U58-ból átmásolom értékként beillesztve az X58-ba a számot, akkor megtalálja az fkeres.
Ha a két értéket megvizsgálom = jellel a cellában, akkor IGAZ-at ad.
Továbbá, ha az U58 képletét argumentumonként F9-el értékké alakítgatom, akkor is megtalálja az fkeres az Z58-ban
Ez bug gyanús nekem, még nem láttam ilyet. Vagy pedig valami a S58-ban lévő 05:42-vel nem stimmel. (Amit kétlek) Lehetséges, hogy hibásan számolja értékké az időadatot...
Sok mindent nem tudtam mgenézni a lapvédelem miatt, de ettől függetlenül ez szerintem bug lehet.
1. Egy használaton kívüli üres cellába írd be azt, hogy 1 majd enter 2. Állj erre a cellára (ahol az 1-es van), majd másolás (Ctrl+c) 3. Jelöld ki az U oszlopban a kérdéses értékeket tartalmazó cellákat, majd szerkesztés -> Irányított beillesztés -> Szorzás
4. A 2. ill. 3. pontokat csináld meg ismét, csak most az X oszlop kérdéses értékeit jelöld ki.
A két szám teljesen egyforma! Mivel önmaga másolata!
Egyszerűen érthetetlen... Üres táblázatban minden oké, de amiben használom, abban a 05:42 időpontot nem találja. Minden más időpont jó, csak ez nem. Találkoztatok már valami ilyesmivel?
Egy mások számára gondolom pofon egyszerű kérdésem lenne.
UserForm_Initialize eljárásban töltök fel egy ListBox objektumot.
Hogyan kell megoldanom, hogy a feltöltés alatt ne fusson le a ListBox_Change esemény. Az Application.EnableEvents ezt nem kezeli, pedig erre gondoltam.
"...számolja ki percben (ezért is kell sorba rendezni), majd a kijövő perc értéket kellene fkeressel melléírni. ..."
Amit robbantómester is emlegetett: Konvertáld az eredményt megfelelő formátummal egyforma hosszú stringgé, és így az esetleges láthatatlan számjegyek már nem fognak bezavarni..
A két időpont teljesen egyező. Erre rákerestem egy ha függvénnyel is. Már csak azért is egyező, mert az elsőből hozom létre a mellékelt képen mutatom is:
Ezek mind rejtett oszlopok. Az "U" oszlopban lévő adatokat, makró segítségével másolom át és rendezem sorba (egy gomb segítségével), az "X" oszlopban. Az Y oszlopban a sorba rendezett számok közötti különbséget számolja ki percben (ezért is kell sorba rendezni), majd a kijövő perc értéket kellene fkeressel melléírni. Ezeket az értékeket fogja majd visszamásolni egy másik függvénnyel. A kitöltés jellegéből lehet, hogy adott cellák üresen maradnak, ezért is kell ilyen bonyolultan megoldani a különbség számítást. A "V" és "W" oszlopok ügyünk szempontjából irrelevánsok.
Külön munkafüzeten kipróbáltam és az 5:42 időpont és az fkeres nem volt haragban egymással. De itten igen, már hullik a hajam. Ha 5:41-et, vagy 5:43-at írok, akkor tökéletes.
Az az 5:42 biztos, hogy annyi - tehát 5:42:00? Vagy esetleg 5:42:00,18? A századmásodpercet az időformátumban nem biztos hogy látod, viszont értékké alakítva már látsz eltérést.
Ha az utolsó argumentumoz kihagyod, akkot azt "IGAZ" értéknek veszi - tehát a legközelebbi egyezést adja vissza. Ebben az esetben a [TÁBLA] tartománynak sorba rendezettnek kell lennie.
Egy (makróval) teljesen sorba rendezett oszlopban keresek. Az utolsó logikai érték, melyet igaz vagy hamisra teszünk, én hamisra állítottam be.
=FKERES(U58;$X$54:$Y$198;2;HAMIS)
Amire keresünk, azok időpontok számmá alakítva 9 számjegyig. Jó pár hónapja használtuk már, és most a 05:42 időpontnál (számmá alakítva 0,237500000) jelzett "hiányzik" hibát.
Kipróbáltam, hogy az utolsó "hamis" logikai értéket kitöröltem, és úgy megtalálta. Szerintetek ez mitől lehet?
Az a helyzet, hogy a hamis beállítás kell, mert pontos keresési értékre van szükség.
Valaki találkozott már az alábbi hibaüzenettel? Érdekelne mit jelent pontosan. "A célhelyként megadott rendszer nem rendelkezik elegendő memóriával a személyes adatok fájltulajdonságokból történő eltávolításához. A program nem tudja az összes ilyen információt eltávolítani." Előre is köszönöm a segítséget!
Legközelebb kipróbálom. Magyarul: Adatok/Külső adatok importálása/Új WEB lekérdezés.... Kösz... :-)) Habár ez valószínűleg sok (nekem érdektelen) képet, gombot is leszed...
Makroval igen. Áprilisban filóztunk is itt róla, hogy miért lassul le ciklusban, és valaki segített is. Egy-egy oldalnál nem kerestem komolyabb megoldást.
Utóbbi hetekben sokszor kellett internetről (HTML-ből) táblázatot másolni EXCEL-be, de a sima copy-paste egy mezőbe tette az egész hóbelevancot.. Ilyenkor általában bevált, hogy először sima jegyzettömbbe másoltam be a táblázat adatait és utána egy második copy-paste-tel a jegyzettömbből EXCEL-be.
(PDF esetében még nem próbáltam, ott általában a sima szövegmásolás is nehézségeket okoz)
Hogy ez a funkció hol van 2002-es excelben arról fogalmam sincs, de valahol az Option-ök között kell keresni.
Az én 2007-es excelem option-jében ez úgy szerepel, hogy: 'Automatically insert a decimal point after:' és itt lehet kiválasztani, hogy hanyadik karakter után. Alapból ez egy kettes, szóval nézz körül az Option-ök között és keress egy olyan beállítást, ahol szerepel egy kettes. Kattintsd ki ezt az opciót és elmúlik szenvedésed.
Ja, még annyit hozzá, hogy ha megnyitok egy teljesen szűz új munkafüzetet, már ott is elosztja 100-zal, akármilyen számot írok be, tehát vmi excel-beállítási probléma lehet. (2 gépem van, egyik céges másik magán, ez utóbbit ritkábban használom, és ezen van ez a problémás magyar nyelvű excel).
Sziasztok. Valaki segítsen légyszi, mert kezdek bedilizni. Elég gyakran használok Excelt, de ilyet még az életemben nem láttam. Egy adott oszlop egymás alatti celláiban különböző értékek (kilométerek) szerepelnek. A táblát kb egy éve készítettem, és azóta volt már megnyitva angol és magyar Excellel is, 2002-es Excel mind a kettő.
Az egyik cella értékét most megpróbáltam átírni 300-ról 231-re, és az Excel automatikusan átjavította 2.31-re. Már mindent végigpróbálgattam. Akármilyen cellaformázást, számformátumot, automatikus javítási beállításokat próbálok, sehogy sem jó. Beírok egy számot, és automatikusan elosztja 100-zal.
Meg tudjátok mondani, hogyan lehet megoldani, hogy ezt ne csinálja?
Az office programcsomaghoz hozzátartozik egy Digital Certificate for VBA projects nevű progi.
azzal készítsetek digitális certifitate-et a makrókhoz amiket biztonságosnak tartotok és az Excel Trust Center Settings-ében állítsátok be, hogy a digitálisan aláírt makrók futhatnak, más makrók nem.
Szeretném megkérdezni, hogy vállalati környezetben hogy kell beállítani, hogy csak az általam vagy más kolléga által írt biztonságos makrós fájlokat futtathassák a felhasználó Excel 2007 alatt. Excel 2003-nál megnyitáskor rákérdezett a makrókra, 2007-nél viszont csak akkor fut, ha a beállításoknál minden makrót engedélyezek (a többi mind tiltás), de hát ez nem egy biztonságos módszer.
If Range("X38") > 0 Then MsgBox "Az első érkezésnél NEGATÍV részmenetidő érték keletkezett! A piros színnel jelölt részmenetidőhöz tartozó időpont(ok) nem megfelelőek!", vbCritical, "HIBÁS IDŐPONT!"
If Range("Y38") > 0 Then MsgBox "Az első érkezésnél NEGATÍV menetidő érték keletkezett! A piros színnel jelölt menetidőhöz tartozó időpont(ok) nem megfelelőek!", vbCritical, "HIBÁS IDŐPONT!"
A fenti szövegek egy-egy sorban vannak. Azt szeretném, ha a 2. mondat ("A piros színnel" kezdődő mondat) egy újabb msgbox-ban jelenne meg (miután az előzőt leokéztam). - Ha egy sorba írom, külön msgbox-ként, akkor hibát jelez - Ha simán alá írom, akkor bár megjelenik, de a hibás cella törlésekor újra feladja a 2. msgbox-ot.
Private Sub Worksheet_Change(ByVal Target As Range) If Cells(4,3) > 0 then Msgbox ("A C5:C15 tartomány legalább egy cellája mínuszba került") If Cells(5,3) > 0 then Msgbox ("A D5:D15 tartomány legalább egy cellája mínuszba került")
End sub
Ha nincs Else ág, a feltétellel egy sorba írva a Then ágat nincs szükség End If-re.
Abba még tudnátok segíteni, hogy az msgbox szövege dinamikus legyen?
Tehát, ne a tartomány nevét írja ki (ahol a hiba), hanem, ha a J46-ban van szöveg, akkor azt. Ha azonban a J46 üres, akkor a J47-ben lévő (egyébként) fix szöveget.
Igen, a tartományokat mindenképpen külön akartam vizsgálni.
Bár tovább gondolva az előjel függvényre sincsen szükség.
a C4-be ezt írom =DARABTELI(C5:C15;"<0")
a makró meg így nézne ki
Private Sub Worksheet_Change(ByVal Target As Range) If Cells(4,3) > 0 then Msgbox ("A C5:C15 tartomány legalább egy cellája mínuszba került") End if End sub
Köszönöm Nektek a segítséget, az együttgondolkodást :-)
És mi a véleményetek arról, ha (rejtett oszlopban) az előjel függvénnyel vizsgálom a tartomány összes celláját, majd az egészből nézek egy darabtelit. Ha ennek eredménye 1, tehát van legalább egy negatív szám a vizsgált tartományban, akkor kiabálni kellene. Így a makrónak egy cellát (a darabteli eredményét) kellene vizsgálni?
Jimmy, én mindkét makrót kipróbáltam, de nem akarja az igazságot.
Próbaként egy egyszerű C5=D5-E5 függvényt tettem bele, aztán a D és E cellákba írtam olyan számokat, amik hatására a C-ben negatív szám jött ki, de semmit nem kiabált. Feltételezem a makróban lévő f8:f300 tartomány csak a lehetséges másik tartományt jelöli?
Szerintem erre a lassú de biztos (favágós) módszer az lenne, ha a vizsgált tartomány minden celláját ellenőriznénk negatív értékre:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Rng1 As Range, c As Range With ThisWorkbook.Sheets("Munka1") Set Rng1 = Union(.Range("C5:C15"), .Range("F8:F300")) For Each c In Rng1 If c < 0 Then MsgBox "A bevitt adat nem megfelelő, mert a Munka1 lap " & c.Address & " cellája mínuszba került. " Exit Sub End If Next End With End Sub
Ha több munkalapon kell tartományokat figyelni, akkor lehet Rng2, Rng3, stb tartományokat definiálni, és mindre külön ciklus, ami végignézi őket.
Valamivel gyorsabb, és szerintem jó módszer, ha csak a vizsgált tartomány minimumát ellenőrzöm. Ha a C5:C15 számok bármelyike negatív, akkor ugyanezen számok legkisebbike is negatív. Tehát:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Rng1 As Range With ThisWorkbook.Sheets("Munka1") Set Rng1 = Union(.Range("C5:C15"), .Range("F8:F300")) If Application.WorksheetFunction.Min(Rng1) < 0 Then MsgBox "A bevitt adat nem megfelelő, mert a Munka1!" & Rng1.Address(False, False) & _ " tartomány legalább egy cellája mínuszba került. " End If End With End Sub
Redlac eredetileg a C5:C15 tartományt akarta figyeltetni, később azt írta, hogy más helyekre is kiterjesztené. A makróddal 1 cellát lehet ellenőrizni, és nem látom, hogy lehetne ezt egy tartományra kiterjeszteni. Te biztosan tudod.
A cél végülis az, hogy az adatokat csak egyszer, egy helyre vigyük fel, és ne pedig tíz különböző táblába(adatbázis), a 10 kül. tábla mégis létezzen. Akik azt nézegetik nem kell tudniuk honnan van.:-)
Viszont ez a módszer minden és bármilyen cellamódosulásnál pampogni fog, akár van hatása C5-re, akár nincs, mindaddig, amíg a negatív értéket eredményező beírást nem módosítjuk...
Szerintem működne ez akkor, ha elhagynád a Target helyének vizsgálatát. Végül is tök mindegy, hogy melyik cellába írt be új adatot, ha attól megváltozik a figyelt cellákban a képlet értéke. A képlet értéke pedig általában akkor módosul, ha valahová új adatot írnak, tehát a változást el lehet csípni a Worksheet_Change eseménnyel.
Ha általánosabban akarjuk, akkor egyszerre figyelhetjük az összes munkalap változását:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If ThisWorkbook.Sheets("Munka1").Range("C5") < 0 Then MsgBox "A bevitt adat nem megfelelő, mert a Munka1 lap C5 cellája mínuszba került. " End Sub
Ezt már csak úgy lehet átverni, ha külső munkafüzetből, csatolással jön az adat, amiből C5 értéke származik.
Nem működne. Ha egy feltételes formázással színezett cella színét, vagy színkódját lekérdezed, az eredeti színt, kódot kapod.
Azt lehetne megcsinálni, hogy ha pl. a C5 képlete =E5-D5, akkor azt a cellát kellene vizsgáltatnod, amelyiket utóbb viszel be. Ha ez az E5, akkor If target.value-cells(target.row,4)<0 then msgbox ...
Az első két sor helyfoglalás az oszlop és a sor változónak, majd értékadás ezeknek. A sor legyen a változott cella sora, az oszlop pedig a változott cella oszlopa.
és akkor szerinted működne, ha feltételes formázással piros színnel jelölném, ha negatív szám jön ki a függvény eredményénél. Aztán a tartományban lévő piros szám megjelenését vizsgálom (ami ugye negatív számot jelent).
A 11292-es hsz. sajnos nem jó, mert a függvénnyel létrejött értékeket a target nem figyeli, csak ha másolod a függvényt tartalmazó cellát a C5:C15 tartományba. :(
Sajnos nem jött össze. A makród felsorolta a Fájl menü (nem eszköztár!) menüpontjait. Biztonság kedvéért, hogy jobban lássam, beírattam a neveket egy oszlopba. Még az utoljára megnyitott füzeteim nevét is megadta.
Megnéztem a linkeket. Végül arra a következtetésre jutottam, hogy az a bővítmény (?) hiányzik, vagy hibásodott meg nálam, ami a levélben küldést csatolással hajtaná végre. Próbálkoztam már az Office újabb telepítésével, hibajavításával, de nem akar sikerülni.
Azt szeretném elérni, hogy ha egy cellában lévő szám negatív lesz (függvény eredményeképpen), akkor egy üzenetpanel ugorjon ki, hogy azt nem lehet, tehát valamit elrontott.
Ezt próbáltam, de kutyafüle:
Private Sub h()
If Target.Range = "c5:c15" And Target.Value < 0 Then MsgBox ("Ez a cella negatív számot nem tartalmazhat")
End If End Sub
Valaki megtudná mondani, hogy miért? Azok a válaszok, hogy "csak", "me' buta vagy" nem érnek :-)
1) Lehet Excellel adatbázis lekérdezést csinálni. Adatok -> Külső adatok importálása -> Új adatbázis-lekérdezés Ez elsősorban úgy használatos, hogy az egyik munkafüzetet adatbázisban használod, és a másikban hozod létre a lekérdezést. Lehet úgy is, hogy ugyanazon munkafüzet egyik lapját használod adatbázisnak, és a másikon van a lekérdezés, de ennek megbízhatóságáról nem vagyok meggyőződve. Mindenesetre Microsoft Query kell hozzá, ami az MS Office része, de alapértelmezésben nem települ fel.
Adatok szűrése megvalósítható az irányított szűrővel is, kvázi lekérdezés-szerűen. Úgy emlékszem, hogy menüből használva csak ugyanarra a lapra teheted a szűrési eredményt, de makróval akárhová.
Azt is el tudom képzelni, hogy a pivottábla lesz a te barátod, de a problémafelvetésből ez nem derül ki.
Végül, de nem utolsósorban makróval akármilyen adatszűrést, adatbázis-lekérdezést meg lehet csinálni, akármilyen Excel, Access, ODBC, stb. adatforrásból.
2) Access adatbázis létrehozása is lehetséges Excel makróval, de sztem ezt a lovat fordítva kell megülni. Először létrehozni az Access DB-t, megfelelő táblákkal, mezőkkel, majd abba importálni az adatokat Excel munkafüzetből. Access-ben a Fájl -> Külső adatok átvétele -> Importálás útvonalon éred el ezt a funkciót.
Tudok-e excel táblából(mintha csak adatbázis lenne, lekérdezést csinálni? Valójában az excel szűkítési funkciójához hasonlóra gondolok, mondjuk egy másik táblában, vagy csak egy másik lapon. Hogyan? Röviden, ezeknek nézz utána a Súgóban, vagy az Interneten:
1. Excel cél - Excel forrás esetén legegyszerűbb az Excel Irányított Szűrő funkciója, kicsivel bonyolultabb az Microsoft Query-vel
2. más program - Excel forrás esetén az Excel ODBC driverrel SQL utasításokkal is hozzáférhetsz az Excel forráshoz. Természetesen, nagyon sok adatbázisoknál megszokott dolog nem fog működni az Excel természetéből következően.
Más. Tudok-e excel táblából acess adatbázist létrehozni, úgy hogy az adatokat átviszem egy mozdulattal. Hogyan?
Igen, nagyon egyszerűen. Régebbi Access-ben a Fájl menüben volt az Export/Import funkció (ha jól emlékszem). Access 2007-ben a Külső Adatok fülön találod meg a funkciót.
Egy újratelepítés óta a 'Küldés levélben (mellékletként)' nevű ikonom le van tiltva. Azt tudom, hogy az Application.CommandBars("Formatting").Controls(5).Visible = True sorral meg tudom jeleníteni a formátum eszköztár 5. ikonját, de nem tudom, hogy tudnám működésre bírni a fent említettet.
Alapból a 'Szokásos' eszköztáron van, de kitenni a Fájl kategóriából tudnám – ha nem lenne ott.
Honnan lehet tudni, hogy egy ikon hányadik egy eszköztáron? A megszámlálás nem jó, mert nem az eredeti sorrendben vannak nálam. Visszaállítani sem szeretném azt a sorrendet, mert egy halom saját ikont alkalmazok, saját rajzzal.
Az első problémád DARABTELI-s megoldását is át lehet alakítani SUMPRODUCT-osra, ha érdekel ez a technika szólj és segítek. Nagyon hasznos ott, ahol több feltételt kell kiértékelni és megszámolni v. összesíteni (pld. hány szabadnapja van összesen azoknak akik az informatikán dolgoznak és 2009.010.01 után lettek felvéve).
A duplanegatív egy boolean eredményt (igaz v. hamis) alakít át számmá, vagyis logikai műveletek IGAZ eredményét 1-gyé, hamis eredményét 0-vá alakítja.
Szóval a függvény azt csinálja, hogy kiértékeli minden releváns cella esetében, hogy az eredménye megegyezik-e a G2 értékével (tagja-e a lekérdezett osztálynak) (eredmény: IGEN v. NEM átalakítva 0-vá vagy 1-gyé), megnézi, hogy van-e szabadnapja az adott személynek (eredmény IGEN v. NEM, konvertálva nullává v. eggyé) és ezeket összeszorozza majd felösszesíti.
Csak ahol mindkét feltétel teljesül lesz a szorzat eredménye 1, ezeket az 1-eket összeadja, ami esetünkben a mindkét feltételnek megfelelő emberek száma.
Igen magyarul SZORZATÖSSZEG a függvény neve, és a vessző helyett pontosvessző kellett.
Le tudnád esetleg írni, hogy a -- jellel milyen művelet hajtódik végre, hogy meg is értsem amit leírtál. Magát a SZORZATÖSSZEG működését értem, csak erre a kapcsolóra lennék kíváncsi.
Függvénnyel akarod megcsinálni, vagy fizikailag új tábla is megfelel?
Egyébként egyedi karaktersorozatot simán létre tudsz hozni az & jellel.
Pld a H2 cellába azt írod: =A2&"-"&B2"-"&C2 és így tovább. Utána a H oszlop adatára tudsz csinálni egy COUNTIF-et, és hol a COUNTIF eredménye nem 1, ott vannak az ismétlődések. Ha sok időd van, akkor a FREQUENCY függvénnyel is játszadozgathatsz egy kicsit.
Olyan gyorsan válaszhoz akartam jutni, hogy nem írtam le rendesen :) szóval: - az oszlopok száma fix, a soroké nem - nemcsak egyjegyű számok szerepelnek Éppen ez a bajom, hogy nem bírok egyedi karaktersorozatot létrehozni, ami alapján könnyebb lenne szűrni az azonosokat.
1. Mit értesz "listázáson"? 2. A táblázat métere fix, vagy a sorok és oszlopok száma is lehet több? 3. Minden cellában csak egyjegyű szám van? Én egy segédoszlopban csinálnék egy ötjegyű számot, az alapján sorba rendezném, és akkor már csak a szomszédos sorokat kell vizsgálni....
Persze, a HA függvényt tedd be egy másik HA függvénybe, valahogy így =HA(VAGY(a1="",b1="",[es_igy_tovabb]),"",HA([ami eredetileg a HA függvényedben van]))
Sziasztok! biztos banális probléma, de nem bírok vele egyedül.. HA függvényben olyan cellák vannak, amik még üresek, később kell vele számolnia; azt szeretném, hogy amíg nem kerül érték a cellába, a függvény ne számoljon vele. lehetséges ez? nagyon köszi!
Feltételezve, hogy: - az osztályok leírása a B oszlopban van (mondjuk B2:B100) - a szabadnapok száma a D oszlopban van (mondjuk D2:D100) - a szabadnap hiányát vagy 0 vagy üres cella jelzi a D oszlop megfelelő mezőjében; - a "kigyűjtendő" osztály neve a G oszlopban van, mondjuk G2:G10
F2-be írd be a következő képletet: =SUMPRODUCT(--($B$2:$B$100=G2),--($D$2:$D$100<>0))
Ezt másold le az F oszlop többi releváns cellájába is a G oszlop tartalmának megfelelően.
(SUMPRODUCT a magyar excelben aszt hiszem SZORZATÖSSZEG v. SZORZATOSSZEG), lehet a te verziódban a vesszők helyett pontosvesszőt kell használni.
Az eredmény megadja, hogy az adott osztály hány alkalmazottja rendelkezik nullától különböző számú nap szabadsággal.
Egy kis segítségre lenne szükségem egy excel táblázattal kapcsolatban.
Röviden leírom a problémát:
Egy függvényre (vagyis szerintem egymásba ágyazott függvényre) lenne szükségem, amellyel a következőt kellene megoldani:
A táblázat tartalma:
Osztály: Belépés dátuma: Szabadnapok száma:
Informatika 2009.01.01 20
Pénzügy 2009.01.02
Marketing 2009.01.03 15
Pénzügy 2009.01.04
Pénzügy 2009.01.05
Marketing 2009.01.06
Informatika 2009.01.07 30
Ez a táblázat a különböző osztályokon dolgozó emberek szabadságát hivatott nyilvántartani (a név oszlopot nem írtam most le).
2 feladatot kell megoldani, az első hogy hányan dolgoznak az egyes osztályokon: ezt egy DARABHATÖBB fügvénnyel simán megoldottam egy külön táblázatba.
A 2. bonyolultabb, arról lenne szó, hogy ezek mellé a számok mellé oda kellene írni, hogy az egyes osztályokon az ott dolgozók számából mennyinek van szabadsága!
FKERES fügyvénnyel próbálkoztam, de az csak a szabadságok oszlopában értéket ad vissza ugye, nekem pedig darabszámra lenne szükségem.
Darab függvénnyel pedig nem tudok olyan feltételt adni, hogy csak az informatikán dolgozók szabadságait adja össze (ja, és ugye nem a szabadnapok számának összege kell, hanem hogy hány embernek van szabadnapja!).
Szóval szerintem valahogy a kettőt kellene egymásba ágyazni, de akárhogy kísérletezek, nem sikerül.
Minden ötletet szívesen vennék!
Köszönöm!
U.i.: Csak függvényes megoldás lenne jó, tudom, hogy szűréssel egyszerűen meg lehetne oldani, de automatizálni szeretnénk a táblázatot függvények segítségével.
Sziasztok, lenne egy kérdésem: mely függvényeket kell használni, ha mondjuk meg szeretném kapni A1 és B1 szorzatát szorozva egyel; A2 és B2 szorzatát szorozva kettővel; A3 és B3 szorzatát szorozva hárommal stb? Előre is köszi!
- ha a gólok különbségének szorzata pozitív, akkor a fogadó eltalálta, hogy ki győzött - ha a fenti nem igaz, akkor a gólok különbségének összege nulla, akkor a fogadó eltalálta, hogy döntetlen.
A lenti példán: - (2-1)*(4-1)=1*3 = pozitiv, vagyis a fogadó eltalálta, hogy ki nyert. - (2-2)+(3-3)=0, vagyis a fogadó eltalálta, hogy döntetlen.
DARAB, DARAB2, DARABTELI, DARABÜRES függvények jöhetnek szóba, vagy akár: =HA(A1="";"nem tippelt";...az előző képlet beírva....) nyugodtan beírhatod a 0-k és 1-k közé, a SZUM függvényt nem zavarja meg: Egy oszlop tartalma: (A1:A9) 0 1 3 1 0 nem tippelt 1 nem tippelt 6 ---- Ez pedig az előző 8 érték összege =SZUM(A1:A8)
Még egy kérdés: Arra van függvény, hogy egyáltalán csak akkor csak számoljon, ha a cella kitöltött? Konkrétan: amíg nincs végeredmény (a cellák üresek), ne kapjon pontot az, aki 1-1-et tippelt.
Ha A1 cella=2, B1 cella=1 (ez a pontos végeredmény), a tipp pedig legyen F1=4, G1=1, akkor először A1 és B1 alapján kell az 1 x 2-t meghatározni. Ezt hogyan? Ha ez megvan, jöhet az, amit írtál: HA(VAGY(ÉS(tipp="1";F1>G1);ÉS(tipp="X";F1=G1);ÉS(tipp="2";F1<G1));1;0) Kösz most is, de az előző válaszért is! cm
Sziasztok! Tudtok-e excel-függvényt mondani arra az esetre, ha egy foci végeredmény 1 x 2-jét szeretném az adott tippel összehasonlítani, és kiszámítsuk, hogy kap-e pontot a tippelő. Tehát mondjuk a helyes végeredmény 2-1, a tippelő 5-2-t mondott, ez alapján kap 1 pontot, de ha 2-2-t tippelt volna, az 0-t ér. Kösz, cm
Köszönöm, szerintem hagyjuk. Készítettem szövegdobozból nyomógombot, ezzel is el tudom érni azt, hogy változtathatom a nyomógomb szövegét és együtt mozog a diagrammal.
Szuper! Akkor már csak azt mondd meg, hogy a kijött számból hogy tudok cellahivatkozást csinálni. Tehát ha a 26-os sorban van az utolsó szám, hogy lesz ebből a 26-os értékből C26?
Tudna valaki segíteni? Nem vagyok valami nagy pro Excelben, és az alábbi problémára keresem a választ: Van egy cellatartomány, pl. C1:C100. Ezekbe számok fognak kerülni manuális bevitellel, felülről lefelé. Hogyan tudom lekérdezni azt, hogy melyik az a legutolsó cella, amelyikben még van szám (anélkül, hogy mind a 100 db-ot lekérdezném az IF függvénnyel)? Egyébként OpenOffice Calc-ot használok, ezért angol függvénynévre lenne szükségem. Előre is köszönöm.
Nagyon köszi !!! Ez Ctrl + Tab működik.
A Formátum / Bekezdés beállításai -ban még nem merültem el, de az mintha nem lenne jó erre. Majd megnézem tüzetesebben is!
Valami nem gömbölű itten. Itt azt olvastam, hogy xl2007-ben lehet ugyan űrlapgombot diagramba ágyazni, de csak önálló diagramlap esetében. Szóval úgy, hogy maga a diagram is munkalapba van ágyazva, úgy nem. De nekem meg működik otthon beágyazott diagrammal is....
Egy dolgot tudok elképzelni: nekem otthon olyan 2007-esem van, ami "Frissítés" verzió. Ez azt jelenti, hogy önmagában nem telepíthető, csak korábbi verzióra rá, és telepítéskor azt módosítja/cseréli/írja felül. Gondolom, a telepítő megtartotta a 2003-ból azt a részt, ami ezért a viselkedésért felelős. Vagy nem tudom.
Ha lesz egy kis időm, felteszem a kérdést egy másik fórumon, hátha valaki tudja.
Most el vagyok bizonytalanodva, mert a 2007-en űrlap-vezérlőt használtam (Fejlesztőeszközök -> Beszúrás -> Űrlap-vezérlőelemek) és képként jelent meg a másolás után...
Én megnézném azt is, hogy a beszúrt képek mögött nincs-e 50 másik. Pl. ctrl+g - irányított, objektumok bejelöl, enter. Majd TAB-al végignyomkodni. Vagy kijelölsz egy db képet v. valamit és nyomkodod és megnézed hogy TAB-al mire ugrik.
Megnézném, hogy vannak e rejtett lapok a munkafüzetben. Ha nem te hoztad létre a munkafüzetet megnézném alt+f11-re feljövő fejlesztői környezetben vannak a kódok.
Meg elkezdenék vírust is irtani a gépen.
Megpróbálnám azt is, hogy egy teljesen üres munkafüzetbe beszúrnám ugyanazokat a képeket (ojjektumokat) és megnézném a file arányos méretét a képekhez képest.
Ha az egyezik, akkor a te excel fileoddal van valami gáz v valamit rosszul csinálsz a beszúrásnál. Talán.
Leteszteltem 2007-ben, ugyanúgy működik, mint 2003-ban. Imétlem, nem mindegy, hogy Űrlap-vezérlőelemet, vagy ActiveX vezérlőt használsz. Csak az űrlapos jó.
Kipróbáltam én is 2003-on és úgy működik, ahogy ezt leírtad. Pont ez kellene nekem, de úgy látszik, a 2007-es ezt nem tudja.... Kíváncsi leszek, hogy a 2003-on "összeragasztott" diagramon nyomógomb működik-e a 2007-en?
Önmagában a file-ok csatolása nem növelné a méretet aránytalanul. Azonban az excel csak azoknak a celláknak az adatait menti el, amelyek ténylegesen használva vannak. Tehát egy 10x10-es táblázat esetén a mondjuk 100 cella címét és tartalmát (még akkor is, ha nincs tartalma, ezt az információt is le kell menteni).
Ha valamilyen probléma miatt az ún. usedrange "felpumpálódik" akkor az excel sheet-en lévő összes cella (kb 64000 x kb 250 = 16 millió) címét és tartalmát elmenti a file-ba.
Ez okozhat drasztikus fileméret növekedést (100 elmentett cella vs 16 millió elmentett cella).
Ha most, az üres oszlopok és sorok törlése után Ctrl+lefele nyílt nyomsz, akkor hova jutsz? Hány darab sheet-et használsz a workbook-on belül?
Azaz talán mégsem. Gombot kétféleképpen lehet hozzáadni. Az egyik az Űrlap eszköztárból, a másik a Vezérlők eszköztárból. Az űrlapos gomb gomb marad, ha átrakod diagramra. A vezérlős gombból pedig kép lesz.
Akkor ez is valami verziófüggő izé lehet. Bocs, nem akartalak félrevezetni. Itt most nem tudom megtenni, de később, otthon ránézek a problémára 2007-es szemmel is.
Lehet, hogy valamit rosszul csináltam, de a Ctrl-x -> Diagram kijelölés -> Ctrl-v után a vezérlőelemből kép lesz (Jobb gomb a művelet előtt: vezérlőelem formázási lehetőség; jobb gomb utána: kép formázási lehetőség). A makrót ehhez is hozzá lehet rendelni, de ez sajna - a már említett miatt - nem jó.
Hogy érted azt, hogy a nyomógombról készített képpel? Ez a kivágás beillesztés művelet nem a gomb képét rakja rá a diagramra, hanem a gombot magát. Hozzá tudom rendelni a makrót, és ha rákattintok, le is fut. Teszteltem. (Igaz, xl2003-ban.)
A problémát xl2007-ben kell megoldani, sajnos, az első javaslatod nem jó, mert nyomógomb feliratát változtatom minden lenyomáskor (napi adat, havi adat) és a nyomógombról készített képpel ezt nem lehet megtenni.
"Az Űrlapok eszköztár gombjával az is megy, ha a diagram van kiválasztva (Selected), és úgy rajzolod rá a gombot."
Ez sajnos nem működik, nem mozog együtt a diagrammal. :-(
0) a gombról leveszed a makróhozzárendelést 1) Kijelölöd a gombot 2) Ctlr+x (kivágás) 3) Kijelölöd a diagramot 4) Ctrl+v (beillesztés) -> a gomb a diagram bal felső sarkába kerül 5) áthelyezed és formázod a gombot tetszés szerint 6) újra hozzárendeled a makrót
Az Űrlapok eszköztár gombjával az is megy, ha a diagram van kiválasztva (Selected), és úgy rajzolod rá a gombot.
Egy diagramon egy nyomógombbal (űrlap-vezérlő) váltok adatértékeket. A nyomógomb a diagram területen van. Azt szeretném valahogy elérni, hogy a nyomógomb együtt „mozogjon” a diagrammal, vagyis, ha a diagramot elmozdítom (áthelyezem) a nyomógomb maradjon a diagram területen, mozogjon együtt a diagrammal. Tudna valaki segíteni?
Egy diagramon egy nyomógombbal (űrlap-vezérlő) váltok adatértékeket. A nyomógomb a diagram területen van. Az szeretném valahogy elérni, hogy a nyomógomb együtt „mozogjon” a diagrammal, vagyis, ha a diagramot elmozdítom (áthelyezem) a nyomógomb maradjon a diagram területen, mozog együtt a diagrammal. Tudna valaki segíteni?
Na akkor itt a te problémád. Ugyanis a legalsó, tartalommal rendelkező sorba illetve a legjobb :_) tartalommal rendelkező oszlopba kellene jussál.
Teendőd: - keresd meg a legalsó, első teljesen üres sort - jelöld ki a teljes sort - Ctrl+Shift+lefele nyíl - Töröld a kijelölt sorokat (NEM Clear, hanem Delete)
Ugyanaz a jobboldallal.
Mentés, file becsuk, újra kinyit. Ettől le kéne csökkenjen a file mérete.
Van valahol ebben te tábládban egy sorszám-szerű (vagyis növekvő v. csökkenő) adat? Jellemzően az A oszlopban szoktak ilyenek lenni, nem kell, hogy egyesével csökkenjenek v. növekedjenek (pld számlaszámok, stb.).
Mert ha igen, akkor valszeg meg lehet csinálni függvénnyel is az üres-elemek nélküli listát is.
Ha van, jelezz vissza és megpróbálunk összeütni valamit.
Autoszűrővel oldanám meg, de inkább egy másik munkalapon, hogy a szűrő ne zavarjon be. Tehát a másik munkala egyik oszloába kezded beilleszteni az =Munka1!A1, =Munka1!A2 stb, képleteket tízig; ahol üres, ott alapban nulla jelenik meg. Az első sor kijelölésével adatok!szűrő!autoszűrő, a nyíl kinyitásával egyéni és nagyobb, mint "" (üres idézőjelpár).
A következő problémában szeretném kérni a segítségeteket:
Van egy oszlop az excel táblázatban, ami mondjuk 10 cellából áll. a Cellákban vagy van valamilyen érték (szám vagy betű) vagy nincs. Egy másik területén a munkalapnak szeretnék ez alapján létrehozni egy olyan oszlopot, amiben a sorrendje marad az értékeknek, de kihagyva az üres cellákat. A sima másolás az üresek kivételével nem jó megoldás, valami "képletes" kéne, mert az oszlopban mindig változik, hogy hol van üres, hol nincs. (Pl.: egy előadás alkalmain megjelenteket beírom, és a vágán egy összegző listát ad, de már csak a megjelentekről, automatikusan.) Remélem sikerült elóadnom a problémámat érthetően. :)
"Ha egy word dokumentumba táblázatot szúrok be, akkor a táblázaton belül (cellán belül) nem sikerült működésre bírni a tabulátorokat. Ez így normális, vagy én nem találtam, hogy hogy lehet beállítani?"
Cellán belül a Ctrl+TAB billenytűkkel lehet működésre bírni.
Az alábbi problémát szeretném megoldani. Van több oszlopom egymás után. Azt szeretném megszámolni, hogy hány olyan eset van, amikor az egyik oszlopomban 1-es van, akkor az utána következő oszlopban 2-es. Van erre valamilyen függvényetek?
Ha egy word dokumentumba táblázatot szúrok be, akkor a táblázaton belül (cellán belül) nem sikerült működésre bírni a tabulátorokat. Ez így normális, vagy én nem találtam, hogy hogy lehet beállítani?
Ha valóban nem működik, akkor hogy lehet azt elérni, hogy táblázaton, cellán belül igazodjon a beírt szöveg oda, ahova én szeretném? Nem a balrazárt és jobbrazárt igazításra gondolok, hanem hogy pl a cella jobboldali szegélye előtt 1cm-re jobbrazárt legyen a beírt szöveg.
Az én tippem az, hogy valamiért az excel átalakítja a beimportált képek file formátumát (pld. jpg-ből bmp-t csinál). Az irodai excel-ed Option-jei között nézz szét, hogy van-e valami ilyesmi beállítva...
Igen, én is beállításra gyanakszom, de így nem tudom kitalálni, végig kéne bogarászni őket... Még egy lehet: a tárolási hely. Lehet, hogy a munkahelyi hálózat viselkedéséről van szó?
Excel 2002 alapvetoen ami bent van. De a laptopon is 2002-es van es azon meg tudom csinalni..., eloszor en is a verzio problera tippeltem , de igy nem valoszinu.
Nem tudom, mi okozza a különbséget, azonban ha rákattintasz a jobb gombbal a képekre, van egy parancs, hogy "látszik a kép eszköztár", azon találsz egy tömörítés ikont. Ha az eredeti kép megmarad, akkor az Excelbe nem kell jó minőségben beszúrni, bátran lehet tömöríteni. És szerencsére van olyan opció, hogy alkalmazás az összes képre, nem kell egyenként.
Azonban ha ez napi rendszerességű munka, célszerű lenne felkínálni valami pénzt/sört valakinek, aki ír rá egy makrót, amihez lehet tenni egy gombot az eszköztárra.
Hihetetlen problémával találkoztam, ami gondolom egy pár pitiáner kattintással (remélem) megoldható.
Adott egy excel fájl, amibe a következő módon kell jpg. képeket beszúrni:
Beszúrás Objektum Létrehozás fájlból Tallózás (itt ugye kiválasztom amit szeretnék) Ikonként látszik be kell ikszelni
Ennyi a mulatság, ami munkahelyi gépeinken úgy valósul meg, hogy az összes 1,5 MB adatállományból 20-30 MB lesz!! Tehát a kiindulási 1 MB-os excel, és a csatolandó (összes!) 0,5 MB dokumentumokból lesz ez a gigafájl.....
Itthoni gépemen, és laptopon minden további nélkül sikerül, és az adatállomány összeadódik, ahogy kell, szépen 1,5 MG lesz.
Erre kérném a megfejtést, mer beleőszülök.... Ez nem egy egyszeri alkalom, hanem naponta kell többször megcsinálni folyamatosan.
Hihetetlen problémával találkoztam, ami gondolom egy pár pitiáner kattintással (remélem) megoldható.
Adott egy excel fájl, amibe a következő módon kell jpg. képeket beszúrni:
Beszúrás Objektum Létrehozás fájlból Tallózás (itt ugye kiválasztom amit szeretnék) Ikonként látszik be kell ikszelni
Ennyi a mulatság, ami munkahelyi gépeinken úgy valósul meg, hogy az összes 1,5 MB adatállományból 20-30 MB lesz!! Tehát a kiindulási 1 MB-os excel, és a csatolandó (összes!) 0,5 MB dokumentumokból lesz ez a gigafájl.....
Itthoni gépemen, és laptopon minden további nélkül sikerül, és az adatállomány összeadódik, ahogy kell, szépen 1,5 MG lesz.
Erre kérném a megfejtést, mer beleőszülök.... Ez nem egy egyszeri alkalom, hanem naponta kell többször megcsinálni folyamatosan.
Köszönöm a segítséget, ezzel meg lehet oldani a problémát ha csak egy tengelyed volt eddig, de mi van akkor, ha az adott diagramban már használok másodlagos tengelyt? Ilyen estre nincs valami ötleted/ötletetek?
A konkrét esetben nem ismert a dokumentum neve, így maradt a 2. megoldás.
A működés vizsgálata érdekes eredményt adott. Az Execute hatására azonnal megjelent a tálcán az elkészítemdő körlevél ikonja, de csak néhány másodperc múlva lehetett vele bármit kezdeni (többszáz címzettről van szó). Az Activedocument viszont azonnal felvette ennek tulajdonságait, így a 2. megoldás "bolondbiztosnak" tűnik (kattintgathattam közben akárhová).
vagy a jobb ctrl melletti billentyűrevel is elérhető ugyanez a jobbgombos gyorsmenü (legalábbis ezen a billentyűzeten:) excel2007 alatt így néz ki: gyorsmenübillentyű+b+b+enter
"Ha úgy gondolod, hogy etikátlan egy problémát 2 helyre feldobni, akkor a jövőben egyet ide, egyet oda fogok kérdezni (még megharagszik valaki és magamban maradok"
Lehet, hogy rosszul fogalmaztam, de azt szerettem volna javasolni, hogy amit itt kapsz meldoldási javaslatot, azt ne vidd át egy másik fórumra, mint problémát, azt ameddig lehet, beszéljük ki itt. Az egészet csak azért vetettem fel, mert az általam adott megoldási javaslatot a másik fórumon láttam viszont, mint problémafelvetést.
Nos, hát Word-ben nem vagyok nagyon otthon, ezért bár tippem van, nem biztos, hogy működni fog, és tesztelni sem tudom. Szóval, 2 dolgot próbálnék meg.
1) Ha ismered a dokumentum nevét, ami létrejön, akkor névvel lehet rá hivatkozni:
With ThisDocument.MailMerge
... With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False Set kDoc = Documents("hogyishívják") MsgBox kDoc.Name Set kRange = kDoc.Range(0, kDoc.Characters.Count - 1) ...
End With
2) Ha Excelben új munkafüzetet hozok létre illetve nyitok meg, az mindig az "élre kerül", tehát ő lesz az aktív munkafüzet. Ebből kiindulva gondolom, a MailMerge.Execute által létrehozott dokumentum is aktív lesz a létrehozás után. Tehát (némileg ellentmondva korábbi javaslatomnak) kDoc-hoz rendelném az aktuálisan aktív dokumentumot.
With ThisDocument.MailMerge
... With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False Set kDoc = ActiveDocument MsgBox kDoc.Name Set kRange = kDoc.Range(0, kDoc.Characters.Count - 1) ...
End With
Nem tudom, hogy az Execute és a Set kDoc végrehajtása közötti rövidke időtartam alatt lehetséges-e megváltoztatni az aktív dokumentumot, de ha lehetséges, akkor is elég kicsinek látom az esélyét.
Egy olyan problémával fordulok hozzátok, hogy szeretnék összetartozó számpárokat diagramban ábrázolni és az így kapott görbe alatti területet beszínezni. Ha a számokat Pont(XY) diagramban ábrázolom, akkor az eredmény jó, de nem tudom hogyan lehet kitölteni az alatta lévő területet. Ha viszont átteszem a diagramot Terület diagrammá, akkor az x értékek közötti távolságot egyenlőnek jelzi, még akkor is, ha nem az. A példa kedvéért mellékeltem egy képet is a problémáról. (Excel 2003-ast használok)
Azért használom mindkét fórumot, mert van olyan, mint az előző is, amire szeretném, ha aránylag hamar meglenne a megoldás. Emellett a két oldalról érkező megoldásokat próbálom egybe gyúrni, mert tanulni is szeretnék. Pont a mostani felvetésem megoldása is egy ilyenből született. Mivel éjszaka dolgoztam, feldobtam mindkét fórumra, hátha délelőtt valamelyikre érkezik segítség. Aztán nekem sikerült megoldanom, de mielőtt ide is írhattam volna ez ügyben, el kellett mennem a géptől.
Hálás vagyok mindenkinek, aki önzetlenül segít, nem célom, hogy esetleg tudatlanságból megbántsak valakit. Ha úgy gondolod, hogy etikátlan egy problémát 2 helyre feldobni, akkor a jövőben egyet ide, egyet oda fogok kérdezni (még megharagszik valaki és magamban maradok ;-).
Ha küldesz egy mailt, szívesen megosztom Veled a hetek óta tartó billentyűütögetésem eredményét, melybe sok mindent beleépítettem.
Bocs, hogy ismét Worddel zaklatok, de a minap is szíves és hasznos segítséget kaptam itt.
Nem hagyott nyugodni, amit javasoltál. Kipróbáltam, gyönyörűen működött, kattogtathattam akárhová.
De:
With ThisDocument.MailMerge
... With .DataSource .FirstRecord = wdDefaultFirstRecord .LastRecord = wdDefaultLastRecord End With .Execute Pause:=False Set kDoc = Documents(1) MsgBox kDoc.Name Set kRange = kDoc.Range(0, kDoc.Characters.Count - 1) ...
End With
Várakozásommal ellentétben az .Execute metódus hatására elkészülő körlevél indexe nem Documents.Count, hanem 1. Nem találtam sehol e jelenség dokumenáltságát.
Mennyire lehetek biztos abban, hogy a manipulálandó körlevél indexe a Documents gyűjteményben mindig 1?
Gondolom, észrevetted, hogy szívesen segítünk, ha tudunk, de szeretném javasolni, hogy az itt kapott kódot ne vidd át egy másik fórumra problémaként. Beszéljük meg itt. Egyébként, a mostani felvetésed már megoldásként szerepel a másik fórum-on. Persze, az természetes, hogy ha itt senki nem tud segíteni, máshova is fordulunk...
ha ennyire ragaszkodsz a makróhoz, próbáld meg ezt:
Sub beszur() With Range(Cells(ActiveCell.Row, "B"), Cells(ActiveCell.Row, "K")) .Copy .Insert Shift:=xlDown End With Range(Cells(ActiveCell.Row, "B"), Cells(ActiveCell.Row, "D")).ClearContents End Sub
Tehát köszönöm. De nem egyszerre kell több sort beszúrni, hanem csak néha egyet egyet. Tehát mondjuk a 10. után, azután a 22.után azután majd a 90.után. És, hogy komplikáljam az egész B-K területet újra kellene generálnia. Tehát beszorozni a darabszámot az árral. A beszúrt sorokban is. Ha megnézed rögtön láthatod.
köszönöm a gyors választ. Az a baj, hogy a beszúrást nem egyszer kellene elvégezni, hanem esetleg 5-10 új sor is kellene. ezért kérem inkább a makrot. (Ha lehet)
Az listás a fölötte lévő sor mindegyik képletét lemásolja, amint az első adatot megadtad az új sorban, míg a második csak az(oka)t, amelyik(ek) a beírt adatra vonatkoznak.
Például az A és B oszlopba fixen írsz be számokat. Az A-val a D és E számol tovább, az összes többi oszlop képlete a B értékével számol. Amint beírsz valamit az A oszlopba, a D és E képlete lemásolódik, a többi oszlopé akkor, mikor a B-nek is adtál értéket.
A makrót el is hagyhatod (ha mást nem tartalmaz). Kijelölöd az eddigi adataidat, Adatok -> Lista -> Lista létrehozása – vagy ezek helyett Ctrl+r. Kék keretbe foglalja az adataidat, plusz 1 sort. Mikor ebbe az utolsó sorba beírsz egy értéket, a képleteidet automatikusan bemásolja a sor többi cellájába, a keretet pedig újabb üres sorral bővíti.
Másképp is létrehozhatod ezt az másolást: Eszközök -> Beállítások -> Szerkesztés fül -> az "Adattartományok végén a formázás és a képletek folytatása" előtti négyzetet bejelölöd.
MsgBox "Egy sorral több lett", vbInformation, "ESEMÉNY!"
Remekül működött egy darabig, aztán beszúrtam még oszlopokat, meg egyesítettem cellákat. Azóta bár úgy tűnik végrehajtja a sorbeszúrást, és visszanézve a képleteket is másolta, mégis ezzel a hibaüzenettel jelentkezik:
Run-time error '1004': "A művelet végrehajtásához szükséges, hogy az egyesített cellák azonos méretűek legyenek."
Arra rájöttem manuálisan: 1. Lett egy (3 egymás melletti cellából) egyesített cellám (ez a korábban jól működő másolásnál nem volt). Ezt külön tudom másolni. Azonban, ha más olyan cella is ki van vele együtt (mellette, tehát mondjuk az egész sor) jelölve, akkor azt már nem engedi lehúzni. 2. Ha nem húzva másolom, hanem kijelölve ctrl+c-ctrl+v, akkor átmegy, nem kiabál.
A kérdés: hogyan kellene átírni a makrót, hogy működjön a másolás?
van Allah:))) meg Jimmy:)) kösz szépen, muxik. nem rinyáltam volna ha itt ha csak tíz sorról lett volna szó, de több százról van szó és egyesítenem kell a cellákat és így már működik. legalább ezt is megtanultam:)
általánosként van definiálva, próbáltam szövegként, számként, sehogyse csinálja. viszont ha az fx-re rákattintok miután a függvényt beírtam, feljön a függvényargumentum ablak, ahol egymás alatt megjelenik a három cella azonosítója és alatta =után megjelenik a szöveg összefűzve:) rákattintok, hogy kész és ugyanúgy csak a függvény képlete marad ott.
Sztem szövegként van formázva a D oszlopod, és az Excel azt hiszi, estimesét írtál bele. Jelöld ki a D oszlopot, Formátum -> Cellák -> Szám -> Általános Írd be a D5-be újra a képletet. Ennek működnie kell...
ráállok a D5 cellára, beírom a képletet =ÖSSZEFŰZ(A5;B5;C5) és ott marad a képlet a cellában, nem vonja össze. egymás után meg kellene jelennie a három cellának, de ehelyett csak a képlet marad ott.
ezekkel próbálkoztam, most megcsináltam megint és semmi, valamit elszúrok. most az mindegy, hogy A5, B5, C5 cellákat szeretném összefűzni. ez a képlet: =ÖSSZEFŰZ(A5;B5;C5), de bármelyikkel csinálom, semmi.
kijelöli színessel a három cellát mikor beírtam, a végén nyomok egy entert és nem történt semmi. gondolom a cellahatároknak el kéne tűnnie és egy oszlopot kéne alkotnia a három helyett. de nem csinál semmit. nem lehet, hogy az a baja, hogy szám is van meg betű is vagy az mindegy?
sziasztok, basszuskulcs 3 órája próbálok cellákat egyesíteni, már mindent végigolvastam és nem csinálja, ill. úgy csinálja, hogy csak az első elem marad meg, próbáltam az "és" jellel, próbáltam összefűzzel...semmi, fogalmam sincs hol a bibi. a lényeg van 3 oszlop, az első betűs, a második számos, a harmadik betűs. Ezt a három oszlopot kellene egy oszlopba (illetve egy-egy cellába) rendezni, de sehogy se sikerül. kösz bárkinek, mert már megőrülök!
Most, hhgy látom is már egész másképp értem amit írtál. Szerintem az a legegyszerűbb, ha az A3 cellába beírod egyszerűen ezt: =SOR(A3)-2
és "továbbhúzod." ameddig kell.
Ha sort szúrsz be, azt pedig pl következő módon: Shift + "Space" ctrl+ "c" ctrl+ "+"
vagy még egyszerűbb:
Shift + "Space" ctrl+ "+" ctrl + "l" (L)
Ha egyik sem tetszik akkor szólj, szívesen írok egy szkriptet is. De ezt pl próbáld ki: Sub Makró1() Range(Cells(ActiveCell.Row, "B"), Cells(ActiveCell.Row, "K")).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove End Sub
Megjegyzem, tök felesleges bármelyik fenti hercehurca, mert ha csak a B:K tartományt jelölöd ki sorbeszúrás helyett, akkor pontosan az történik amit te szeretnél... így:
B:K oszlopok ijelölése majd Ctrl+Space majd Enter bővebben: 0. B:K oszlopok kijelölése ott ahová sor szúrnál be. 1. Ctrl+Space (vagy jobb egérgomb katt. Gyorsmenüből kiválasztod a Beszúrást) 2. Enter. (Ha minden igaz felismeri hogy te mit szeretnél, és alapból a megfelelő rádiógomb lesz bjelölve a felugró panelen - mégpedig a "cellék eltolása lefelé")
Adott egy táblázat. "A" oszlop számozva mondjuk 1-200ig. "B" oszlopban árunevek vannak. Ha, mondjuk a 10. sorba beszúrok egy új árut, hogyan lehet megcsinálni azt, hogy az "A " oszlopot újrarendezze növekvő sorrendbe? Tehát a beszúrt legyen a 10. és az alatta lévő, amelyik eddig volt az, a 11. és így tovább. Értelem szerűen a sorok számozása eggyel növekszik, tehát 201.lesz. Ha nem elég érthető javíts ki. köszönettel aulac.
Vagy ha makró kell, akkor pl: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Range("a1:a10") = Now() Cancel = True End Sub
Jobban átnézve, ha gondolod, inkább az alábbiakat másold az 1. munkalap eseménykezelőjébe, mert ez jobban kezeli a lehetséges hibákat:
------------------------------
Private Sub Hibaüzenet(T As Range, HK As Byte) Select Case HK Case 1 MsgBox "Érvénytelen érték az " & T.Address(False, False) & " cellában!", vbCritical, "Adatvédelem" Case 2 MsgBox "Ez nem az A1-es cella! (" & T.Address(False, False) & ")", vbCritical, "Adatvédelem" End Select End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) On Error Resume Next
If Target.Address = "$A$1" Then If Mid(Target, 1, 1) = "K" And Len(Target) > 1 Then Worksheets("3").Activate Worksheets("3").Range("Z" & Mid(Target, 2, Len(Target))).Select If Err.Number <> 0 Then Worksheets("1").Activate Hibaüzenet Target, 1 Err.Clear End If Else: Hibaüzenet Target, 1 End If Else: Hibaüzenet Target, 2 End If
Mit szólnál ahhoz, ha nyomogomb helyett simán rákattintanál kettőt az 1. munkalap A1-es cellájára és átrepítene a 3. munkalap Z oszlopának megadott cellájába?
Másold az alábbi kódot az 1. es munkalap eseménykezelőjébe:
-------------------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$A$1" And Mid(Target, 1, 1) = "K" And Len(Target) > 1 Then Worksheets("3").Activate Worksheets("3").Range("Z" & Mid(Target, 2, Len(Target))).Select Else: MsgBox "Ez nem az A1-es cella! (" & Target.Address(False, False) & ")", vbCritical, "Adatvédelem" End If
Köszi, de ott van, akárhányszor lefuttatom, valamiért megjelenik. Azért bosszant, mert nem értem, hogy miért teszi ezt... Mindenesetre, azért beillesztem a hibakezelést is.
Még az jutott eszembe, hogy mivel nem értjük, miért van ott az a gordiuszi csomó, mielőtt nagy lendületet veszünk a kettéhasításához, érdemes felkészülni rá, hogy esetleg mégse nincs ott, nehogy pofáraesés legyen a vége.
Selection.Interior.ColorIndex = 19 On Error Resume Next ActiveChart.SeriesCollection(2).Delete On Error Goto 0
Köszönöm, de egyelőre valami miatt nem akarja működni magát. Még próbálkozom, de van egy fenntartásom a hiperhivatkozással.
Más táblázatnál jártam vele úgy, hogy amikor levédtem a lapot módosítás ellen, de úgy, hogy a zárolt cellát még kijelölni sem engedtem, akkor a hivatkozás közelébe kattintva is "ugrott". :-(
Az a gombos-makrós dolog nagyon bonyolult lenne?
Esetleg egy kis más kérdés:
Azt szeretném egy táblázatban, hogy egy tartományon belül, ha duplán kattintok, akkor írja be az aktuális időt. Erre ezt alkottam, de nem akarja az igazságot:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Target.range ("a1:a10") Target = FormatDateTime(Time, vbShortTime) Cancel = True End Sub
Azt meg tudom alkotni, hogy mindenhová kattintva beírja, de a pontos helyet nem sikerült rögzítenem.
Megint csak tippelek. Miután lefutott a makró, nézd már meg, hány adatsor van a grafikonon. Szerintem kettő. Te csak az elsővel foglalkozol, azt definiálod, módosítod, de közben a másik is ott van a háttérben. Szerintem akkor is ott van, amikor a napi adatokat jeleníted meg, csak valamiért - pl. skálázási okokból - nem látszik. Ha kitörlöd a 2. adatsort, úgy gondolom, megjavul a grafikon viselkedése.
Makróval történő diagram frissítésben szeretnék segítséget kérni. Egy nyomógombbal szeretnék egy diagram felületen vagy csak napi, vagy pedig csak havi adatokat megjeleníteni. Adott kettő munkalap, „Diagram” és „Diagram2”, amelyeken az alábbi struktúra szerint vannak adatok:
A „Diagram” munkalapon található az Áru nevű diagramfelület, valamint egy „HaviNapiBTN” nevű nyomogomb.
A problémám lényege az, nem értem, hogy az alábbi rutin miért tesz fel kettő azonos értéket a diagramra, amikor a „havi” adatokat szeretném megjeleníteni, a „napi” adatoknál pedig teljesen jól jeleníti meg az adatokat:
A „HaviNapiBTN” nevű nyomógombhoz az alábbi makrót rendeltem:
Sub ÁruHaviNapiAdatok()
ActiveSheet.Shapes("HaviNapiBTN").Select
If Selection.Characters.Text = "Havi adatok" Then ÁruHN "H", Worksheets("Diagram2").Cells(2, Columns.Count).End(xlToLeft).Column ActiveSheet.Shapes("HaviNapiBTN").Select Selection.Characters.Text = "Napi adatok" Else ÁruHN "N", Worksheets("Diagram").Cells(1, Columns.Count).End(xlToLeft).Column ActiveSheet.Shapes("HaviNapiBTN").Select Selection.Characters.Text = "Havi adatok" End If
SQLKérdés Szeretném megköszönni a tavaly decemberi SQL-es könyvajánlásodat. 1 hete már a birtokosa vagyok. Drága mulatság, de megéri a pénzét (bár ajándékként kaptam), mert nagyon jó.
Van egy több munkalapból álló munkafüzet (a lapok nevei pl: 1, 2, 3)
Az 1. lap A1-es cellájába egy képlet segítségével kapok egy eredményt. Az eredmény lehet: K1, K2, K3 stb.
Azt szeretném, ha egy gombra kattintva az A1-es eredménytől függően a 3. lapon lévő meghatározott cellára ugrana. Tehát, ha K1 jön ki eredményül, akkor a gombra kattintva a 3. lap Z1-es cellára ugorjon, ha K2, akkor a Z2, ha K3, akkor a Z3.
Azt feltételeztem, hogy case select-el kellene, de valahogy nem sikerült a képlet végeredményének celláját, illetve az abban lévő változó eredményt (az 1. lap A1-est) definiálni.
A Paste nem csak Selection-nel megy, hanem Range-el is. Az pedig nagyon konkrétan és precízen meghatározható. Az alábbi példakód az kódot tartalmazó dokumentum (ThisDocument) 4-6. karakterét másolja át a D:\dok1.doc végére.
Dim r As Range, EndPosition As Long, D As Document
Set D = Documents.Open("D:\dok1.doc") Set r = ThisDocument.Range(3, 6) r.Copy EndPosition = D.Characters.Count - 1 D.Range(EndPosition, EndPosition).Paste
De nem erőltetem tovább. Lehet, hogy valóban egyszerűbb a tálcáról eltüntetni a kísértést.
A Application.ShowWindowsInTaskbar = False, majd a munka végén kiadott Application.ShowWindowsInTaskbar = True segített. A tiltás az összes pillanatnyilag látható Word taskot elrejti, az engedély visszahozza. Munka közben a körlevélen végrehajtott módosítások látszanak, de ez nagyon nem baj. Az engedély kiadásának pillanatában viszont a körlevet már elmentettem, bezártam.
Igen, ez tetszene. Tulajdonképpen az kellene, hogy minden a feladat szempontjából érdektelen dokumentumot elrejtsek a tálcáról, aztán, ha befejeztem, amit akartam, visszaállíthassam. Tudja valaki, hogyan tehetném ezt meg?
Igen, ez lenne az igazán jó, de (bár nagyon nem akartam az ittenieket Word specifikus elemekkel fárasztani):
1. A Selection ojektum és így metódusai (pl. Selection.Paste) is globálisak, azaz nem tudom megmondani, hová szúrjon be (legalábbis nem ismerem a módját, hogy mindenképpen - mondjuk - a Document(ezKell) dokumentummal tegye).
2. Nem én nyitom az új dokumentumot, hanem a Word, amikor körlevél készítését kérem tőle. Hiába sikerült kinyernem, melyik ez a dokumentum, ha minden utasítás elé teszek egy Document(ezKell). Activate sort, akkor is tudok olyan állapotot generálni, amikor a Selection.Paste nem oda szúr be, ahova én akarok.
El kellene felejteni az olyan hivatkozásokat, mint az activeDocument, ActiveSheet, meg hasonlók. Tessék rendesen definiálni Document típusú változókat, hozzárendelni a megfelelő dokumentumokat, és azokra hivatkozni a kódban. Akkor aztán kattintgathat a user akárhová, nem fogja megzavarni a futást.
Pl. Dim d As Document Set d = Documents.Open("Dok1.doc") d.SaveAs "Dok2.doc"
Bizonyos esetekben az ActiveDocument helyett a ThisDocument használható. Ez arra a doc-ra hivatkozik, amelyikben a makró van.
Igaz, hogy menet közben nem frissült a képernyő, de az activeDocument megváltozott. Így a makró lefutása után "örvendezhettem" a nem várt eredménynek. :-)
A futás idejére le kell állítani a képernyőfrissítést. Ez az Excelnél a makró elején az Application.ScreenUpdating = False sorral tehető meg, amit makró végén True-val kell visszaállítani.
A probléma Wordben merült fel, de gondolom, Excellel is előfordulhat.
Van-e mód arra, hogy ha egy hosszabb makró futása alatt a júzer összevissza kattintgat a tálcán, az activeDocument/activeSheet/activeAkármi ne változzék?
Csak akkor küldd át, ha a most bevált sebészeti eljárás sem vezet eredményre. Úgy vélem, ez alapvetően belgyógyászati kérdés. Az ilyenek gyógyításához én kevés vagyok.
Ha tudnád reprodukálni, akkor beküldhetnéd a Microsoftnak, hogy mondjanak rá valamit. De szerintem ez is kb. annyira kiszámítható, hogy a Mars és a Jupiter együttállásakor, amikor a Nap a Szűz jegyében kel, ha hétszer körbejárod a számítógéped az óramutató járásával ellenkező irányban, miközben a paksi erőműben éppen műszakváltás van, akkor jelenik meg a probléma. Egyszóval lehet, hogy sosem találkozol vele többé.
Köszönöm szépen! Úgy tűnik, az export/import jót tett, mert azóta nem jön elő a hibajelenség, sőt előcsalogatni sem bírom sehogy... Na, ez a paranormális... Ha megint felbukkan, jelentkezem és átküldöm a munkafüzetet (sajnos, nem tudom feltenni sehova)
Tippelek. Próbáld meg exportálni a Userformot fájlba (Project Explorerben jobb klikk ->Export), aztán törölni az eredetit, és vissza importálni a mentésből.
Adott egy Userform, amit ha megjelenítek (Userform1.Show) azonnal megjelenik a ToolBox is. Van rajta 6 Label és egy CommandButton1, tehát semmi különös. Ilyennel még nem találkoztam, mindjárt megőrülök, mert nem tudom behatárolni, hogy miért csinálja ezt! Már levettem a formról mindent és akkor is megjeleníti a ToolBox-ot. Tudna valaki segíteni?
Kijelölöd a sorokat. Szerekesztés/Ugrás (vagy ehelyett Ctrl+g), Irányított, Üres cellák. Ezzel minden sorban kijelölted az üres cellákat. Ctrl és mínusz gombot nyomsz, megjelenik a Törlés gyorsmenü, amin a Cellák eltolása balra opciót választod.