Az Eszközök/Bõvítménykezelõben kapcsold be a két Analysis kezdetût, attól valószínûleg helyrejön. Ez a két bõvítmény egy halom hasznos új függvényt ad, érdemes tanulmányozni.
Dede a program tökéletes, egészen addig amíg elmentem, és kilépek. Ha megnyitom utána, akkor a kijelölés az eredeti helyén marad, és hibába kattintok máshova, már csak a normál keret mûködik, mintha nem is lett volna benne makró, viszont ahol volt, ott úgy marad, mintha formázva lennének a cellák.
Ezt a makrót (sajnos) nem én írtam. Ahhoz a laphoz kell rendelned, amelyiken ki akarod emelni a sort: lapfülön jobb klikk, Kód megjelenítése. Bejutottál a makrószerkesztõbe, a jobb oldalon kapott üres területre másold be.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.FormatConditions.Delete With Target With .EntireRow .FormatConditions.Add Type:=xlExpression, Formula1:="1" With .FormatConditions(1) With .Borders(xlTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = 5 End With With .Borders(xlBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = 5 End With .Interior.ColorIndex = 20 End With End With With .EntireColumn .FormatConditions.Delete .FormatConditions.Add Type:=xlExpression, Formula1:="1" With .FormatConditions(1) With .Borders(xlLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = 5 End With With .Borders(xlRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = 5 End With .Interior.ColorIndex = 20 End With End With
.FormatConditions.Delete .FormatConditions.Add Type:=xlExpression, Formula1:="1" .FormatConditions(1).Interior.ColorIndex = 36 End With End Sub
Hali! Köszönöm!Igen, ez a legegyszerûbb fatengelyes elv, csak az a gond, hogy ha mindent ami sallang hó fehérre tolok, akkor van a bibi, ugyanis nem látom hova meg mit is írok be fekete színnel. :) Érted?! Azért köszönöm!Mivel rájöttem h az excel fos úgy ahogy van, mivel nem lehet megadni egy cella méretét mm-ben, vagy cm-ben, így word-ben szerkesztem tovább a mai nap ezt a munkalap szerû táblázatot. Nem egyszerû eset. Na majd kitalálom.
hello! azon cellák amelyek nem kellenek (sallang) azoknak a betûszíneit változtasd a háttér színére. gondolom fehérre. s akkor csak azokat fogod látni mik kellenek s azt is fogja kinyomtatni. szerintem más megoldás nincs, de ha türelmesebb vagy s van akkor majd kapsz választ.
Kedves Fórumtársak! Olyan kérdésem lenne, hogy ha excelben akarok nyomtatni egy nyomtatványt mátrix nyomtatóval úgy, hogy csak az értékek nyomtatódjanak a megfelelõ részen a papírra, és a többi sallang ne (megszerkesztett keret, címek, stb..) , akkor azt hogyan tudom megcsinálni? Valahogy egybe kellene fagyasztani az alap táblázatot, és csak az utólagosan beírt értékeket szeretném kinyomtatni. Köszönöm!
Sziasztok! Egy olyan kérdésem lenne, hogy valahogy sikerült eltüntetni azt, hoyg ha belekattintok egy cellába, akkor megjelenjen a fekete keret. Nem tudjátok, hol lehetne visszaállítani? Köszi!
Az elsõ makró (#1007) még a laphoz volt rendelve, és a B12 cella változását figyelte. Utána írtad, hogy választéklistából kerül be az adat, amit már nem lehet eseményvezérléssel figyeltetni. Ahhoz írtam a "szortiroz" makrót, ezt már nem a laphoz kell rendelni. Bemész a VB szerkesztõbe (Alt+F11), kiválasztod bal oldalon a füzetedet, Insert menü, Module. A jobb oldalon kapott üres lapra kell bemásolnod. Visszatérsz az Excelbe. Alt+F8-ra bejönnek a makrók, a kiválasztott "szortiroz"-hoz az Egyebek gomb segítségével gyorsbillentyût rendelhetsz. Amikor kiválasztasz az A1-ben egy számot, a Ctrl+a megadott billentyû a helyére teszi. Bemásoltam a mostani változatot, elég sajátságos az elrendezés, nem látok benne rendszert, de te tudod, mit akarsz. Az elsõ adatot mindegyik oszlopban a 6. sorba írja, a következõt alá, az jó. Nem értem, mi a gondod.
Ezzel a makróval milehet a baj? Csak egy-két dolgot írtam át rajta, de azok csak az oszlopok elhelyezését módosította, szerintem. Csak a 6. sorokba ír, és nem megy tovább..
Sub szortiroz() Dim a As Variant, oszlop As Integer, usor As Integer Dim k As Integer, sz As String
a = Left(Cells(1), 5) Select Case a Case 10000 oszlop = 11: k = 5: GoTo Szort Case 20000 oszlop = 12: k = 5: GoTo Szort Case 30000 oszlop = 15: k = 5: GoTo Szort Case 40000 oszlop = 20: k = 5: GoTo Szort Case 50000 oszlop = 25: k = 5: GoTo Szort End Select
a = Left(Cells(1), 4) Select Case a Case 1000 oszlop = 8: k = 4: GoTo Szort Case 2000 oszlop = 9: k = 4: GoTo Szort Case 3000 oszlop = 14: k = 4: GoTo Szort Case 4000 oszlop = 19: k = 4: GoTo Szort Case 5000 oszlop = 10: k = 4: GoTo Szort End Select
a = Left(Cells(1), 3) Select Case a Case 100 oszlop = 5: k = 3: GoTo Szort Case 200 oszlop = 6: k = 3: GoTo Szort Case 300 oszlop = 13: k = 3: GoTo Szort Case 400 oszlop = 18: k = 3: GoTo Szort Case 500 oszlop = 7: k = 3: GoTo Szort End Select
a = Left(Cells(1), 2) Select Case a Case 10 oszlop = 2: k = 2: GoTo Szort Case 20 oszlop = 3: k = 2: GoTo Szort Case 30 oszlop = 24: k = 2: GoTo Szort Case 40 oszlop = 17: k = 2: GoTo Szort Case 50 oszlop = 4: k = 2: GoTo Szort End Select
a = Left(Cells(1), 1) Select Case a Case 1 oszlop = 21: k = 1: GoTo Szort Case 2 oszlop = 22: k = 1: GoTo Szort Case 3 oszlop = 23: k = 1: GoTo Szort Case 4 oszlop = 16: k = 1: GoTo Szort Case 5 oszlop = 1: k = 1: GoTo Szort End Select
Szort: sz = Trim(Cells(1) & "")
If Cells(6, oszlop) > "" Then usor = Cells(65536, oszlop).End(xlUp).Row Cells(usor + 1, oszlop) = Right(sz, Len(sz) - k) Else Cells(6, oszlop) = Right(sz, Len(sz) - k) End If End Sub
Ha az ezres és tízezres nagyságrendet azonos oszlopba írta, akkor te írtál el valamit a makróban. Most innen (#1036) másoltam be a VB-be, és hibátlan. Mielõtt kitettem ide, leellenõriztem mindenféle számmal.
Megírtam az újabb óhajodnak megfelelõen. Innen másold be, hogy ne legyen elírás.
Sub szortiroz() Dim a As Variant, oszlop As Integer, usor As Integer Dim k As Integer, sz As String
a = Left(Cells(1), 5) Select Case a Case 10000 oszlop = 5: k = 5: GoTo Szort Case 20000 oszlop = 10: k = 5: GoTo Szort Case 30000 oszlop = 15: k = 5: GoTo Szort Case 40000 oszlop = 20: k = 5: GoTo Szort Case 50000 oszlop = 25: k = 5: GoTo Szort End Select
a = Left(Cells(1), 4) Select Case a Case 1000 oszlop = 4: k = 4: GoTo Szort Case 2000 oszlop = 9: k = 4: GoTo Szort Case 3000 oszlop = 14: k = 4: GoTo Szort Case 4000 oszlop = 19: k = 4: GoTo Szort Case 5000 oszlop = 24: k = 4: GoTo Szort End Select
a = Left(Cells(1), 3) Select Case a Case 100 oszlop = 3: k = 3: GoTo Szort Case 200 oszlop = 8: k = 3: GoTo Szort Case 300 oszlop = 13: k = 3: GoTo Szort Case 400 oszlop = 18: k = 3: GoTo Szort Case 500 oszlop = 23: k = 3: GoTo Szort End Select
a = Left(Cells(1), 2) Select Case a Case 10 oszlop = 2: k = 2: GoTo Szort Case 20 oszlop = 7: k = 2: GoTo Szort Case 30 oszlop = 12: k = 2: GoTo Szort Case 40 oszlop = 17: k = 2: GoTo Szort Case 50 oszlop = 22: k = 2: GoTo Szort End Select
a = Left(Cells(1), 1) Select Case a Case 1 oszlop = 1: k = 1: GoTo Szort Case 2 oszlop = 6: k = 1: GoTo Szort Case 3 oszlop = 11: k = 1: GoTo Szort Case 4 oszlop = 16: k = 1: GoTo Szort Case 5 oszlop = 21: k = 1: GoTo Szort End Select
Szort: sz = Trim(Cells(1) & "")
If Cells(10, oszlop) > "" Then usor = Cells(65536, oszlop).End(xlUp).Row Cells(usor + 1, oszlop) = Right(sz, Len(sz) - k) Else Cells(10, oszlop) = Right(sz, Len(sz) - k) End If End Sub
Lenne 1 kérdésem excelben, remélem tudtok segíteni! Szóval az lenne h van egy táblázatom, ahol nevek és fizetendõ összegek vannak. S ezt kellene átírnom egy másik táblázatba, úgy hogy ha változik a név, akkor az összeg is. Ez meg is van egy szûrõ illetve FKERES függvénnyel, ami rákeres az adott névre. Viszont a gond akkor van ha a név kétszer szerepel, akkor csak az elsõt írja ki, a második összeget nem. Erre tudtok valami h azt is kírja? (úgy mint az elsõ összeget, hogyha változik a név akkor ez is)
Pl:
Kovács János 3245 Nagy Béla 1457 Kovács János 1241
Így kellene: (egymás mellé, külön) Kovács János Fizetendõ: 3245 1241
Ez nagyon jó! :) Köszönöm, annyi gond van még, hogy valamiért az 1000201006282010 és a 10000201006282010-et egy oszlopba írja... ugyanez a 2000 és a 20000-el kezdõdõeknél is. Egyébként azt még meg lehet oldani, hogy az oszlopba már csak az elsõ számjegyek utáni számokat írja be? Tehát ne azt írja h 1000201006282010, hanem azt h 201006282010.
Ha úgy értetted,ahogy az elõbbi hozzászólásban leírtam, itt a makró. Ha az elõbbi hozzászólásomban leírtak szerint szeretnéd szétválogatni az adataidat, itt van hozzá a makró:
Sub szortiroz() Dim a As Variant, oszlop As Integer, usor As Integer
a = Left(Cells(1), 5) Select Case a Case 10000 oszlop = 5: GoTo Szort Case 20000 oszlop = 10: GoTo Szort Case 30000 oszlop = 15: GoTo Szort Case 40000 oszlop = 20: GoTo Szort Case 50000 oszlop = 25: GoTo Szort End Select
a = Left(Cells(1), 4) Select Case a Case 1000 oszlop = 4: GoTo Szort Case 2000 oszlop = 9: GoTo Szort Case 3000 oszlop = 14: GoTo Szort Case 4000 oszlop = 19: GoTo Szort Case 5000 oszlop = 24: GoTo Szort End Select
a = Left(Cells(1), 3) Select Case a Case 100 oszlop = 3: GoTo Szort Case 200 oszlop = 8: GoTo Szort Case 300 oszlop = 13: GoTo Szort Case 400 oszlop = 18: GoTo Szort Case 500 oszlop = 23: GoTo Szort End Select
a = Left(Cells(1), 2) Select Case a Case 10 oszlop = 2: GoTo Szort Case 20 oszlop = 7: GoTo Szort Case 30 oszlop = 12: GoTo Szort Case 40 oszlop = 17: GoTo Szort Case 50 oszlop = 22: GoTo Szort End Select
a = Left(Cells(1), 1) Select Case a Case 1 oszlop = 1: GoTo Szort Case 2 oszlop = 6: GoTo Szort Case 3 oszlop = 11: GoTo Szort Case 4 oszlop = 16: GoTo Szort Case 5 oszlop = 21: GoTo Szort End Select
Szort: usor = Cells(65536, oszlop).End(xlUp).Row If Cells(10, oszlop) > "" Then Cells(usor + 1, oszlop) = Cells(1) Else Cells(10, oszlop) = Cells(1) End If End Sub
Rendelhetsz hozzá gyorsbillentyût: Alt+F8 -ra bejönnek a makrók. Kijelölöd a szortiroz nevût, az Egyebek gombra kapsz egy párbeszéd ablakot, ahol a Ctrl+ mellé beírod a betût, amelyikkel a billentyûzetrõl indíthatod. Gombhoz is rendelheted.
Erre miért kell makró? Egy szabad oszlopban megjelenited A1 elsõ karakterét left fg-el. Majd pivottábla, amit úgy alakitasz ki ahogy akarsz.
Ja és a lényeget megint kifelejtettem, hogy nem kézzel van beírva az A1-be, hanem egy legördülõ választék listábol lehet kiválasztani ezeket a kódokat, és a kiválasztott szám megy az A1-be.
Tehát az lenne a lényeg, hogy beírok egy értéket egy cellába, legyen ez az "A1". Az ide beírt érték elsõ számjegyeit kell figyelnie a makrónak. Ezek termék kódok, pl ílyenek lehetnek: 5201006272010, 10201006272010, 100201006272010. Az elsõ számjegyek lehetnek 1, 2, 3, 4, és 5 számjegyûek. És ezeket szortírozni kellene, 5201006272010-ezt pl az 5-el kezdõdõek oszlopába kellene írnia, az A10-be, és ha még egy 5-el kezdõdõ elõfordul, akkor azt az A11-be. 10201006272010-ezt a 10-el kezdõdõekhez kellene írnia a B10-be. 100201006272010-ezt a 100-al kezdõdõekhez, és így tovább...
Ha jól értem, akkor az A1-be írsz közvetlenül, tehát ennek a változását kell figyeltetni. Az eredeti makró nem figyeli, hogy a B2-be bevitt érték hány számjegybõl áll. Akkor ezt kérted: "...beírok egy értéket mondjuk B2-be és ha az 10-el kezdõdik akkor azt tegye a B10-be ha még egy 10-el kezdõdõt írok akkor azt a B11-be írja. És ha 20al kezdõdõt írok akkor azt a C10-be tegye és így tovább..?". A 10-zel kezdõdõ szám minimum 2, maximun akárhány számjegyû lehet. Arra tippelek, hogy beviszel egy értéket az A1 cellába. Attól függõen, hogy ez hány számjegybõl áll, a B2, C2, és D2 cellákba kell szortírozni, illetve ha már van ezekben érték, a B, C és D oszlop következõ sorába kell másolni az A1-be beírt értéket. Kérlek, ugorj neki újra, és próbáld meg pontosan leírni, mire van szükséged. Ha lehet, kicsit bõkezûbben bánj a mondatrészeket elválasztó vesszõkkel, mert ezek nélkül kicsit nehezen lehet követni a mondanivalódat.
Még annyit változtattam az elõzõ makrón hogy nem mindíg 2 számjegyû az érték, és átírtam "a = Left(Target, 2)" -ezt 3-ra, 4-re. És ahol más a számjegy ott változott "If Target.Address = "$B$2" Then" -ez is. C2-re D2-re. És ezért kellett egy képlet. Az A1-be beírt érteket egy HA fügvény dönti el hogy hány számjegyû és, hogy a B2, C2 vagy D2-be kell-e írnia. Csak ha ezekbe a cellákba beírja, nem mûködik a makró :S és nem írja be az oszlopokba.
Írd meg a B2 képletét. Az érdekel, hogy melyik cella (cellák) értékének változása módosítja a B2-t.
Szia Delina! Emlékszel még arra a makróra amit nekem írtál?
Private Sub Worksheet_Change(ByVal Target As Range) Dim a As String If Target.Address = "$B$2" Then a = Left(Target, 2) If a = "10" And Cells(11, 2) = "" Then Cells(11, 2) = Target Exit Sub End If If a = "10" And Cells(11, 2) > "" Then _ Cells(Range("B65536").End(xlUp).Row + 1, 2) = Target If a = "20" And Cells(11, 3) = "" Then Cells(11, 3) = Target Exit Sub End If If a = "20" And Cells(11, 3) > "" Then _ Cells(Range("C65536").End(xlUp).Row + 1, 3) = Target End If End Sub
Valahogy így nézett ki.. Olyan probléma merült fel, hogy a "B2"-be beírt érték, nem kézzel van beírva, hanem egy képlettel kerül oda. És így nem akar mûködni :S erre van valamilyen megoldás? Esetleg egy gombbal mûködne?
A szimulációs miben van írva? Ha Excelben, akkor nem a laphoz, hanem a ThisWorkbook-hoz kell rendelni. A végére tegyél a Msgbox-ot, ami szól, hogy végzett. Egyébként, ha a ThisWorkbook-hoz rendeled, a laphoz rendelt Worksheet_Change érzékeli a beírást.
A másik problémát meg még mindig nem tudtam megoldani. Amikor elõször próbáltam megoldani azt a problémát én is a "change" utasítást használtam. De sajnos a ez a parancs nem érzi ha a szimulációs program frissíti a táblát, tehát beírja a cellákba az értékeket meg kiírja hogy "Results Availablet", olyan mintha nem történne változás. :S
Az is megoldás lehetne ha idõnként (mondjuk 2 másodpercenként) lefutna egy makró ami ellenõrzi hogy kiírta-e hogy kész. De sajnos a "Wait" parancsot nem használhatom mert ha fut egy makró akkor nem adja át az adatokat csak ha paranccsal kérem. Viszont ha elõbb kérem az adatot mint ahogy a szimuláció végez akkor hibaüzenetet kapok amit le kell okézni, így megáll a ciklus.(ja a szimuláció lefutási ideje sztochasztikus (ha használhatom ezt a durva kifejezést:D) 10 másodperctõl 5 percig is tarthat)
Lehetne még egy megoldás is, ha lehetne egy makrót írni ami a felugró ablakot felugrás után 2 perccel leokézi vagy eltörli. Van erre parancs? Nem találtam rá semmit...
De gondoltam egy olyan megoldásra is, hogy veszek egy majmot és betanítom, hogy amikor egy cellába megjelenik egy bizonyos szám akkor lenyom egy gombot. :D De ez állatkínzás lenne 24 órán keresztül :D
Ez lett a vége. A makró szépen beilleszti a vágólapra tett adatot, ha nem teljes a kijelölés akkor figyelmeztet. Ráadásul bolondbiztos is egy kicsit mert ha nem a Munka1-en áll a munkafüzet akkor sem rombolja szét az aktív lapot.
Köszi!
Sub beilleszt_vr() Sheets("Munka1").Select Range("A1:O1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.ClearContents ActiveSheet.Paste
sz = "This message has been sent by System Guard, please do not reply." Columns("A:A").Select On Error GoTo hiba Selection.Find(What:=sz, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Select MsgBox "Sikeres beillesztés. Összesen " & Selection.Row - 24 & " sor."
Exit Sub
hiba: Range("A1:O1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.ClearContents MsgBox "Hibás beillesztés, ismételd meg új kijelöléssel!"
End Sub
Tehát egy másik makró beírja valahova a szöveget. A laphoz rendelj egy makrót, ami ezt az eseményt (változást a lapon) lekezeli.
Sub ResA() Cells(5, 1) = "Results available" End Sub
Ez a makró beírja a lapra (jelen esetben az A5-be) a vizsgált szöveget. Mivel változás történt a lapon, beindul a hozzá rendelt makró:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Value = "Results available" Then Cells(2, 1) = Cells(1, 1) + 1 End If End Sub
Ez az A2-be írja az A1+1 értéket abban az esetben, ha a lapon megjelent a "Results available" szöveg.
Nem akarod elhinni, de a function NEM TUD MÁS CELLÁBA ÍRNI.
Az itt közölt makród Else ága felesleges, hiszen a fu változó csak akkor kap értéket, ha a range("a1")=2 feltétel igaz. Amíg nem adsz értéket, a változó nulla, vagy üres string.
Példa a memória változóra:
Sub változó() Dim v As Variant v = 26 MsgBox v beír v End Sub
A Dim utasítással helyet foglalsz a v nevû változónak a memóriában, ebben az esetben variant típusút, vagyis mindegy, hogy a késõbbiek folyamán egész számot, tizedest, logikai értéket, vagy éppen dátumot töltesz bele. A második sorral értéket adsz neki. A harmadikkal kiíratod egy üzenetbe, végül a negyedik sorrral meghívod a beír makrót, és átadod neki a változó értékét.
Sub beír(v) Cells(2, 3) = v End Sub
A címsorban zárójelek között szereplõ változó értékével kezd valamit ez a makró, jelen esetben beírja a C2 cellába.
Tegnap este kipróbáltam. Az a baj hogy azt a függvényt nem én írom ami kiíratja a "Results available"-t. (Le van jelszavazva, bárcsak bele piszkálhatnék...) :S Viszont megpróbáltam úgy hogy arra írok függvényt, hogy amikor megjelenik a felirat akkor oda-vissza lép két lap között, de nem lépkedett :S. A "Worksheet_Activate" parancsot viszont kipróbáltam azzal nem volt gond az tette a dolgát. Szóval még mindig ott állok ahol a part szakad :S. Hol lehet annak utánanézni, hogy mik a korlátai a "function" parancsnak?? Ja úgy tervezem a második fele a ciklusnak úgy fog indulni ha két feltétel teljesül:1, lefutott az elsõ fél 2, kész a szimuláció (ez hiányzik már csak :S) Azért mellékelek egy egyszerûsített példát hátha én rontottam el valamit:
Public Function fu(cell As Range, _ Optional default_value As Variant)
If cell.Range("a1") = 2 Then fu = default_value Sheets("Munka2").Activate Sheets("Munka1").Activate
Else fu = 0 End If End Function
Sub Worksheet_Activate()
Cells(1, 1) = Cells(1, 1) + 1
End Sub
Lenne viszont még egy kérdésem de ez csak aprócska. Hogy definiálok változókat úgy hogy azok a memóriába maradjanak és ne keljen mindig egy cellába menteni õket? (Egyébként kezdõ vagyok még a makro programozásból, de jól bele csaptam a lecsóba... :))
Függvénybõl ezt nem tudod megoldani. Mit szólsz ahhoz a megoldáshoz, hogy mikor beíratod a "Results available"-t, átlépsz egy másik lapra, majd vissza? A lapra történõ visszalépést lekezelheted egy eseménykezelõ eljárással (Worksheet_Activate), ez lenne a "jel", amire indul a ciklus második fele. A "második fél"-be tegyél egy változót, ami az általa újraindított "elsõ fél"-nek jelzi, hogy egyszer már eljutott a másodikba, és ettõl függjön, hogy indítja-e megint a másodikat. Egyébként végtelen ciklusba szaladsz. :) De ezt biztosan tudod.
A példám csak egy leegyszerûsített példa. Nekem az lenne a fontos hogy elindítsak egy sub-ot egy adott értéknél. Hiszen az excelt egy szimulációs program interfészeként használom. Egy ciklussal adnám meg a program input értékeit, amit makróban írok. Csak az a baj hogy nem szabad semmilyen makrónak futnia, amíg a külsõ progi dolgozik, hiszen addig nem adja vissza az adatokat. Így a "Wait" parancs kilõve (vagyis most azt használom de így 10 órás egy vizsgálat, és mellette kell ülnöm, mert néha megakad :S). Így azt gondoltam, hogy for ciklust kettészedem két if ciklusra. Az elsõ elindítja a szimulációt. A szimuláció lefut, visszaadja az adatokat a táblának (change ezt nem érzékeli :S), az egyik cellában megjelenik a "Results available" felirat. És erre a "jelre" indulna a ciklus második fele, ami megadja a megfelelõ cellákba következõ paramétereket, és újra indítja az elsõ programot. Huhhh no ezzel nem akartalak terhelni titeket, és ezért írtam leegyszerûsített példát. :) Remélem van megoldás az ilyen problémára, vagy nekem az is elég lenne ha egy függvénybõl bármilyen sub-ot el tudja indítani.
Függvénnyel nem lehet más cellába íratni, nem arra való. Csakis abba a cellába ír értéket, amelyikben szerepel. Amit szeretnél, olyan, mintha pl. a SZUM függvénytõl várnád el, hogy ha a kapott érték megfelel egy kritériumnak, akkor egy másik cellában jelenítsen meg egy értéket. Az E5-be tegyél egy HA függvényt, ami ezt elintézi.
Szeretnék írni egy olyan függvényt, ami meghív egy sub-ot ami ír a tábla egyes celláiba.
Valahogy így:
Public Function MyFu(cell As Range, _ Optional default_value As Variant)
If cell.Range("a1") = 2 Then MyFu = default_value Application.Run ("viz") Else MyFu = 0 End If End Function
Public Sub viz() Worksheets("Munka1").Cells(5, 5) = 1 End Sub
Szerintem ennek mûködnie kéne, de ha a beadott érték 2-re vált akkor csak az „#ÉRTÉK!” visszajelzést kapom. Ha olyan sub-ot futtatok, ami mondjuk egy szövegdobozt dob eredményül, de nem avatkozik be akkor viszont fut. Mi lehet az ok? Hogy kell megoldani? Ez a függvény egy agyon makrózott táblába megy, amibe egy külsõ program is nyúlkál. (A problémám akkor is fenn áll, ha csak egy üres táblába próbálkozok.) Már próbáltam más paranccsal (change) is megoldani a problémát, de az összeakadást okoz, a függvény látszik megoldásnak, csak ez se fut.
Köszönöm elõre is a választ:
iscasC
A törlés>beillesztés>ellenõrzés megoldást választottam. Jó kijelöléssel szépen mûködik is. A hibakezelésben kellene még ötlet.
Jól gondolom-e, hogy hibás kijelölés esetén (ha nincs a beillesztésben a zárósor) akkor valamilyen hibával ki fog lépni Debug módba? Mert ezt nagyon el szeretném kerülni.
Az lenne a legjobb, ha hiba esetén csinálna egy Undo-t és figyelmeztetne, hogy ismételd meg a beillesztést új kijelöléssel.
Köszönöm a gyors választ, ma tudtam kipróbálni a megoldást, szépen mûködik a makró és kiírja, hogy hol találja meg a záró szöveget.
Az a gondom vele, hogy mivel mindig az elõzõ napi adattáblát írom felül ezért ha egy hibás kijelöléssel írom felül a munkalapomat a keresett szövegem akkor is ott lesz valahol az 1500. sor környékén csak éppen az elsõ 700 sor az adott napi adatokat tartalmazza, a következõ 7-800 pedig az elõzõ napit.
Azért gondoltam, hogy a kijelölés méretében van benne a megoldás mert a beillesztés után mindig csak beillesztett tartomány van kijelölve a munkalapon, a többi nem.
Vagy az is megoldás lenne, ha a makró nem az egész munkalapon keresné a zárószöveget csak a kijelölésben, esetleg ha minden beillesztés elõtt törölném a munkalap tartalmát és utána kerestetném a szöveget (ha megtaláltam=jó, ha nem=hiba), vagy ha egy makróba tenném a törlés>beillesztés>ellenõrzés-t és csak akkor van MsgBox ha hiba van.
Ez a makró kiírja a sor számát, ahol a keresett szöveged elõször elõfordul az A oszlopban. Az Sz="Keresett szöveg"-et írd át a záró szövegre.
http://imagerz.com/QEMTUUtvAwJQVVIcRAVR
Valami olyan fv-re vagy egyéb megoldásra lenne szükségem ami a kijelölt tartomány méretét (elég lenne a sorok száma is) adja vissza.
Egy külsõ adatbázis kb 1500 soros html formátumú tábláját másolom be egy munkalapra amit aztán megfelelõ formázás után megjelenítek és feldolgozok egy másik lapon. E-mailben (Outlook, Thunderbird) naponta érkezik az adattábla abban mindent kijelölök és beillesztem Excelbe.
A baj ott van, hogy néha hibázik a levelezõprogram és az 1500 sorból csak pl 700-at jelöl ki. Namármost ha ezt így beillesztem a munkalapra akkor az adattábla fele aktuális lesz a másik fele pedig az elõzõ napi. Arra kellene valami megoldás, hogy a munkalap figyelmeztessen a hibás kijelölésre. Az adattábla nem állandó méretû (1450-1650 sor)naponta változik, illetve mindig ugyanaz a szöveg zárja le és az mindig a legutolsó sor elsõ cellájában van.
Tudom egyszerûbb minden beillesztés után (vagy még inkább kijelöléskor) leellenõrizni a tartományt de a felhasználóim miatt jobb és kényelmesebb volna valami megoldás ami jó nagy piros betûkkel kiírná, hogy "BAJ VAN!!!"
Közben sikerült megoldanom is:)
Ja elfejetettem excel 2003-ban dolgozok
Sziasztok!
szeretnék összegyúrni 2db HA-s függvényt de nem megy mert nem tudom hogy kéne csinálnom Külön-külön megy A két függvény
A kék színnel írt megjegyzések az alattuk lévõ sorokat értelmezik. A Cells(11,2) a 11. sor, 2. oszlopot (B11) jelenti, a Cells(11,3) a C11-et. A kék csillagos sorok közé írtakat kell lemásolnod az End Sub fölé, és értelemszerûen írd át a hivatkozásokat.
Ha több oszlopban, több értékkel szeretném ezt alkalmazni, akkor min kell változatni?
Ezt a kódot rendeld a lapodhoz (lapfülön jobb klikk, kód megjelenítése, a kapott üres lapra másold be):
Private Sub Worksheet_Change(ByVal Target As Range) Dim a As String If Target.Address = "$B$2" Then a = Left(Target, 2) If a = "10" And Cells(11, 2) = "" Then Cells(11, 2) = Target Exit Sub End If If a = "10" And Cells(11, 2) > "" Then _ Cells(Range("B65536").End(xlUp).Row + 1, 2) = Target If a = "20" And Cells(11, 3) = "" Then Cells(11, 3) = Target Exit Sub End If If a = "20" And Cells(11, 3) > "" Then _ Cells(Range("C65536").End(xlUp).Row + 1, 3) = Target End If End Sub
Próbálj egy kicsit pontosabban fogalmazni a kérdés felvetésekor, kevesebb munkát adsz annak, aki segíteni akar.
Ez így jó! csak az a baj hogy átírja az elõzõ értéket ha újat írok be..Úgy meglehet csinálni hogy amit beírok a B2-be azt az oszlopokban mindíg egymás alá írja?
Szívesen az elõzõt.
B10-> =HA(BAL(B2;2)="10";B2;"") Ezt másold le, ameddig kell. Ennek analógiájára C10-> =HA(BAL(B2;2)="20";B2;"")
Azt hogy lehet megcsinálni a legegyszerûbben, hogy ha beírok egy értéket mondjuk B2-be és ha az 10-el kezdõdik akkor azt tegye a B10-be ha még egy 10-el kezdõdõt írok akkor azt a B11-be írja. És ha 20al kezdõdõt írok akkor azt a C10-be tegye és így tovább..?
Hogy lehet a "#ZÉRÓOSZTÓ" hibát egy cellán belül 0-ra varázsolni?
C1-> =ÉV(A1)&" " &HÓNAP(A1) E1:E12 legyen 1, 2, ... 12. Ezt másold át az E13:E24 tartományba. F1-> =2010&" "&E1 ezt lemásolod az F12-ig, F13-> =2011&" "&F13 ezt F24-ig, G1-> =SZUMHA(C:C;F1;B:B) ezt pedig G24-ig.
Ez így kitünõen mûködik! :) CSAK! Van egy kis kompikáció benne... Az hogy a dátumok, egyik évbõl átnyúlnak a másikba, pl 10.08.01-kezdõdik, és 11.06.01-végzõdik. És ezzel a képlettel most úgy számolja mintha a jövõ évi elsõ pár hónap már meglett volna, és azt is hozzá adja.
Egy, az elõzõnél egyszerûbb megoldás, mivel kiderült, hogy nem egy-egy alkalmi, hanem havi összesítés szükséges: Az A oszlopban vannak a dátumok, B-ben az összegek. C1-be: =Hónap(A1). Ezt lemásolod. E1-E12 tartományba 1; 2; ... 12. F1-be: =SZUMHA(C:C;E1;B:B). Lemásolod. G1-be: =F1 G2-be: =G1+F2. Lemásolod Az F oszlopban lesz mindig az egyes hónapok összege, G-ben pedig a göngyölített.
Akkor megpróbálom! :) még az elõzõ képlethez kapcsolódva... Most van 12 kezdõdátum az E oszlopban és 12 befejezõ dátum az F oszlopban, és mindegyik mellett egy kiszámolt összeg a G-ben. Egy olyan kellene, hogy ha mondujuk most 2010.06.01-van. akkor a 6. havi összeget adja eredményül plusz visszamenõleg összeadva a többit. Ezt úgy értem, hogy amelyik hónap már elmult annak az összegét adja hozzá az aktuális hónap összegéhez.
Találjuk ki a kérdést? :) Tegyél be képet róla, hátha egyszerûbb lesz megérteni.
Köszönöm szépen a segítséget! :) Mûködik! Még lenne kérdésem csak az a baj hogy nem tudom megfogalmazni, hogy érthetõ legyen :D
Beírod pl. az E1-be a kezdõ-, az F2-pedig az utolsó dátumot. Egy másik cellába: =SZUM(INDIREKT("B"&HOL.VAN(E1;A:A;0)):INDIREKT("B"&HOL.VAN(F1;A:A;0))) Ez megadja a két dátum között lévõ, B oszlopbeli adatok összegét.
Sziasztok! Hogy lehet azt megoldani hogy két dátum közötti összegeket adjon nekem össze.. Pl: az "A" oszlopban van a dátum 2010.05.31-tõl 2011.02.22-ig és minden nap mellett van egy szám a "B" oszlopban pl 52 Ft, 64 Ft. És szeretném hogy magátol kiszámolja a külömbözõ idõpontok közötti értékeket. A válaszokat elõre is köszönöm! :)
Szívesen. A tévesztés a karakterkészlet miatt eshetett meg, nagyon hasonló az 1 és az l megjenenése. :(
Ugyanarról a munkalapról, de nem egy tartományból, hanem különálló cellákból másolom az adatokat a célmunkalap megfelelõ oszlopaiba.
Este megpróbálom megint beszerkeszteni kódot, amit ítál. :)
A 3 adatot mindig az A1:A3 tartományba írod? Vagyis ugyanarról a helyrõl másolja az adatokat a másik lap elsõ üres sorába?
"...nem tudtam mûködõképes állapotba hozni" Valószínûleg nem figyeltél rá, hogy a makró a Munka1 lap kódlapjára kerüljön (bal oldalon ez az aktív), és/vagy ahogy a képen látszik, a makró fölötti részben a legördülõben a Worksheet legyen kiválasztva.
Úgy képzelem el, hogy feltöltöm másolandó adatokkal a cellákat, rákattintok egy "ok" gombra, és ekkor végrehajtódik e cellák értékeinek másolása az új munkalap megfelelõ helyére, minden kattintáskor egy új sorba. :) Amit írtál, beírtam, de nem tudtam mûködõképes állapot bahozni...
Nem biztos, hogy jól értem a feladatot. Azt hámoztam ki a leírásodból, hogy ha a Munka1 lapon beírsz valamit az A1-be, az jelenjen meg a Munka2!A2 cellájában, a Munka1!A2-be bevitt érték a Munka2!B2-jébe kerüljön, a Munka1!A3 pedig a Munka2!C2-be. Az ezután szintén az A1:A3 tartományba bevitt értékek a másik lapon az A3:C3 tartományba másolódjanak át. Ehhez itt láthatod a makrót, és azt, hogy hova kell beírnod a VB szerkesztõben (nálam a füzet neve Munkafüzet1).
Hogyan tudnám megoldani, hogy egy adott munkalapon lévõ bizonyos cellák (pl: A1,A2,A3) értékeit makró hozzárendeléssel egy másik munkalap bizonyos oszlopaiba (pl: A2,B2,C2) másoljam úgy, hogy az új adatok új sorba kerüljenek?
Szívesen. Én is ezt választottam volna, mert ezzel szükség esetén bármikor az összes napi adatot is kimutathatod.
Annak mi lehet az oka, hogy egy rendszeresen használt file néha meghülyül és nem hajlandó CTRL F keresésre sem Format sem Value alapján találatot adni?
Valóban ez látszott megoldásnak, bár nem szívesen fogtam volna bele új diagram összeállításába. Ugyanis 15 oszlop adataiból dolgozik a kéttengelyes diagram, igen idõrabló volt eredetileg is összeállítani, mert néhány oszlop és vonal grafikon létrehozása után már a ChartObjects akarta eldönteni hogy a következõ oszlop, vagy vonal legyen!
Közben megtaláltam a hiba okát! A "Dátum" oszlopban, a beírt adatok alatt 50 - 60 cellával lejjebb, egy makró ír be idõnként dátumokat, amit azután töröl is, ha már nincs szüksége rá. Ezekbõl maradt meg itt néhány, az adatok közt elvégzett sortörlések miatt. Ezek okozták a kihagyásokat! Nyilván átalakítás lesz a dologból!
1. Átteszed a dátumot az oszlopból a sorba, és akkor a mezõcímen állva behívod az Adatok/Tagolás és részletek/Csoportba foglalás menüt. Itt beállíthatod, hogy havonta csoportosítson. Ezt nem mindig engedi, és még nem sikerült rájönnöm, miért tiltja le idõnként.
2. A táblázatodban felveszel egy új oszlopot, ami a dátum oszlopból a HÓNAP függvény segítségével a hónap értékét adja, és ezt az oszlopot teszed a kimutatásba a teljes dátum helyett.
Hogyan tudom beállítani egy kimutatásban, hogy a forrásadat egyedi dátumérékeit tartalmazó mezõjét az oszlopcimkékhez behúzva ne a több száz egyedi dátum jelenjen meg, hanem csupán az egyedi dátumok hónapjai?