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.
Lehet, hogy már van jobb megoldásod, nem néztem végig a többiek javaslatait. A változatosság kedvéért itt egy felhasználói függvény.
Function Követési_távolság(KezdőCella As Range, Cella As Range) Dim Hit As Range, Result As Long
With Cella Set Hit = .EntireColumn.Find(what:=.Value, after:=Cella, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious) If Hit Is Nothing Then GoTo hiba If Hit.Row >= Cella.Row Then Result = .Row - KezdőCella.Row + 1 Else Result = .Row - Hit.Row End If End With Követési_távolság = Result Exit Function hiba: Követési_távolság = "hiba" End Function
B1-be a képlet: =Követési_távolság($A$1;A1)
Lehúzással kiterjeszthető akármeddig. A KezdőCella az a cella, amelyikben az első számod van.
Hát igen, úgy látszik ezt a kompromisszumot meg kell kötni, az új lap átnevezésén felül, még egy adatot be kell írni valahova a lap beillesztéséhez.
Köszönöm!
Lenne itt még valami: Ugyanebben a fájlban van egy összesítő lap, amely az újabb, és újabb lapok esetén mindig egy sorral bővül. Ezt a sor beszúrást lehetne automatizálni?
Ha legközelebb megint probléma lenne egy függvény angol-magyar neve, keresd meg a saját gépeden a FUNCS.XLS fájlt (általában itt található: C:\Program Files\Microsoft Office\OFFICE11\1038\) ebben mindent megtalálsz.
Még annyit hozzátennék, hogy ahol 0-k vannak a forrásoszlopban, ott a 0 első előfordulásakor a cellákat eltolva adja az eredményt, aztán a továbbiakban a 0 helyénél nem ír ki semmit, üresen hagyja azt a sort, függetlenül attól, hogy a B1 sorba beírtam-e 0-t a többi vizsgált szám mellé vagy sem.
Végülis ez nem baj, mert a 0-kat nem muszáj kijeleznie, vagy legfeljebb megszámolom. Vagy kicselezem, és átírom a 0-kat másik számra és úgy vizsgálom meg, aztán visszaírom.
Hogyan lehet azt megoldani, hogy csak a kijelölt tartományban végezze el a makrót? Mert ha csak úgy elindítom, a munkafüzet többi részét felülirja (elcseszi), ahova pedig nem is kéne írnia.
Most azt csinálom, hogy egy külön excel táblába kimásolom csak a forrásoszlopot, és ott futtatom le a makrót. Aztán visszamásolom a kapott eredményt.
Kipróbáltam 20.000 db, 5 féle adattal. Az én lassúcska gépemen 49 sec alatt végzett vele. Ne felejtsd el az adatok fölé B2-től kezdve jobbra beírni a különböző értékedet.
Sub valami() Application.ScreenUpdating = False For oszlop = 2 To ActiveSheet.UsedRange.Columns.Count For sor = 2 To ActiveSheet.UsedRange.Rows.Count sz = Cells(sor, 1) If sz = Cells(1, oszlop) And f = 0 Then Cells(sor, oszlop) = sor - 1: f = 1 End If If Cells(sor, oszlop) = "" And oszlop - 1 = sz Then Cells(sor, oszlop).Select felso = Cells(sor, oszlop).End(xlUp).Row Cells(sor, oszlop) = sor - felso End If Next f = 0 Next
'Összes előfordulás másolása a B oszlopba For sor = 2 To ActiveSheet.UsedRange.Rows.Count Cells(sor, 1).Select oszlop = Selection.End(xlToRight).Column Cells(sor, 2) = Cells(sor, oszlop) Next
'Első sor, és C:F oszlopok törlése Rows("1:1").Select Selection.Delete Shift:=xlUp Columns("C:F").Select Selection.Delete Shift:=xlToLeft
Range("A1").Select Application.ScreenUpdating = True End Sub
Viszont ez előrefelé számolja a sorrendet, szóval előbb meg kell fordítanod a sorrendet...majd vissza...a függvényt meg value formájában kell lementeni...
Sub valami() For oszlop = 2 To ActiveSheet.UsedRange.Columns.Count For sor = 2 To ActiveSheet.UsedRange.Rows.Count sz = Cells(sor, 1) If sz = Cells(1, oszlop) And f = 0 Then Cells(sor, oszlop) = sor - 1: f = 1 End If Next f = 0 Next For oszlop = 2 To ActiveSheet.UsedRange.Columns.Count For sor = 2 To ActiveSheet.UsedRange.Rows.Count sz = Cells(sor, 1) If Cells(sor, oszlop) = "" And oszlop - 1 = sz Then Cells(sor, oszlop).Select felso = Cells(sor, oszlop).End(xlUp).Row Cells(sor, oszlop) = sor - felso End If Next Next End Sub
A törlést szeretném elkerülni, mert akkor már egyszerűbb ha én megszámolom és beírom manuálisan, vagyis időben kb ugyanannyi.
Sokszor nem kell a jövőben csinálnom, de jelenleg kb 20ezer cellát kéne így megvizsgálni. És manuálisan kicsit sokáig tartana, bár elkezdtem, de háromszáznál abbahagytam :) Jobb lenne valami frappánsabb, gyorsabb megoldás.
Amit beraktál képet, ott tényleg valami bibi van a számolást illetően.
De az a baj, hogy azért nem 100%-os ez a megoldás...
És mi a lényeg?
Hogy csupán függvénnyel 100%-ig automatikusan megoldjuk, semmi törlés stb..., vagy hogy csak simán "kész legyen" :-)))...szóval, hogy csak egyszer kell ilyesmit csinálnod, vagy sokszor majd a jövőben?
És az pl lehetséges, hogy utólag filterrel töröld azokat a sorszámokat, amik pl nem az egyesre vonatkoznak?
Azt tudom hogyan sorszámozz, ha van külön 1-es, 2-es stb oszlopod, de az a baj, hogy csak úgy tudom megoldni, hogy legyen érték a nem egyesek mellett is...
Köszönöm az együttérzést és a segíteni akarást! Nem szeretnék senkit se lefoglalni, ha van fontosabb, dolga is. De ha szívesen foglalkozol vele, azt nagyon szépen köszönöm!
Az eredmény lehet külön-külön oszlopban is, tehát ha 5 számot vizsgálunk az A oszlopban akkor B-ben az 1-esek, C-ben a 2-esek, D-ben a 3-asok, E-ben a 4-esek, F-ben az 5-ösök... ha így hamarabb van rá függvény. Ilyenkor üres cellákkal szeretném feltölteni (meghagyni) az oszlopot, ahol nincs találat.
Nem találtam függvényt, de biztos van rá valami ügyesség :)
Szóval egy oszlopban vannak számok, pl 1-től 5-ig. A mellette lévő cellában szeretném megjeleníteni, hogy hány cella múlva jelenik meg megint az a szám. Már az első cellától kéne számolni, hogy mikor jelenik meg (de ha csak a keresett szám első előfordulásától számolja az is jó)
Példa: A oszlop a számok 1-5 között, B oszlop az eredmény
Vegyünk egy függvényt a 3. lapon, amely a 2. lapról vesz adatot. Például:
=SZUM(Munka2!C4:D14)
A cél az, hogy a 2. munkalap neve ne egy fix dolog legyen, hanem szintén paraméter. Ezt ugye az INDIREKT függvénnyel lehet megoldani. Ha az aktuális munkalap A1 cellájában van a 2. munkalap neve (tehát A1 = "Munka2"), akkor a fenti példa így módosul:
=SZUM(INDIREKT("'" & A1 & "'!C4:D14"))
Tegyük fel, hogy a 3. lapod tele van olyan képletekkel, ami a fenti módon hivatkozik a 2. lapra: az A1 cellából veszi a lap nevét. Ha ezt a 3. lapot lemásolod, és így létrejön a 4. lap, csak annyi dolgod van, hogy ezen a 4. lapon átírod az A1 cella értékét Munka3-ra, és máris az összes képlet a 3. lapra fog hivatkozni.