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.
De az én mintám NEM ez az eset. Az én adataim a leírtak szerint vízszintes adatok egyetlen sorban és az üres cellák megszámolása sem így történik. (Hanem a nemüres előtti üres cellákat kell megszámolnom az előtte lévő első nemüres celláig. Ahogy a mintán írtam.
Igen, a Warning "ki van iktatva", hiszen azt csinálja form. Az felhasználó felé az óra ketyegés jó gondolat, csak egyenlőre összeakad a két időzítés - mivel közben a procinak is kell egy kis idő :( - ezért most azt próbálgatom, hogyan tud összejönni.
Volt máskor egy olyan megoldásom, hogy egy cellába kitettem pl. a Now+5 perc időt, azzal a szöveggel, hogy a fájlban addig lehet dolgozni. Amikor az idő eltelt, jött a figyelmeztetés, ha tovább akart dolgozni, kapott még plusz időt. Szerintem itt is kellene még adni valamennyi időt - mondjuk 1 percet a további munkára, a 20 mp kevés szerintem arra, hogy befejezzen valamit, pláne a figyelmeztetés miatt még ideges is lesz :)
Az A3-ba való kiírás és visszaszámlálást csak azért gondoltam, hogy a felhasználó láthassa mennyi ideje van nyugton dolgozni. Ez a mostani rendszerben 5 perc.
Aztán 30 másodperc a formon, hogy "namostaztán" be lesz zárva.
De akkor ebben a warning-makró nem is működik, nem?
Nem szeretném újra indíttatni a számlálást, ne lógjon ezen a fájlon :-)
Az a két sor szándékosan van kiremelve, nem az okozza problémát, szerintem más lehet a gond.
Az A3-ba nem kell beírnia a 20 másodpercet, nem is foglalkozik vele a program. Azt a sort ne is tedd vissza.
A TimerStart azért nincs indítva az elején, hogy rögtön lásd a formot, hogyan múködik, ne kelljen várni rá. Természetesen visszateheted.
Az A3-ban történő számolásnak én nem látom értelmét akkor, ha a formon elég feltűnően megy az idő...
Lehet én gondolom rosszul.
A TimerStart-ban benne maradt egy Debug.Print, azt is ki lehet/kell venni.
Még egy megjegyzés: A fájlhasználatra várakozási idő és bezárási felszólítás utáni közbeavatkozási idő nyilván nem kell, hogy megegyezzen. A Timerstartban azt az időt lehet állítani, ameddig a felhasználót nyugton hagyjuk - akkor is, ha nem nyúl a fájlhoz, a form visszaszámlálásában pedig azt, ami rendelkezésre áll a bezárás megakadályozására.
Az elsőhöz kell az időzítés, a másodikhoz egyszerűen elegendő a várakozás amit bemutattam. Az hogy most mindkettő 20 mp csak a véletlenek különös összejátszása (na meg, hogy teszt alatt ne kelljen hosszú perceket várni az időzítés beindulására).
Sőt azt is el tudom képzelni, hogy az időzítést indítása - odébbtolása a felhasználó eseményei alapján történjen. Pl. egy munkalap aktíválása törli az előzőleg beállított időzítést és ismételten beállítja a következőt egy későbbi időre. Törölni muszáj, mert amíg az idő nem múlik el, addig automatán indul. Azaz a munkalapok váltott nézegetése mindig odébb tolja a figyelmeztető üzenet megjelenítését.
Ez az esemény lehet akár worksheet_change ill. worsheet_selection_change stb.
feltettem egy fájlt, amiben benne vannak részben a makróid is, egy megoldási ötlettel. A fájl megnyitásakor most azonnal elindul a visszaszámlálás (hogy ne kelljen rá várnod :) ), természetesen ez megváltoztatható.
Az időzítés leállításához ezt kell az immediate ablakba beírni, miután az OK-t megnyomtad:
Application.OnTime kovido,"szamolos",,False Enter
Próbáltam tesztelni párszor, nálam működött. Nem tudom, ilyesmire gondoltál-e.
Szerintem nem Excel problémád van. És azt sem gondolom, hogy távolból meg lehet oldani.
De nagyobb eséllyel kapsz segítséget a Kérdés windowsos gurukhoz topikban (http://forum.index.hu/Article/showArticle?t=9157541), de ahhoz majd többet kell elmondanod a gépedről. Memória (bár ha Win10 van rajta, akkor feltételezem, hogy van elég), winchester kapacitása és kihasználtsága. És egy HD Sentinel jelentés. Aztán hogy más programok nem mutatnak-e hasonló hibajelenségeket.
Excel függvényekben szeretnék egy kis segítséget kérni.
Az a problémám, hogy az alábbi képen látható időpontok között eltelt időintervallumokat szeretném kiszámolni naponként. Magyarul minden 2. olyan kockából amibe van valami írva ki kell vonnom az 1-el előtte levő időpontot. A probléma, hogy, ahogy a képen is látszik a két időpont között nem mindég ugyan annyi kocka van.
Tudnátok valami olyan képletet mondani, ami ezeket az időket kiszámolja és vagy felsorolja (szóval hogy az eredmények sora valahogy úgy nézzen ki, hogy pl. 1:00, 1:00, 0:30, 1:00, stb), vagy rögtön átlagolja is ezeket (szóval a naponkénti átlagos időintervallumot adja ki)?
Bocs, hogy csak most reagálok, de kicsit ledöntött engem is valami ...
És még most is kér(d)éssel jövök.
Leírnád, hogy pontosan mi lenne a célod a kétféle visszaszámlálással? Vagy csak az egyik marad, amelyik jobban fog tetszeni? Vagy ugyanazt a visszaszámlálást szeretnéd látni mindkét helyen?
Ezek tisztázása nélkül nem tudok igazán véleményt mondani és segíteni.
Szerintem pontosítsd a kérdést. Milyen feltételhez milyen formázást szeretnél? A 0-ra vonatkozó kérdésed sem érthető így, ugyanis minden további nélkül lehet feltétel, hogy ha a cella tartalma 0, akkor alkalmazza az általad beállított formázást.
Esetleg még írj be egy mintát, benne azt, hogy milyen feltételt adtál meg a formázásnak, és ha nem teljesült, akkor azt is, hogy mi volt a cella tartalma akkor, amikor nem teljesült a kívánságod.
Sub Workbook_Open() Workbooks("Ido.xlsm").Sheets(1).Range("A3") = "0:00:20" TimerStart Ido End Sub
Sub Workbook_BeforeClose(Cancel As Boolean) If Module1.kovido > Now Then Application.OnTime Module1.kovido, "Warning", , False 'kikapcsoljuk az időzítőt If Module1.kovido > Now Then Application.OnTime Module1.kovido, "Ido", , False End Sub
Module 1-ben:
Option Explicit
Public kovido
Sub TimerStart() kovido = Now + TimeSerial(0, 0, 20) ' 20 másodperces időzítési idő Application.OnTime kovido, "Warning", , True Application.OnTime kovido, "Ido", , True End Sub
Sub Warning() Dim PPW As Object, T As Single, i As Long Dim mysec As Integer, msg As String Set PPW = CreateObject("WScript.Shell") T = Timer mysec = 30 While Timer < T + mysec msg = "A FILE bezáródik " & Int(T + mysec - Timer) & " másodperc múlva." & vbLf & "Nyomj okét, ha nem szeretnéd." With PPW Beep i = .Popup(msg, 1, "IKTATÓ bezárás", 0) If i = 1 Then Workbooks("Ido.xlsm").Sheets(1).Range("A3") = "0:00:20" Ido TimerStart Exit Sub End If End With Wend ThisWorkbook.Close savechanges:=True End Sub
Sub Ido()
Dim Ido As Date Ido = Now + TimeValue("00:00:01") Application.OnTime Ido, "Visszaszamlalo"
End Sub
Sub Visszaszamlalo() Dim Tartomany As Range Set Tartomany = Workbooks("Ido.xlsm").Sheets(1).Range("A3") Tartomany.Value = Tartomany.Value - TimeSerial(0, 0, 1) If Tartomany.Value = 0 Then Exit Sub Call Ido End Sub
Option Explicit ' Ez arra jó, hogy figyelmeztet, ha elfelejtesz értéket adni egy változónak.
Sub keres()
Dim eredm As Range
Sheets("database").Select
Dim eredm As Range
Set eredm = Range(("A:A")).Find(what:="IGEN", MatchCase:=True) ' Ez megkeresi a nagybetűs IGEN szót.
' Ha nem biztos, hogy csupa nagybetű, akkor MatchCase:=False kell
Range("C" & eredm.Row) = "99" ' A "C" oszlop megtalált sorába írja a 99-et
Sheets("feladat").Select
End Sub
Viszont egy javaslat: Ha egy mód van rá (és majdnem mindig van) soha ne használd a select parancsot. Áttekinthetetlenné teszi a programodat. A munkalapok közt nem kell váltani, elég hivatkozni rájuk, ha a munkalap nevét egy változóban deklarálod. Például "munkalap", mint az alábbi mintában. De ha rövidebben akarod, akkor lehet ws nevet adni neki.
Aztán a cellába történő íráshoz sem kell a cellára állni. Csak hivatkozni rá, és megadni az értéket. Szóval én így írnám meg a részletet:
Option Explicit
Sub keres()
Dim eredm As Range, munkalap As Worksheet
Set munkalap = ThisWorkbook.Worksheets("database") ' Így kap értéket a munkalap hivatkozás
Set eredm = munkalap.Range(("A:A")).Find(what:="IGEN", MatchCase:=True)
Next Set filt = ws1.AutoFilter.Filters(2) Dim cl As Range Set cl = Sheets("C").Columns("A").Find(what:=Replace(Mid(filt.Criteria1, InStr(filt.Criteria1, "=") + 1), "*", ""), LookIn:=xlValues, lookat:=xlWhole) If Not cl Is Nothing Then cl.Offset(0, 1).Value = Sheets("B").Range("W1").Value Else MsgBox "Nincs ilyen találat: " & Replace(Mid(filt.Criteria1, InStr(filt.Criteria1, "=") + 1), "*", "") End If Else
"ahol megtalálta mondjuk a A23, ott a B23 cellába másoljon be egy cellaértéket, ami a "B"munkalapon levő W1 cellaérték mindig"
Ez így roppant érdekes, mert minden "rendes" táblában az első sor fejléc, tehát a W1 cellában elvileg mindig ugyanaz az érték van... Autoszűrőnél pláne ajánlatos, hogy az első sorban a fejléc legyen.
Az még egyszerűbb lenne, ha a C munkalapod első oszlopán végigmenne, szűrné az A-B munkalapot és beírná az értéket - nemde? Csak az már egy másik történet...
Most már tényleg nem akarlak fárasztani a hülyeségeimmel, de még egyetlen egy dolog nagyon jól jönne, ha ez megoldható.
Arról lenne szó, hogy ugyebár itt szűréssel rákeresek valamire. Van egy "C" munkalapom, aminek az A oszlopában vannak, azok a szavak, amikre rákeresek.
Egy olyan kérdésem lenne, hogy megoldható-e az a dolog, hogy amire én rászűrők, azt a szót, ő megkeresse a "C"munkalap A oszlopában, és ahol megtalálta mondjuk a A23, ott a B23 cellába másoljon be egy cellaértéket, ami a "B"munkalapon levő W1 cellaérték mindig.
Úgy is jó, ha ezt automatikusan a B munkalap megnyitásával csinálná, de úgy is ha külön makró, amit én indítanék.
Nem fontos, hogy most válaszolj bőven ráér. Csak esetleg, ha valamikor éppen ráérsz, akkor ez segítség lenne.
"A Kovács szűrés szerintem az A munkalapon sem adhatja vissza Kovács Andrást... csak akkor, ha egyéni szűrést használsz, kezdete Kovács feltétellel, de ebben az esetben a B munkalapon is ugyanígy fogja látni, mert ugyanazt a szűrő kifejezést alkalmazza."
Így igaz. Tökéletesen működik.
Nagyon szépen köszönöm a rám fordított idődet, sokat segítettél!