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.
Képzeld el megnéztem azokat a kész programmokat amiket ide írtak azok akik ahogy te írtad JÓFEJEK, és sajnos nem sokkal jutottam közelebb a megoldáshoz/megértéshez, leadták az alapokat, de eleve úgy kezdték az oktatást mintha már mindenki tudna programozni pedig ez nem tanultam ezt egyeltalán és nem az alatt az 5 óra alatt amit tartottak ezzel kapcsolatban nem lettem okosabb programozás terén. Amúgy köszi a mérhetetlen jóindulatot, ja és melesleg az email címem ikerkriszti@freemail.hu
Figyelj, bahátom. Idejössz egy olyan kéréssel, ami alapjaiban sérti a szakmai fórumok íratlan szabályait. A szavaidból egyértelműen kiderül, hogy fingod nincs az egészről. Ha ez egy egyetemi házi feladat, akkor nyilván órán leadták az elkészítéséhez szükséges anyagot, vagy legalább az alapokat, hogy elindulhass. Ha most olyan szinten vagy, hogy egy értelmes kérdést nem tudsz feltenni a témával kapcsolatban, akkor mi a francot csináltál egész félévben?
Végig azon sírsz itt, hogy segítsünk, közben egy szalmaszálat nem mozdítasz meg a siker érdekében. Előbb tán valamit le kéne tenni az asztalra, nem? Vagy nálad az a segítség definíciója, hogy "csináld meg kérlek az egészet helyettem"?
Mindezek dacára kapsz kész megoldást, mert vannak itt jó fejek is (nem én, de vannak). Gondoltam, majd biztos megnézed, és megpróbálod megérteni, és majd kérdezel, ha nem sikerül. De nem, te csak tovább nyüszítesz, még arra sem vagy hajlandó, hogy a kész megoldást megnézd. Hát mit vársz? Küldjük el elmail-ben az excel fájlt a sakkprogrammal? (És még csak az email címed sem publikus.)
Ha egy szikrányi eltökéltséget éreznék benned, hogy hozzáteszed a magad részét a munkához, azt mondanám: oké, mindenki hibázik, de adjuk meg az esélyt, hogy helyrehozza. De azok alapján, ami hozzáállásodból lejön, szerintem Taigetoszba való vagy. Uff.
Volt régebben részem hasonlóban... Jól lehet vele keresni... Így utólag bánom, mert tudatlanul jönnek ki az egyetemről, semmire kapnak diplomát... (Bár amúgy is)
Egyrészt rossz helyen keresgélsz, szerintem ez nem az a fórum, ami neked kell. Másrészt ez BTK annak is, aki elvégzi, és annak is aki kéri. Nézz utána.
Egyébként találsz kódokat neten, csak rá ne keressenek a tanárok...
Azt hittem, ilyenkor már vége a szemeszternek... Nem olyan nehéz feladat, viszont elég etikátlan mással megcsináltatni. Nem kéne lesüllyedni a volt államfőnk szintjére.
Mindenesetre pár tipp, ha esetleg becsületesen magad csinálnád meg:
- 8x8-as cellatömb a sakktábla, négyzet alakú mezőkre szabva
- a bábuk lehetnének mondjuk cellával megegyező méretű képek
- esemény makrók szabályozhatnák a lépéseket (pl. ha rákattintasz az egyik bábu képére az triggerel egy makrót ami beszínezi azt a cellát és utána egy másik cellára kattintással léphetnél)
- más esemény makrók szabályozhatnák azt, hogy mikor van vége a játéknak, vagy hogy hova lehet lépni és hova nem
- lehetne egy log, amit a program vezet, ami a lépéseket tartalmazza
Ezen felül még egy rakás dologgal lehetne csicsázni: stopper, lépésvisszavonás, lépéslehetőségek beszínezése, akármi.
Oldjuk meg valamilyen módon az Excelben, hogy a munkalapon valamilyen módon jelzett sakkbábukkal játszani tudjon egymással 2 személy. Oldjuk meg, hogy a játék kezelje a sakkhoz tartozó lépéseket és szabályokat (aki ismeri a jelenlegi legfrissebb szabályt, azt is implementálhatja) Ezt kaptam mint feladatot az egyetemen beadandónak
Lefordítom Jimmy kérdését: amíg meg nem mondod pontosan, hogy mit akarsz, addig vagy senki nem csinálja meg neked, vagy megcsinálja, amit gondol, te meg nem azt kapod, amit akartál, mégis hálálhatod megfele bármivel.
Sziasztok egy nagyon fontos életbe vágó kérésem lenne valaki aki tud vba-ban programozni és tudom, hogy nagy kérés, de segítene nekem sakkot csinálni azt nagyon meghálálnám. ("bármivel")
Nagyon fontos nincs más reményem ezen a forum kivűl.
A következő kérdésem nem igazán Excel ismereteket kíván, de hátha tudja valaki: Amikor a Windows XP alatt keresek, akkor lehetőség van arra, hogy az "egy szó, vagy kifejezés a fájlban" opciót használjam. Azon már szomorúan túltettem magam, hogy az Excel táblázatokban található számokra ez nem érvényes, nyilván a számábrázolás sajátosságai miatt.
Ugyanakkor néha előfordul, hogy egy VBA forrásszöveg részletre emlékszem, de arra már nem, hogy azt pontosan melyik programomban használtam, viszont szeretném előbányászni. Sajnos tapasztalatom szerint erre sem terjed ki a keresés. Tud valaki lehetőséget erre? Néha nagyon hasznos lenne.
Ellenőriztem a dolgot, és ez valóban megoldotta. Mivel a TakeFocusOnClick=False hatására a vezérlés ugyan átadódik a visszaléptető gomb click eseményére, de a fókusz marad azon a boxon, ahol éppen állunk, így nincs módja az exit funkciónak érvényesülni, csak a visszaléptetés befejezésekor. De addigra már le tudom tiltani az eseményvezérlést, így az exit hatástalan.
Jelentem, nyomon vagyok! Azt hiszem, hogy a visszaléptető gomb TakeFocusOnClick=False-ra állítása megoldja a dolgot, mert előbb ugrik oda, és csak aztán az Exit funkcióra.
Egy Userformon végzek adatbeadást. Van egy textboxom, amelyben ellenőrzöm a bevitt adatokat. Konkrétan éppen egy irányítószámot. Az Exit funkcióban ellenőrzöm a szám hosszát, és ha nem 4, akkor figyelmeztetem a felhasználó, és nem engedem ki a boxból.
Ugyanakkor van egy CommandButtonom, ami az adatbevitel mentés nélküli félbehagyását éri el, és visszatér a menüre.
A mentés nélkül tehát azt jelenti, hogy a textboxba történő írást is félbe kell hagyni (hiszen, lehet, hogy utána kell nézni a helyes adatnak). Viszont az exit funkció természetesen nem tudja, hogy Enterrel, vagy valamelyik vezérlő elemre kattintva léptem ki a boxból, így a félbehagyást jelző cmd gomb megnyomásáról sem tud.
Van arra valamilyen mód, hogy megállapítsam az éppen kiválasztott következő vezérlőelem nevét?
Nem vagyok benne biztos, hogy azt értetted, amit mondani akartam, úgyhogy még egy kis kiegészítés.
Az Option Base arra az esetre vonatkozik, amikor egy tömbváltozót deklarálsz a szubrutin elején.
Pl.
Sub akármi()
Dim Tömb(10)
...
End Sub
Option Base 1 esetén a Tömb 1-től 10-ig indexelt, Option Base 0 esetén pedig 0-tól 10-ig.
A Split függvénnyel azonban megkerülöd a deklarációt, és direktben létrehozol egy tömböt. Ha megnézed a makrót, az arrMunkalapok változó nem tömbként van deklarálva, hanem Variant-ként. Ez az a típus, ami minden értéket képes befogadni, még objektumokat is. A Split függvény csinál a Variant típusból tömböt.
A Split függvény pedig úgy van megírva microsoftilag, hogy az általa létrehozott tömb 0-ról indul. De az Option Base ettől függetlenül továbbra is érvényes a Dim-mel létrehozott tömbökre.
Köszi szépen, ezek szerint ez a függvény 0-tól indul. Nem probléma, ha nem 1-gyel kezdődik, csak nem értettem, mivel azt olvastam, hogy a tömbök alap esetben 0-tól indulnak de az option base paranccsal módosítani lehet, akkor ezek szerint ezt nem lehet.
Kipróbáltam az alábbi kódodat és jól működik. Egy apróságban kérném a segítséged vagy bárki más segítségét, biztos tudjátok mi lehet a probléma.
Itt a tömb elemein lépked végig a ciklusszámláló, és nullától indul, ha az eljárás elé írom az option base 1-et akkor elvileg 1-től indulna a számláló. Valamiért továbbra is nulla lesz az első elem indexe. Mi lehet a gond?
Üdv:
Szajmon
Sub ciklus2() Const cMunkalapok = "Management Accounts Hotel/Management Accounts Apartments/Rooms/F&B Summary" Const cPrintAreak = "AN1:BZ70/AN1:BZ110/AN1:BZ199/AN1:BZ134" Dim inti As Integer, arrMunkalapok, arrPrintareak, ws As Worksheet
arrMunkalapok = Split(cMunkalapok, "/") arrPrintareak = Split(cPrintAreak, "/") For inti = LBound(arrMunkalapok) To UBound(arrMunkalapok) On Error GoTo hiba Set ws = ThisWorkbook.Worksheets(arrMunkalapok(inti)) ws.PageSetup.PrintArea = arrPrintareak(inti) If ws.Visible <> xlSheetVisible Then ws.Visible = xlSheetVisible ws.PrintOut Copies:=1 ws.Visible = xlSheetHidden Else ws.PrintOut Copies:=1 End If hibaután: Next Exit Sub hiba: MsgBox "A '" & arrMunkalapok(inti) & "' nevű munkalap nem található." Debug.Print Err.Number, Err.Description Resume hibaután End Sub
Helyesírási versenyen kaptam az alábbi mondatot: "Az aradi vértanúk közül Dessewffy Arisztid nevét nem tudom szótagolva leírni." Természetesen szótagolva.
A minap olvastam egy cikket az amerikairól, aki a CNN-en a magyar nyelv nehézségét taglalja. Meg eszembe jutott egy külföldi diák, aki egyszer azt mondta a magyar nyelvről, hogy tök logikus a felépítése, csak az a baj, hogy minden második eset kivétel a szabályok alól :)
Nemrég kezembe került egy nyelvtani tananyag, ami a tulajdonnevek helyesírását fejtegeti. Hát, tudod... Thewrewk (török) meg Georch (görcs) meg hasonlók... Bat-thyá-ny? Thew-rew-köt??? Nem mondom, hogy ezeket nem lehet mind megtanulni, de én sem fogok a kardomba dőlni, ha véletlenül nem tudom valamelyiket.
És mindezt leprogramozni milyen üdítő lehet :)
Mondjuk az lenne a feladat, hogy írjál programot excelben, ami egy tetszőleges magyar szó szótagolós elválasztását elvégzi. Hogy tetszik? :-)
Köszönöm mindenkinek a válaszokat. Különösen Delilának ezt.
Egyébként pedig elnézést kérek a következő mondatomért: "...az Option Compare Text utasítás segít abban, hogy a stringek összehasonlításánál az adott nyelvi beállításokat - esetünkben magyar ABC szabályait - érvényesítse a program. "
Szóval, amit a magyar ABC szabályainak véltem, az csak az én képzeletemben élt. És bár a nyelvhelyességet világéletemben fontosnak tartottam, a betűrendbe sorolás kérdése elkerülte a figyelmemet. Mostanáig azt képzeltem, hogy amit bebifláztam gyermekként (a, á, b, c ...), az érvényes a rendezésre is.
Még egy ilyen hiányosságomról tudok a magyar nyelvtanban, az pedig a kötőjelek helyes használata. De ezt már nem biztos, hogy képes leszek valaha is pótolni:-)
Rendezés magyar ABC szerint: Vezérlőpult | Területi és nyelvi beállítások | Területi beállítások fül | Testreszabás gombon katt | Rendezés fül | Lenyílóból a Technikai lehetőséget választjuk, végig okézzuk.
Természetesen az alapértelmezett területi beállítás Magyar kell hogy legyen.
Quicksortért cserébe egy a te izlésed szerinti abc sorbarendezés az aktiv munkalapon. Az ékezetes betük helyes rendezését a szövegből oszopok, a kettős betűkét a nem abc karakterekre való oda-vissza cserélés biztosítja. A szóközöket kitöröltem, hogy az Aba Pétert előbbre sorolja mint az Abasári Rizlinget.
A futtatáshoz ki kell jelölni a sorbarendezendő nevek oszlopát. Ebben a formában az első 10 betű és a maradék alapján rendez, de ezt persze átírhatod. Ha a nevek rendezésekor a táblázatod többi oszlopát is mozgatni akarod, akkor az 5. pontban bővítheted az oszlopszámot.
Sub pimreabc()
Dim oszl, sor1, sor2, i
Dim cs, gy, ny, sz, zs, ly, ty
''1. selection parameterek, kisegítő oszlopok betoldása es duplikalas
Az excellel minden megoldható :)))). Itt van még egy megoldás:
Mivel a szóló ékezes betüket az excel a magyar abc szerint rendezi, a szövegből oszlopot paranccsal a karaktereket külön oszlopba téve már megoldható az ékezetes betük pimre féle sorrendje. Így persze a kettős betűk sorrendje borulhat, de ez praktikusan csak c/cs esetében fordulhat elő, ott is csak elvétve.
Az alábbi makró az első 10 betűt teszi külön oszlopokba, amikre aztán egy 11 rendezési kulcsos sorbarendezéső makró írható. Már amennyiben ez tényleg fontos.
Ez egy jó ötlet, ha valaki nem a hivatalos rendezést akarja csinálni, hanem sajátot.
Biztos, hogy megoldható, hiszen ha makrórögzítővel felveszel egy ilyen rendezést, kapsz egy kódot. Ahhoz persze kell mondjuk egy rejtett oszlop, amit akár ideiglenesen is fel lehet venni és törölni képernyőfrissítés letiltásával, amíg tart a rendezés, és akkor nem látja a user.
A másik lehetőség, ha rendezőkulcsnak meg lehet adni egy függvényt is. A Python nyelv például tudja ezt. Nem tudom, a VBA tud-e ilyent. Ha igen, akkor elegánsabb úgy, mint a fenti módszerrel.
A magánhangzók rövid és hosszú változatát jelölő betűk (a – á, e – é, i – í, o – ó, ö – ő, u – ú, ü – ű) a kialakult szokás szerint mind a szavak elején, mind pedig a szavak belsejében azonos értékűnek számítanak a betűrendbe sorolás szempontjából. A magánhangzó hosszú változatát tartalmazó szó tehát meg is előzheti a rövid változatút:
ír Irán író
Irak írandó iroda
iram iránt irónia stb.
A rövid magánhangzós szó kerül viszont előbbre olyankor, ha két szó betűsora csak az azonos magánhangzók hosszúsága tekintetében különbözik:
Eger keres szelel
egér kérés szeles
éger koros szelés
égés kóros széles
A kettősbetűket pedig megelőzik az egyesek (mármint ny előbb van mint nz, úgy ahogy az előbb is írtam).
Nagy lexikonokban is keverednek a rövid-hosszú magánhangzós szavak: pl:állvány alma .......Álmos ...álnév ... áloé ....alom
Amiből az is következik, hogy az első betűre viszonylag könnyen rendezheted a neveket a magyar ábc szerint. Csak annyi kell, hogy a BAL függvénnyel leválasztod az első betüket, és 2 oszlopos rendezést csinálsz. Persze ez csak a munkalapon egyszerű, a vba-tömbökben nem tudom, hogy lehet-e ilyen rendezést csinálni.
Lehet, hogy kiábrándítok valakit, de a rendezés szempontjából az a-á és az e-é között nincs különbség a magyarban. Tessék elővenni bármelyik szótárat, akár helyesírásit, akár magyar–idegen nyelvűt. Az ében és az Elemér ebben a sorrendben helyes. Szóló betűknél nem tudom, miért állít be sorrendet, lehet, hogy ott más elv szerint dolgozik, vagy úgy tekinti, hogy a két szó majdnem egyforma, csak az utolsó betűben különböznek, és akkor mégis kell valamilyen rendező elv. Lehet, hogy a bele, belé esetén is ez történne, most nem kísérletezem.
Tehát jó lenne látni pimre példáit, hogy tudjuk: az Excel működésében van a hiba vagy az elvárásokban?
Nekem úgy tűnik, hogy a kettős betükkel szemben, az AÁ és az EÉ betüpárokat a munkalap is azonosnak tekinti. Meg temészetesen az IÍ, OÓ, ÖŐ, UÚ, ÜÚ betűpárokat is. Tehát amig cucu-csacsi sorrend a magyar abc szerinti, addig az ében-elemér már nem.
Szia, ugyanarra gondolok, amit Te is tapasztalsz. Azaz, hogy a sort parancs használatakor nem tudom elérni, hogy a területi beállítások szerinti sorrendet kapjam. Nem tragédia, csak érdekelt volna, hogy erre tényleg nincs-e lehetőség. Persze nagyon körmönfont programozási technikával biztos megoldható, csak alapból nem.
Mellesleg a z<->y esetben ez kevéssé feltűnő, de az ékezetes karaktereknél feltűnően nem szép, ha keverten látjuk azokat a saját ékezet nélküli párjukkal.
Mert nekem az anziksz és az anya összehasonlítása Option Compare Text-tel azt eredményezi, hogy az anziksz van elől, anélkül pedig az anya szó kerül előre.
A range("A1:A2").sort pedig mindkét esetben az anziksz, anya sorrendet hozza programból.
Másfél hónapja tisztáztuk, hogy az Option Compare Text utasítás segít abban, hogy a stringek összehasonlításánál az adott nyelvi beállításokat - esetünkben magyar ABC szabályait - érvényesítse a program.
Viszont úgy tapasztalom, hogy a programban a sort parancs esetén ez nem működik. Jól gondolom, hogy erre nincs is megoldás?
kipróbáltam, nem mőködik egyenlőre. biztosan valamit elrontok, de nem jelez, hogy dupla. Nem tudom jól értetted-e hogy mit szeretnék.
van az "a" oszlop, ahová beérkeznek a vonalkód adatok. Ha beérkezik egy olyan adat,amit már egyszer beolvastam valamikor (mondjuk 50 sorral ezelőtt) akkor jelezzen, hogy dupla. Így kellene működnie a képletednek, amit adtál?
Vonalkód olvasóval olvasom be a kódokat az excel cellába, és az lenne a feladat, hogy ha már egyszer beolvasott egy számot, és már másodszor szeretném (véletlenül), azt rögtön jelezze...
Hát ez óriási! Nagyon szépen köszönöm a segítséget és a türelmet, hogy ennyire leegyszerűsítve elmagyaráztad! Így mostmár nem csak a feladat oldódott meg, de meg is értettem a lényeget! Le a kalappal!!!
Ha az éves 6% kamatrátát elosztod 12-vel és azt írod be, az nagyon jó közelítés, de nem pontos - főleg magasabb kamatlábak esetén - mivel az adott havi kamat tőkésedik (azaz kamatos kamat a számítás).
Ezért ha 12 hónap alatt a 6% tizenketted részét veszed havonta, akkor az 1 forintod az év végére
(1+0,06/12)^12-1=6,16778118645 %-os éves kamatnak felel meg.
A MÉ és minden pénzügyi képlet a kamatos kamattal számol.
Ha tehát azt akarod, hogy tényleges éves 6%-os kamattal számoljon a képlet, akkor a rátához
nem 0,06/12-t kell beírnod, hanem (1+0,06)^(1/12) - 1-et, vagyis a 6 %-os kamattényezőnek a tizenkettedik gyökéből számított - havi - kamatlábat.
Ez a képletben néhány forinttal nagyobb összeget fog adni jelenértéknek, mivel a kamatláb alacsonyabb.
(Ajánlom még figyelmedbe a pénz időértékéről szóló írásokat.)
Bocs, de ebbe most nincs kedvem beleásni magam, talán majd valaki más... Ezt a függvényt az életben nem használtam még, és nem ma este fogom teli hassal elkezdeni.
Pfú nagyon köszönöm, nagyban elősegítetted a megértést!
Még csak egy olyan kérdés, hogy a vázolt feladatban a MÉ függvényt használva: 23 354, 05 jött ki eredményül.
Most pedig a Te útmutatásod alapján írtam egy ilyen képletet: =((2000*(1+(0.06/12)/(100))^12)-1)*12 és ezzel 24002.4 jön ki akkor most ez lenne a pontos érték? Vagy valamit esetleg elrontottam a képletben?
6% az nem 6, hanem 0,06. A 0,005 a 0,5%-nak a tizedestört alakja, de ez nem Excel, hanem számtan. Ha az Excelben ez problémát okoz, akkor nem jó a cella formázása.
Az egy elvi kérdés, hogy éves vagy havi kamatlábbal számol a bank. Vagyis mennyi időnként írják jóvá. Ha havonta x% a kamat, akkor egy év alatt nyilván (1+x/100)^12 a szorzó, hiszen a második hónapban már az első havi kamattal megnövelt összeg hízik tovább. Ebből visszafelé ki lehet találni, mi dolga a 12-ik gyöknek. De ez is számtan.
Sziasztok! Következő feladatot kaptam a tanáromtól: Pénzügyileg melyik a kedvezőbb? 12 hónapon keresztül megvásárolni a bérletet minden hónap elején 2000 Ft-ért, vagy éves bérletet venni év elején 23 000 FT-ért? A kamtláb évi 6%)
Adatok: A1 cella: 12 A2 cella: 0,005 A3 cella: 2000 A4 cellába meghívom az MÉ függvényt és kiszámolja, 23 354,05-t hoz ki eredménynek. Ráta: A2 Időszakok száma: A1 Részlet: A3 Típus: 1 Ez így rendben is van azt mondta így elfogadja a megoldást. DE! Azt mondta ez így egy kerekítés és aki több pontot szeretne az a 12.-ik gyökkel számoljon. Nem tudok rájönni mit ért ez alatt már mint hova kellene beírni és melyik számnak a 12.-ik gyökét valaki érti esetleg? Ennél több infót nem adott, pontosan lejegyeztem mindent...Nagyon nagyon örülnék ha valaki megfejtené ezt!
U.I.: Mellesleg már az sem teljesen világos, hogy ha az éves kamatláb 6% akkor a havi miért/hogy lesz 0,005. Mikor 6/12=0,5-el. Akkor honnan jön ez a 0,005!?
Egyébként te vezettél rá a megoldásra. Ha nem írod be 23315-ben, hogy hogy lehet egzakt módon méretre állítani a képet, én nem biztos, hogy rájövök, és akkor még mindig egy zsákutcának tűnő sikátorban botorkálnék, messze a megoldástól.
Select ügyben abszolút egyetértek veled. Vannak azonban olyan esetek - sajnos - amikor a nyavalyás excel csak akkor hajlandó az adott objektumon végrehajtani a kívánt módosításokat, ha az éppen ki van választva. Most éppen nem tudok ilyen példát hirtelen, de szívtam már egy-két esetben emiatt.
Talán az application.dialogs(xx).show-val lehetne valamit csinálni, de még nem jutottam el odáig, hogy kipróbáljam, a help és az MSDN pedig ebben a tekintetben abszolut 0-hoz közelít.
Mivel én nem konyítok a makróhoz .....ssssssemmit...már az is teljesítmény részemről, hogy amit küldtél, be tudtam másolni ahova kell, hogy működjön.
És voila....megoldotta a problémámat - még ha szerinted vagy bárki szerint is ez nem szép megoldás. De legalább van!!!
Mellesleg úgy érzem magam ezen az oldalon, mint egy általános elsős az egyetemisták között. Épp, hogy ismerkedem a betükkel. Csak nagyra tárt szemmekkel figyelek. Egy kukkot sem értek az egész oldalból, agyaltam is rajta, hogy merjek-e regisztrálni, ezért ezt megelőzően vagy egy egy hónapon át inkább próbáltam innen-onnan megoldást szerezni a problémámra de sikertelenül. Szóval a szükség hozott ide mielőtt feladnám de sikerrel jártam.
Mégegyszer köszönet. Persze ha ezt még tudod tökéletesíteni, hogy szerinted is "szép megoldás" legyen küldjed csak, kiváncsian várom!
Köszönet neked is Fferi50 és mindenki másnak is, aki bármilyen próbálkozást tett a probléma megoldására.
A Select ellen régóta kampányolok itt, mert az esetek döntő többségében fölösleges. Azért Select-álsz valamit, hogy aztán a Selection által hivatkozott objektumon hajts végre valami műveletet. Ennek mi értelme? Az objektumokat direkben kell meghivatkozni, egyértelmű elérési úttal. Ha az objektumokra Selection-nel hivatkozol, akkor a kódod annyira lesz robusztus, mint mondjuk a kártyavár. Ráadásul a kód megírását is bonyolultabbá teszi. Próbáld ki. Másold be a kódmodulra ezeket:
Sub teszt()
'Select Range("A1").Select Selection
'No select Range("A1") End Sub
Tegyél a Selection után pontot, mintha pl. az Interior.ColorIndex-et akarnád beállítani. Mit tapasztalsz?
Most tegyél a Range("A1") után pontot, mintha pl. az Interior.ColorIndex-et akarnád beállítani. Mit tapasztalsz?
Az intellisense (intelligens kódkiegészítő) nem működik Selection-nel, mert f.ngja nincs, hogy a Selection milyen ojektumot takar. Range("A1") esetében tudja, és ezért csak azokat a tulajdonságokat és műveleteket hozza fel, amelyek a Range típusú objektumra értelmezettek.
A SendKeys meg végképp a programozás megcsúfolása. A legbizonytalanabb kimenetelű dolog, amit Excelben el tudok képzelni. A bolygók állásától talán nem függ az eredménye, de minden mástól igen. Vészhelyzetben oké lehet, de minden más esetben kerülendő. Például vegyük azt a kódot, amit beküldtem. Mi van, ha pl. elszámoltam a TAB-okat, és rossz helyen "nyomok" ENTER-t? Vagy mi van, ha az Excelnek idő kell, hogy egy SendKeys-sel indított feladatot végrehajtson, és addig nem tud fogadni új billentyűparancsokat, de a kódom meg rendületlenül küldi őket? A gép sebességétől függő számú lépés kimarad, aztán megy tovább?
Hogy ne kelljen Jimmynek elismételnie a mostanában a témában elhangzottakat, készítettem egy kis összeállítást az elmúlt negyedévben itt született indoklásokról a select utasítás mellőzésének érdekében:
Ha rejtett Comment-ek vannak, azokat előbb meg kell jeleníteni, hogy a Select ne akadjon ki:
Sub Megjegyzem() Dim sh As Shape, cm As Comment, i As Long For i = 1 To 2 For Each cm In ActiveSheet.Comments cm.Visible = True Set sh = cm.Shape sh.Select DoEvents Application.SendKeys "^1" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" cm.Visible = False Next Next End Sub
Meg fogom kövezni magam ezért a makróért, de nincs jobb ötletem, mint Select és Sendkeys, a két leginkább kerülendő cucc.
Sub Megjegyzem() Dim sh As Shape, cm As Comment, i As Long For i = 1 To 2 For Each cm In ActiveSheet.Comments Set sh = cm.Shape sh.Select DoEvents Application.SendKeys "^1" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Next Next End Sub
És hogy miért kell a For i = 1 To 2 ciklus?
Halvány lila gőzöm sincs. Azt tapasztaltam, hogy ha nincs ismétlés, akkor az első komment képe kimarad a formázásból. Ha kétszer egymás után lefuttatom ugyanazt, akkor az első is átállítódik.
Ami feltétlenül szükséges előkészület:
Egy képen csináld meg méret helyreállítását. Ez azért kell, hogy amikor legközelebb feljön a Megjegyzés formázása ablak, akkor a Méret fül legyen felül.
A kód működésére nincs garancia. Az egyik gépemen fut, a másikon nem...
Kitöltendő cellákra adatérvényesítést használok, részben szabály nélkül, csak a felirat kedvéért.
Rákattintva a megjelenő szövegre egy vatag keretet láttam körülötte. Ekkor egérrel odébb lehetett húzni.
Na ez az, amit nem kellett volna. Soha többé nem bírtam visszatenni a helyére, mert akárhogy próbálkozom, innentől fogva az ÖSSZES cella érvényesítő szövege azon a helyen jelenik meg, ahova azt az egyet húztam, bármelyik is legyen az. Akár méterekre a cellától, ahova tartozik. És nem lehet visszavonni. Mentést meg nem csináltam közvetlenül előtte.
Szerencsére két hasonló táblázatom van, a rontottat eldobtam, majd visszamentem a másikból.
A 2007-es excelben is úgy van mint a 2007-ben. A sorvektor hatványozásánál a pontosvessző az elválasztójel, az oszopvektor hatványozásánál pedig a backslash. Nagy meglátásod volt ezt felfedezni, mivel a súgóban erről sehol semmi.
És ezzel meg is van a többször visszatért kérdésemre a válasz, hogy mi a fenének kellett transzponálni a LIN.ILL képletben. Mert aki kiokumlálta a képletet, az is annyit tudott, hogy a default elválasztójel csak a sorvektoroknál müködik. Így hát transzponált. Ahelyett, hogy konzultált volna veled, hogy megmond neki, hogy egyszerűbb lenne backslasht használni :)))))
Szeretnék még megemlíteni neked valamit. Most hogy megint szóbahoztad hogy dátumok az x változóid, az az érzésem, hogy a trendszámításodhoz a harmadfoku polinomnál sokkal adekvátabb a Fourier analizís. Az Adatelemzés excelbővítmény tartalmazza.
Igen, köszönöm. Valószínűleg maradok az egy munkalapos verziónál. Ronda, de működni fog. (A probléma egyébként nem bővebb annál, ami le volt itt írva.)
Valóban, magában a fileban vannak a képek tárolva.
Viszont: Mi lenne, ha egyszer rászánnád magad és végigmennél a megjegyzéseken az alábbi makróval:
for each cmnt in activesheet.comments
cmnt.visible=true
stop
'itt átmész az adott oldalra és beállítod az alaphelyzetet, utána visszajössz.
hossz=cmnt.shape.height ' itt elmentheted a méreteket, ahova akarod, hogy később ne kelljen vele foglalkozni.
szel=cmnt.shape.width
cmnt.visible=false
next
A méret visszaállítás már a korábban leírt makróval megy, ahova a szélességet, hosszúságot az elmentett helyről veszed.
Cserébe még próbálkozom kibányászni az alaphelyzet beállítását - mert a metódus (SetShapesDefaultProperties)meg van rá, csak valamiért nem akarja megenni.
Szerintem az Excel a megjegyzésekben tárolt képeket nem külön tárolja, hanem a mentett fájlban...ezt a fájl méretéből okoskodtam ki, ami nálam 40Mb körül mozog.
ja, és hátha valakit érdekel e témában ha sok megjegyzéshez lenne kép rendelve és szeretné kibányászni mondjuk az összes képet, elegendő a mentés másként parancsnál weblap-ként menteni. Én is találtam, hasznosnak tartom ezért osztottam meg.
A hivatkozott hozzászólásban láthatod, ha az x adatok sorvektort alkotnak, akkor a hatványvektornak oszlopvektornak kell lennie, azaz nem backslash-sel, hanem pontosvesszővel kell az elemeit elválasztani.
Nálam a 2010-ben működik az alábbi képlet:
=LIN.ILL(G3:K3;G1:K1^{1;2;3})
ahol G1:K1 cellák a mai dátum + 4 nap.
Kíváncsian várom a Te eredményed!
(Hogy a 2007-ben mi a helyzet, talán Tbando tudna valamit mondani)
Más: már írtam, statisztikából úgy tanultam (és tanítottam), hogy idősorok trendszámításánál nem a dátumokat használjuk x adatokként, hanem az 1,2,3 ... stb. számokat.
Persze nyilván előfordulhat, hogy a valós számadatokat az excel képes dátumként is értelmezni - aztán számol is velük, mivel egyébként meg számnak tekinti.
Biztosan tartalmazza a sorokban egy-egy cella a képek útvonalát és nevét.
Nagyon zavar, ha egy makró újra betölti a képeket, onnan megjegyzi az eredeti méreteit, és átállítja eszerint a megjegyzés méreteit? A betöltött képet törli. A méreteket el is tárolhatja a saját rekordjába, hogy legközelebb ne kelljen újra betölteni a képet.
A megjegyzésben tárolt képek eredeti méretének beállítása egyszerű csak automatizálni nem tudom azért kellene a makró.
Megjegyzésben tárolt kép eredeti méretre állítása: - cellára jobb klikk - megjegyzés szerkesztése - megjegyzés peremére dupla bal klikk - méret - alaphelyzet - ok
ezt a folyamatot viszont nem lehet együtemben megcsinálni akkor, mikor a képet hozzáadtuk a megjegyzéshez.(részemről erre nincs is szükségem) Tehát előbb le kell okézni, kilépni a szerkesztésből majd a fentebb leírtakkal folytatni.
Ja és a makró eleve nem játszik, hiszen a felhasználók egy része eleve nem engedélyezi a külső forrásból származó makrókat. Mindent az Excel alapfunkcióival kell megoldanom.
Lehet, hogy az lesz a megoldás, hogy megszüntetem a másik munkalapot, és valahol ugyanazon a munkalapon elrejtett XY oszlopokban sorolom fel az elemeket. Az én életem lesz bonyolultabb tőle, de legalább jól érzi magát valaki Redmondban a bal kettőben...
Ezek nagyon bonyolult megoldások, egyrészt nem is ér ennyi munkát az egész, másrészt ugye itthon szerkesztem a táblázatot Excel 2000-ben, mert az biztos mindenhol megnyílik, elmentem xls-ben, aztán holnap odabent tudom 2010 alatt tesztelni, szóval még csak nem is egy kerületben zajlik a két esemény. :-)
Marad a figyelmeztetés.
Tudtommal a megnyitáskor nem történik verziók közötti konverzió, csak ha másként menti.
Ha a probléma a mentésnél van, akkor a mentést tedd egy command gombra és a beforesave eseményben makróval mentsd el a megfelelő formátumban a filet.
De lehet, hogy már a megnyitáskor van probléma. Ezt lehet kezelni az open eseménybe betett verzió vizsgálattal.
De valóban segíthet egy olyan figyelem felhívás is, hogy ne konvertálja, csak kompatibilis módban nyissa meg. Aztán ha nem tartja be, lehet neki hivatkozni a figyelem felhívásra.
(Azt nem tudom, hogy meg lehet-e akadályozni a konvertálást.)
Ez egy olyan űrlap, amit kiteszünk a honlapunkra, ahonnan az emberek letölthetik, és mindenki azzal tölti ki, amije neki van, aztán e-mailben visszaküldi. Ha én nyitogatnám meg, akkor nem lenne ilyen bonyolult...
Esetleg írjam oda, hogy hagyja meg xls-ben, és ne mentse át xlsx-be, mert akkor elromlik? Ez segít?
Az egyik megoldás lehet szerintem az, hogy a munkafüzet megnyitásakor figyeled az Excel verziószámát és attól függően végignézed az érvényesítéseket.
Úgy gondolom - de csak gondolom -, hogy konverziónál fordulhat elő a nevek behelyettesítése.
A verzió figyelés azért is lehet hasznos, mert az újabb verziókban vannak olyan lehetőségek/tulajdonságok, amelyek a régiekben nem működnek, ezért azokat a műveleteket ajánlatos elkerülni.
Most esik le a tantusz, hogy ez nagyobb probléma, mint gondoltam!
Tud valaki olyan módszert, amivel egy másik munkalapon elhelyezett lista alapján xls munkafüzetben Excel 2000-től 2010-ig megbízható módon működő legördülő listás adatérvényesítést lehet csinálni?
Jobban belegondolva, ha munkafüzetek megnyitása van a ciklusmagban, akkor a DoEvents által okozott lassulás valószínűleg nem is vehető észre.
Én úgy teszteltem, hogy ciklusban felvettem a ListBoxba 2000 UUID-t, és ott a DoEvents kb. kétszeresére növelte a futási időt. De még így is csak 12 másodperc volt, szóval... :-)
Azt lehetne, hogy egy mini adatbázist tárolni egy (rejtett) munkalapon, ahol az egyes cellákhoz tartozó képek elérési útvonala van, vagy inkább rögtön a méretadatok. Abból egyszerűen helyre lehetne állítani a méreteket. Persze egyszer meg kell csinálni a listát, ezt nem lehet el/megkerülni, de aztán már csak karban kell tartani, ami talán nem olyan vészes.
Már csak azt nem értem, hogy az otthoni 2007-es Excel miért tudta eredetileg a negyvenezres dátumokkal is kiszámolni, míg a munkahelyi 2010-es nem; megnéztem, a beállításoknál ugyanúgy (a default) mindkettő.
Szerintem félreérted a feladatot (vagy én értem félre). Arról van szó, hogy adott egy munkalap, amin már eleve vannak képes megjegyzéssel ellátott cellák.
Tehát nem most teszem be a képet, hanem eleve adva van. Ha most tenném be, akkor gyerekjáték lenne a méreteit meghatározni, és a comment szövegdobozát aszerint formázni. De ha már benne van a kép, akkor hogyan szeded ki belőle? Én erre nem találtam megoldást, kezelőfelületen sem, és programban sem. Erre a kérdésre a te ötleted sem válasz.
Akkor viszont a worksheet calculate eseményét kell kihasználni:
Private Sub Worksheet_Calculate() If Range("Z1").Value <> Range("H2").Value Then Application.EnableEvents = False Range("F3").Value = Range("H3").Value Range("Z1").Value = Range("H2").Value Application.EnableEvents = True End If End Sub
Ez akkor fut le, amikor a munkalap adatai újraszámolódnak.
Viszont nekünk csak akkor kell a folyamat, ha a H2 cella értéke megváltozik. Ezért ezt el kell tárolnunk valahova, erre szolgál a Z1 cella a példában (de bárhova is teheted).
Ha a Z1 értéke nem egyezik a H2 értékével, akkor lefut a kívánt akció és a Z1 értékét is átállítja.
Legközelebb, ha kiváltódik az esemény - újraszámolja a munkalapot - de a H2 cella értéke nem változik, nem fut le az akció.
Ez nagyon állat, működik is, viszont csak akkor, ha én írom át a cella értékét. Egyébként ez a cella egy szummázás végösszegét tartalmazza, aminek az értéke változik a többi munkalap adataitól függően. Valahogy el kéne érni, hogy fusson a makró akkor is, ha egy másik munkalap megváltoztatásának hatására változik meg a folyamat beindítására használt cella értéke. Remélem ez sem bonyolítja túl a helyzetet, mert már majdnem tökéletes!!!
Private Sub Worksheet_Change(ByVal Target As Range) If Not Nothing Is Application.Intersect(Target, Range("H2")) Then Application.EnableEvents = False Range("F3").Value = Range("H3").Value Application.EnableEvents = True End If End Sub
Ezt másold be az adott munkalap kódlapjára.
Ha a bal oldalon kiválasztod a worsheet-et, akkor jobb oldalon megjelennek az események. Itt válaszd ki a Change eseményt.
Ekkor a kódlapon megjelenik a fentiekben nem vastagított 2 sor.
Átrágtam magam az ajánlott könyvön, valamit talán még tanultam is belőle, de hogy új makrót írjak, arra nincs sok esélyem.
Viszont most talán pontosabban meg tudom fogalmazni, hogy mit csináljon a makró. Ha valaki össze tudja dobni, az nagy segítség lenne. Tehát az adott munkafüzet h2-es cella értékének a változására kellene lefutnia és egész egyszerűen a h3-as cella értékét kellene átmásolnia az f3-as cellába. Persze több másolás kell majd, de a többivel talán majd én is tudom bővíteni. Nagy problémám, hogy nem tudom például a kijelöléseket megszűntetni. Valahogy úgy kéne lefuttatni a makrót, hogy ne generáljon smmi más változást beleértve a kijelölések megváltoztatását, egyszerűen csak kerüljön bele a célcellába a másolt cella értéke. Lehet ilyet csinálni?
Rögzítettem egy makrót, majd itt-ott töröltem belőle.
A lényeg, hogy behívom a képet, elteszem a 2 méretét 1-1 változóba, törlöm a képet.
Beszúrok egy megjegyzést, ehhez az előbb tárolt 2 méretet rendelem, majd be(le)szúrom ismét a képet. Itt nem foglakoztam a képernyőfrissítés tiltásával és engedélyezésével. Kicsit kacifántos módszer, de működik.
Teheted ciklusba, ha az egyes képek útvonalát és nevét előbb tároltad az egyes sorokban.
Sub Rögzítés1() Dim magassag As Double, szelesseg As Double ActiveSheet.Pictures.Insert("E:JpgLóÁtló.jpg").Select Selection.ShapeRange.LockAspectRatio = msoFalse magassag = Selection.ShapeRange.Height szelesseg = Selection.ShapeRange.Width Selection.Delete Range("A1").AddComment Range("A1").Comment.Shape.Select True Selection.ShapeRange.Height = magassag Selection.ShapeRange.Width = szelesseg Selection.ShapeRange.Fill.UserPicture "E:JpgLóÁtló.jpg" Range("A1").Comment.Text Text:="" End Sub
Nagyobb berendezéseket gyártottunk, amiknek az állapotáról havonta kellett tájékoztatni a vezetőséget. A munkaszámokat tartalmazó cellákhoz megjegyzésben csatoltam a berendezések aktuális állapotáról a felvételeket. Szerintem nagyon hasznos funkció.
Arra is jó, hogy pl. az ügyfelek fotóját tegyük a megjegyzésbe. A nevek kiesnek a fejemből, de egy fotó sokat segít az azonosításban.
"Jelenleg azt gondolom, hogy rövidebb időbe fog telni neked megcsinálni az átméretezéseket manuálisan, mint nekem az, hogy erre programot eszkábáljak össze, úgyhogy átengedem a megoldás lehetőségét."
Sajnálom az elvesztegetett idődet, nem kitolásból tettem fel a kérdést hanem, mert több szem többet lát, hátha valakinek semmiség az ami nekem lehetetlen.
Manuálisan átméretezni? Már megfordult a fejemben de visszatart az, hogy valaminek a hatására (más szempont szerinti rendezés, törölt sor, stb...mittudomén) a képek méretei megváltozhatnak (ez már megtörtént, ezért vagyok itt) és akkor oda a belefektetett idő. Ilyenkor jönne jól egy makró, mely néhány másodperc alatt elintézné a problémát. Persze ha lehetetlen, akkor mást kell kitalálnom.
Inkább tenném mellé egy külön cellába, hogy állandóan láthassam. :-)
Az én felfogásom szerint a megjegyzés csak olyasmire való, aminek nincs "üzemszerű" helye a táblázatban, nem funkcionális és csak a cellák kis részénél használjuk. Elég visszafogottan érdemes használni. De persze ez vitatható egyéni állláspont.
Amit írtam ötletet az működik, egy dologra kell vigyázni:
A megjegyzés szerkesztésénél a méret fülön levő dolgokat nem szabad piszkálni. (Érdekes módon ott engedi az eredeti méret és a rögzített arány bejelölését is, ezeknek jelöletlennek kell lenni).
Egyébként, ha programból szúrod be a képeket, akkor úgyis megtudod a méretet is.
Már elcs.sztem vele 4 órát eredmény nélkül. Most nincs több kidobni való időm.
Annyi bizonyosnak tűnik, hogy az objektum nem publikál semmiféle fogódzót, amivel a megjegyzés hátterének beállított kép tulajdonságait le lehetne kérdezni. Talán valami Windows függvénnyel meg lehetne ragadni, de erre sem találtam semmi értelmes tippet.
Jelenleg azt gondolom, hogy rövidebb időbe fog telni neked megcsinálni az átméretezéseket manuálisan, mint nekem az, hogy erre programot eszkábáljak össze, úgyhogy átengedem a megoldás lehetőségét.
Ha jól sejtem, ez egy makrórögzítővel felvett makró. Így soha nem fog menni, mert a szövegből oszlopok funkció csak egy határoló karaktert kezel.
De ha ugyanezt elkezded elölről több lépésben, pl. a makrórögzítés közben először csinálsz egy globális cserét (két szóközből valami nem használt karakter, pl. | vagy @, mindent cserél), majd az így bevezetett határolójel szerint bontasz, akkor sikerülni fog.
Lehet még turbózni a felesleges szóközökk törlésével is.
Köszi, mondanám, hogy ezért írtam oda zárójelben, de sajnos nem így van. (Aztán meg hiába is vettem volna észre, szerkeszteni meg nem lehet a hozzászólást...ja, hogy ezért van az előnézet.)
Tudna valaki segíteni abban, hogy egy stringből készített oszlop határoló karaktereit hogyan tudnám megváltoztatni. Az a problémám, hogy kettő, vagy több szóköz esetén kellene új oszlop.
például:
M 8 HIT-V M8*80/65 8 8.8 HILTI 0.00kg
Ezt a lenti kódot próbáltam, de nem sikerül. Mindenképpen egy szóköz, vagy egymásutáni szimplán szereplő szóközök esetén teszi új oszlopba.
Már vagy egy hónapja próbálkozom készíteni rögzítéssel vagy szerezni egy olyan makrót, mely MSO 2003 Excelben a kijelölt cellákban a képet tartalmazó megjegyzés esetén beállítja a kép eredeti méretét. Ennyi! Ha ez egyáltalán lehetséges? Korábban találtam egy angol nyelvű topicot, ahol angolul már kérte ugyanezt valaki de ott nem tudták megoldani. írt mindenki mindenfélét de erre nem volt megoldás pedig olyan egyszerűnek tűnik.
Most már csak azt nem értem, hogy NPW-nek hogy-hogy nem tűnt fel, hogy a dátumtranszformációja utáni x^123-mal kapott Linill-je nem a harmadfokú polinomé.
Van egy macro...fut fut...majd a végén felteszek egy kérdést. Ha a válasz nem, akkor kilépek a macroból, ha igen, akkor újra kéne magát indítani...
Ezzel vagyok gondban. Hogyan tudom újra indítani a macrot a macro végén egy feltételhez kapcsolva?
Eddig ezt csináltam....működik a kilépés, de nem tudom elindítani újra önmagát...
Tudtok segíteni esetleg?
Előre is köszi!
Sub Masodfoku1()
.
.
.
.
Choose = MsgBox(prompt:="Kér új számolást?", Buttons:=vbYesNo) If Response = vbYes Then DoCmd.RunMacro "Masodfoku1" Else ' The no button was selected. Exit Sub End If
Másrészt, ha csinálsz egy próbát a lin.ill függvénnyel, akkor azt látod, hogy az x a 123-on -ra azt írja ki, hogy #szám, majd az egészre azt, hogy #érték, mert a #szám bemeneti érték nem megfelelő az x értékekre.
Tehát még akkor is jön az #érték hibaüzenet, ha tömbképletként van bevive egyébként.
A szűrt listából szerintem sehogy se akard eltüntetni a már nem x-ket, mert aki kimaradt belőle, az már nem tud visszakerülni.
Amit te akarsz szerintem, azt egy új szúréssel tudod elérni. Ehhez átírhatod a kritériumtartomány első celláját, ahogy Fferi javasolta, vagy megcsinálod az én indexes oszlopaimat, de az irányított szűrés helyett alkalmazhatod a normál szűrést is az új nap oszlopát választva.
Köszi a segítséget, sikerült kiszűrni őket, meg is van mindenki akinél x van. Már csak az az egyetlen kérdésem lenne, hogy ha változik a beosztás akkor hogyan tudom automatizálni, hogy akinél már nem x van azt eltüntesse a szűrt listából, vagy akinél megjelenik az x azt belevegye; frissítse a listát?
A Munka1 táblázatodnak nincs fejléce. úgy elég nehéz szűrni.
Meg azt sem írtad meg, hogy melyik napra akarod elvégezni a szűrést.
Ha a naponkénti munkavégzőket akarod listázni, akkor azt javaslom, hogy miután megcsináltad a fejlécet, a táblázat mellé tegyél még 2 oszlopot. Az első a névoszlop, a második pedig a vizsgálandó napé lesz. És ezekbeaz index függvénnyel hozd ki a neveket meg az adott napot. Majd erre a 2 oszlopra szűrjél
Most támadt egy eszement ötletem. Mint anno SK-nak, aki rájött hogy a magyar excel a magyar abc kettős betűit 1 betűnek látja, szemben a vba-val, amelyik nem.
Szóval én el tudom képzelni, hogy a 2010-es excel a dátumfomákból való számolásnál dátumformában akarja kiírni az eredményt, amiknél azonban már értelmezhetetlenek a baszomnagy számok.
Kösz!. Megjött. Studiroznom kell, ami számomra nem olyan eccerű. Ugyanis ez az én egyik szűk keresztmetszetem. A térlátás. Egyetlen tantárggyal nem tudtam megbarátkozni a gimis éveim során, az ábrázoló geometriával. És beugrik a matek érettségim is, amikor a 4 feladatból 3-mal negyedóra alatt végeztem, de a negyedikkel meg még azóta is küszködöm. Mert abban egy forgástest felszínét és volumenét kellett kiszámolni, ami elég bajos, ha az ember a forgástestet nem látja, nem tudja elképzelni. És így vagyok ezekkel a kurva márixokkal is. A 2 dimenziósak még csak-csak, de a többdimenzósoknál teljes sötétség. De talán sikerül megértenem :))))
Nézd meg az adatérvényesítést az adott oszlopra. Mert azt kizártnak tartom, hogy a munkalapok alapból korlátoznák 40.000^3-nál nagyobb számok használatát.
Bocsi, de mi értelme van 2013-at, mint dátumot négyzetre és köbre emelni egy regresszió számításnál?
Az A megoldás az, amit csináltál (már ha jól értettem, hogy a kezdődátum az adatsor első dátuma).
Ilyenkor simán az 1,2,3,.... értékeket kell x-nek felvenni, hiszen az y adat nem az évszám nagyságához korrelál, hanem az egymás utáni adatok összefüggését (trendjét) szeretnéd megtudni.
Tedd be a ciklusba az alábbi utasítások valamelyikét:
DoEvents
vagy
Me.Repaint
Azzal azért számolj, hogy ez meg is lassítja a kód futását. Esetleg érdemes lehet a cikluson belül egy számlálót futtatni, és pl. minden tizedik, huszadik, vagy századik ciklusvégrehajtásnál használni a fenti parancsok egyikét.
A legegyszerűbb megoldás, ha ráteszel a fejlécre egy szűrőt, és rászűrsz az x-re, aztán esetleg az eredményt ki is másolhatod egy másik munkalapra, és utána kikapcsolhatod a szűrőt.
Megírtam egy makrót EXCELL-ben. A makró tartalmaz egy FORM-ot (listbox, labelek, parancsgombok - commandbuttonok). Az egyik parancsgombra való kattintás után generálok egy DO ... LOOP ciklust, amelyben sorra megnyitok adatfájlokat (.xlsm), néhány adatot elhelyezek a form listboxában és labeljein, az adatfájlt bezárom, majd folytatom a ciklust.
A gondom az, hogy a FORM-on elhelyezett adatok a ciklus folyamán nem jelennek meg folytonosan, csak a ciklus befejezése után egyszerre.
A kitevő mátrixban ha a -t átírom ;-re, hibát jelez. Viszont a -k közé írt számokat tetszés szerint módosítgathatom, adhatok hozzá újakat, elvehetem, azt nem bánja.
Nem sikerült megoldanom. Nálam el se fogadja a becopyzott képletet, a Beirt képlet hibás üzenettel, és a hibakurzor rááll a kapcsoszárójeles kitevőkre. ?????
A 23165-ben már megírtam. A mintapéldában a számok tizedesvesszősök voltak, én meg tizedespontot használok. Így aztán az excelem stringnek értelmezte a súgópélda tizedeszámait. Amit a LIN.ILL nem fogad el.
A Lin.ill 2007-es súgója megegyezik a 2003-aséval. És mivel a 2003-as hálistennek kevésbé okos mint a 2007-es, azon jöttem rá, hogy a súgó péda becopyzása miért nem müködik a 2007-en sem :)))).
Ez kedves, de túlzás. Na jó, makró oldalról talán igaz, de a táblázatkezelő furfangjait szerintem legalább olyan jól tudjátok, mint én. Vagy még jobban.
Stimmel. A táblázatomban névvel volt megadva a tartomány, ez 2007-ben működött is.
Majd amikor megkaptuk ajándékba ezt a csodálatos 2010-est, akkor elromlott az egyik nagyon fontos táblázatom, és kiderült, hogy a 2010 öntevékenyen lecserélte a nevet cellahivatkozásokra, ráadásul $ jel nélkül, tehát csak az oszlop legfelső cellájában működött normálisan, és a kollégák néhány napig nem tudták rendesen használni ezt az alapvető táblázatot. Itt is ez történhetett.
Tehát a megoldás két részből áll:
1. A régebbi verzióban létrehozott adatérvényesítésekhez az első megnyitás után újból hozzárendelni a nevet (hátha így már békén hagyja, és nem kell minden alkalommal újra megtenni).
2. Rendkívül csúnyákat gondolni arra a "programozóra" (opcionálisan az édesanyjára), aki ezt a viselkedést beletervezte.
Mi az a KIMETSZ a 2010-ben? Konkrétan az érdekel, hogy egy régebbi függvény átnevezése-e? Merthogy egyszer csak felbukkant egy táblázatomban a 2010 telepítése után, pedig sose láttam.
A másik érdekes az volt, hogy az xls táblázatom mentésekor nyivákolni kezdett a 2010, hogy az egyik munkalapom az adatérvényesítés egy másik munkalapról veszi a megengedett értékeket, és ez funkcióveszteség, mert a 2003 ilyet nem tud. Ami pedig konkrétan hazugság, és a 2007 nem is reklamált érte.
Szerintem mi ketten együtt már egészen jól tudjuk az Excelt. Azt vettem észre, hogy egy csomó mindent tudsz, amit én nem, és fordítva is. Persze Jimmy valószínűleg többet tud, mint mi ketten együtt.
Sajnos a 2010-es excel problémában nem tudok segíteni. Így a 2010-ben kénytelen leszel a 23121 hsz szerinti polielo udf-függvényt használni, természetesen 9. pont-beli For -jának a javításával, ahogy azt pár hsz-szel később megírtam.
Mind a két helyen magyar Excel van, csak a verziószám 2007/2010 különbözik.
Ami a kérdésedet illeti: csak simán kimásoltam az ausztrál oldalról, ahol találtam, és utána továbbmódosítottam (a képlet zárása a szokásos ctrl+shift+enter kombinációval), ezzel nem volt gond.
De valahol itt lehet a probléma, mert a 2007-es {1.2.3}-nek írja, és jól működik, míg a 2010 {123}-nek nyitja meg ugyanazt, és nem jó.
Csak nem tudom, ezt hol lehet korrigálni, a beállítások között nem találtam.
"B" oszlop csak szöveg. Képlet, számadat csak C-D-E oszlopra vonatkona. Megtévesztő lehetett, hogy a kérdések mellé az adható pont értékét írtam be, pedig pont az ellenkezője volt a cél, hogy jobban személtessen.
És a nyolcadik utast sokan hetedik utasnak hívják, mert nullától szokás számolni. Tehát a jobb szélső bit jobbról a nulladik...
A legmagasabb helyiértékű bit annyiban helytálló, hogy bármely egészt tekinthetünk előjel nélkülinek, és akkor tényleg az a legmagasabb helyiértékű; az meg nem magában a számban rejtőzik, hogy előjeles vagy sem, hanem az értelmezésen.
Ha egy kupac számot elmentesz és nem mondod meg hozzá az adatszerkezetet, akkor amúgy sem lehet rekonstruálni az értéküket. (Hány bitesek? Big vagy little endianként tárolódnak? Vagy BCD-ben? Előjelesen vagy sem?)
Ezt azért pontosítsuk: negatív az a szám, amelynek az előjelet jelző bitje 1.
Ez pedig nem lehet a szám legmagasabb helyiértékű bitje, hiszen akkor honnan tudnád, hogy -2 vagy a 3. amit ábrázol.
Az előjelbit pedig a jobbról számított 8. bit (ami annyiban legmagasabb "helyiértékű", hogy nem előjeles ábrázolásnál ezen a biten van a legmagasabb hatványhoz tartozó érték).
Ugyanazt a számot tekintheted előjeles és előjel nélküli egésznek is. Maga az 11111111 nem egyértelmű, ha nem rendeltél típust hozzá. A legtöbb nyelv ismeri a "signed int" és "unsigned int" típusokat ugyanannyi biten (bár ez éppen C-s megnevezés). Viszont ha -1-nek tekinted, az bitszámtól függetlenül minden egész típusra jó lesz, ha meg előjel nélkülinek, az 8 biten 255, 16 biten 65535 stb. A -1 meg örök és megbonthatatlan. :-)
Előjeles: -128 - +127
Előjel nélküli: 0 - +255
stb. több biten is.
Egyébként az előző hozzászólásomban az az érdekes, hogy beírás közben jöttem rá magam is. :-)
Hm. Nem tudtam. Igaz, vba-ban sosem használtam. Viszont most esett le a tantusz, hogy retro image miért írt egy régi hozzászólásában valami ilyesmit: a=-(b=c) *d. Kösz.
Régi BASIC-es hagyomány az igaz értéket -1-nek venni. Ennek az az alapja, hogy ha egy byte-ot (szót stb.) feltöltünk csupa egyes bittel, akkor a kapott szám előjeles egészként -1-nek felel meg. Vagyis ez az a szám, amelyiknek minden bitje 1 (és így pl. a bitenkénti logikai műveletekben is feltétlenül igaz értékként viselkedik).
Az igaz viszont a munkalapon = 1, VBA-ban pedig = -1.
Próbáld ki a VBA-ban a True * 1 kifejezést. Eredmény: -1.
Csak nyilván, nagyon ritkán "számolunk" vele, inkább használjuk a logikai "értéket". Pedig, mint az adott példa mutatta, egyszerűbb is lehet a képlet esetenként, ha számnak tekintjük.
Apropos: Hogy-hogy nem ugyanaz a szám van rendelve az igaz/hamis-hoz a vba-ban és a munkalapon? Én idáig abban a hiszemben voltam, hogy a hozzárendelt számok mindkét helyen 1 és 0.
Meg lehet. De attól függően, hogy mik az érényesítés feltételei, lehet egyszerű vagy komplikált. Lehet, hogy simán alkalmazható az excel Adatok/érvényesítés parancsa, de lehet, hogy önmagában nem elég, és makrót kell az érvényesítéshez írni. Ezért első lépésben nézd át az említett parancsot, és ha az nem elég, akkor írd meg a konkrét előírásaidat.
Fferinek igaza lehet. De nem csak az excel nyelve lehet eltérő a két gépen, hanem a területi beállítások is. Írtam a korábbi hsz-emben, hogy hiába copy pasteltem be a Lin.ill súgó mintapéldáját, az én gépemen nem működött. Azóta rájöttem, hogy miért nem. Hát azért, mert a súgó példa magyarított példa volt, tizedesvesszővel. Én meg a saját gépemen tizedespontot használok. Így mintapélda tizedesvesszője miatt az excelem néhány számot stringnek értelmezett, amit a Lin.ill nem akceptál. Nos ilyen banális beállítási hibákra is vadásszál.
De hagy kérdezzem meg újra: hogyan kell a kitevőket kapcsos zárójelbe tenni?
Van egy kérdőív, ahol a válasz legördülő listából "igen" és "nem" lehet.
Értékelésnél adott válaszoknál az "igen" válasz érhet 1 vagy 2 pontot kérdéstől függően, a "nem" mindenhol 0 pontot ér.
Cél, a listából kiválasztott "igen" választásánál a kérdéshez tartozó 1 vagy 2 ponttal számoljon a táblázat, "nem"-nél 0 ponttal a mellette levő oszlopban.
Próbáltam képletek / definiált nevek / kijelölésből új opciót, ahol volt a listában
"igen" - "igen." - "nem" , Hozzárendelt számok 1-2-0.
Viszont, választás után mégsem tudta számként értelmezni a mellette levő eredmény oszlop.
Lehetséges ezt kivitelezni valahogyan?
A választ előre is köszönöm, képet csatoltam róla.
Ami az ékezetes változókat illeti én már beleütköztem a problémába. Idén egy bő fél éven át egy tagnyilvántartó programot írtam. Ez zömmel interaktív, amit userformokkal oldottam meg. Aztán amikor a program egy angol nyelvű office-t használó kollégám kezébe került, előjött, hogy nem fut a progam. Pontosabban Lost Visual Basic project hibát jelzett. És néhány nap kellett, míg kiderítettük, hogy a hibát a Userformok és a rajtuk elhelyezett ékezetes objektumok okozták. Ezeket néhány órás munkával kijavítottam, szerencsére a függvények és változók nevével nem volt gondja az Excelnek.
Szóval igazad van, és rossz szokásom, hogy használom a kódban az ékezeteket. Lám hová vezet a féktelen nacionalizmus:-))) Még szerencse, hogy nem rovásírást használtam:-)
Szóval ebben is egy nagy elhatározásra lenne szükségem, hogy ezentúl leszokjak az ékezetek használatáról a programkódokban.
Hogy még szebb legyen, egyáltalán nem kell aktívnak lennie a munkafüzetnek sem:
Az előzőekben leírtak akkor is működnek, ha a
Workbooks(wbnév).Activate
sort kihagyod.
Hiszen ws.parent.name = wbnév. (Azaz a ws munkalapod a wbnév nevű munkafüzetben van!)
Még egy tanács: én abszolut nem használom az ékezetes változókat, mivel nem hordozható. Nem tudhatod, hogy egy másik gépen milyen windows fut. Ha nem magyar, akkor az ékezetes, pláne a két pontos, vesszős betűk jól bekavarhatnak.
Ezt valóban nem tudtam. Egyébként amióta többen leírtátok, magam is kerülöm a select használatát, viszont tartományban történő keresésnél egyelőre nem tudom kiváltani:
Nagyon kevés az olyan művelet, amit csak select után lehet végrehajtani. Általában erre nincs szűkség, "üldözendő" jelenség a kódban. A makrórögzítő utáni kódból ezt kell legelőször kitakarítani. (Meg az olyanokat, mint scroll...)
A select pont az a metódus, ami csak az aktív munkalapon/objektumon működik. Bár erre a help-ben nincs utalás, nagyjából logikus, hogy csak azt választhatod ki amit látsz. (A makró rögzítő ugye teleszórja select-tel meg activate-val a kódot, hogy megmutassa, mit is csináltunk, de ezt nem kell utánozni a vba kódjainkban.)
Ezért is írtam, hogy az értékadás működik akkor is, ha nem aktív munkalap egyik szereplője sem. A copy is működik így. Tehát azt kell végig gondolni, hogy melyik utasítás az, amelyhez feltétlenül kell az aktív munkalap. Erre vagy van a help-ben utasítás, vagy előbb-utóbb kiderül a gyakorlatban.
szuper, eddig működik már csak azt hogy csinálom meg, hogy úgy listázza ki külön, hogy eltüntesse a "duplikációk"? tehát most az 500 soromból lett 700 és szépen ott vannak a tulajdonságok, van amelyikből van 100 is. Mert most ha beírom a darabtelit és végighúzom, akkor ugye ott van a 100 egymás alatti tulajdonság mellett, hogy x tulajdonságból van 100 darab
Mi sem egyszerűbb: Egy teljeles üres munkafüzetben egy modulon a következőt elindítom:
Option Explicit Sub Ellenőrzés() Dim ws1 As Worksheet, ws2 As Worksheet Application.DisplayAlerts = False ' figyelmeztetések kikapcsolása Set ws1 = Workbooks("teszt.xls").Worksheets("Munka1") Set ws2 = Workbooks("teszt.xls").Worksheets("Munka2") ws1.Activate ws2.Range("A1").Select End Sub
Az előbbi hozzászólásomban (23147) adtam útmutatást a B oszlop szétbontására.
"
A B oszlop tartalmát az adatok szövegből oszlopok opcióval szétrakhatod a vesszők "mentén" külön oszlopokba. Utána ezeket az oszlopokat egy oszlopba másolod be egymás alá (az üres cellák is maradhatnak). Majd az adatok, ismétlődések eltávolítása opcióval eltünteted az azonosakat.
Vigyázz, mert "lakás" és "lakás " itt sem egyforma!!!"
Csinálj egy specialis szűrést a Csak az egyedi rekordok megjelenítése opcióval Így lesz egy listád az összes tulajdonságról. Amelyben lesznek olyan cellák, amelyek 1 tulajdonságot tartalmaznak, és lesznek olyanok amelyek többet. A többeket átnézed, hogy szerepel-e a bennük levő összes tulajdonság szólóban is. Amelyik tulajdonság nem, azt önállóan hozzáírod a listádhoz. Ha ezzel kész vagy jöhet Darabteli. Ha mondjuk a tul.listád az A oszlopban van akkor B1-be írod a képletet, majd végighúzod:
=Darabteli(Adatoszlop500;"*"&a1&"*")
Tehát a két jokerkaraktert hozzáfűzöd a keresendő tulajdonsághoz.
ps. A darabteli keresése nem case sensitive, tehát mindegy, hogy kisbetüt vagy nagybetüt használsz.
őőő bocsánat ismét :) nagy volt a szám, és nem gondolkoztam időben...
szóval a darabteli végülis mégse teljesen jó az én esetemben.
Megpróbálom megfogalmazni most már pontosan mi a kínom :)
tehát - az 500 sornál a tulajdonságok kb össze-vissza vannak emberenként.
Nekem mindenképpen át kéne néznem az egészet ennek a függvénynek a használatakor, de erre ha nem muszáj nem kerítenék sort, mert 10 ilyen táblázatom van.
kb így néz ki a dolog (csak táblázatonként 50-100 tulajdonsággal is akár)
a ember - kék, zöld, piros
b ember - zöld, fekete, lila
c ember - kék, zöld, lila, piros
stb.
A függvény használatakor át kéne néznem az összes sort, hogy van-e valahol új tulajdonság, és mindegyikre be kellene pötyögnöm a függvényt.
Van arra esetleg mód, hogy automatikusan kiszedi az összes kifejezést ÉS aztán ezekre a kifejezésekre nyomja rá a darabtelit? Picit még bonyolítja a dolgot, hogy a tulajdonságok között van olyan, ami 2-3 szóból áll, ezzel meg végképp nem tudom hogy boldogulna.
pl - d ember - kék, zöld, piros, bugyi lila, fehér
Ezt is meg kellene néznie, az én drága kis excelemnek, és kilistáznia, hogy kék -10 darab, bugyi lila -11 darab.
Vagy azt se bánom, ha úgy listázza ki, hogy
kék -10 darab
kék, zöld - 2 darab
kék, zöld, piros - 1 darab
Ekkor már az egyértelmű hülyeségeket ki tudnám szúrni, és ami nem kell azt tudnám törölni.
Alighenem elkerülte a figyelmedet a * karakter a példa szó elején és végén. Ez azt eredményezi, hogy akárhol van a keresett szó a cellában, mindig megtalálja.
Nagyon szívás tud ám lenni, ha szóközök vagy nem látható karakterek is vannak a cella értékében, amit szabad szemmel észre sem veszel!
Ezért használom én a joker karaktereket.
A B oszlop tartalmát az adatok szövegből oszlopok opcióval szétrakhatod a vesszők "mentén" külön oszlopokba. Utána ezeket az oszlopokat egy oszlopba másolod be egymás alá (az üres cellák is maradhatnak). Majd az adatok, ismétlődések eltávolítása opcióval eltünteted az azonosakat.
Vigyázz, mert "lakás" és "lakás " itt sem egyforma!!!
szóval arra már rájöttem, hogy a darabteli fix, hogy erre nem használható.
Ha rákeresek a lent említett bazaarvoice kifejezésre, akkor azokat a cellákat megszámolja, amiben CSAK ez van benne, viszont azokat már nem, amik így néznek ki "Bazaarvoice, ForeSee"
Tehát, hogy több tulajdonság is meg van adva.
Na most nekem vagy egy olyan függvény kellene, ami "szétbontja" a cellát és megnézi, hogy adott kifejezés a cellán belül ott van-e, vagy pedig egy olyan megoldás, hogy a vessző utáni dolgot új cellába tegye, és akkor már használható lenne a darabteli.
Most már tényleg csendben ülök és várok, hátha van ötlet :)
Na most valami vagy nagyon nem jó, vagy én vagyok hülye
Beírom ezt - =DARABTELI(A1:A500;"bazaarvoice")
Ki is dob rá szépen 252 találatot, nagyjából stimmel a mennyiség
Beírom ezt - =DARABTELI(A1:A500;"Liferay") (kis és nagybetűvel is próbáltam)
Kidob rá 0 találatot, úgy, hogy LÁTOM, hogy ott van közvetlen mellette legalább 3 (meg ki tudja mennyi még az egész doksiban)
Ugyanezt megjátszottam több más kifejezéssel is. A bazaarvoicera bárhol próbálom jó, meg még 2 másikra, de aztán megáll a tudomány. Próbáltam minden variációban beírni.
Az meg gondolom a program "helyes" működése, hogy szótöredékre nem keres - beírom, hogy voice, úgy már semmi eredmény.
Ez azért nem jó, mert nem csak három-négy fajta tulajdonság van, hanem sokkal több. A házas rész csak példa volt. Lehet, hogy az 500 emberhez van 50 fajta tulajdonság is, így meg ugyanott vagyok, ha kereséssel csinálom. Végig kell néznem akkor az összes sort, mert előfordulhat hogy az 500. embernél új tulajdonság van megadva.
Már kiszedtem egy külön munkalapra az összes tulajdonságot.
Gyakorlatilag az kellene, hogy kilistázza nekem hogy miből mennyi van, anélkül, hogy én nézegetném hogy milyen tulajdonságok vannak.
Használd a darabteli függvényt. A keresendő értéknél léteznek a joker karakterek. Pl. "*kertes*" minden olyan cellát beszámol, amelyben a kertes előfordul.
2010-es excelben kellene a következőt megcsinálnom:
Van 500 sorom, amibe fel vannak sorolva értékek.
500 ember, és mindegyikhez van 1-1 tulajdonság, DE van akinél több mint egy van.
Azt kellene csinálni, hogy megszámolni hogy x tulajdonság hány embernél van jelen.
Amiatt nem tudtam rendesen megcsinálni, úgy hogy simán sorbarendezem tulajdonság szerint, hogy ugye 1 emberhez több tulajdonság is tartozik és ez felsorolással van a cellába beírva.
Pontosítok inkább :) szóval van 500 ember, mellette pedig hogy milyen típusú háza van.
A1 Kiss Béla B1 Panel
A2 Nagy Béla B2 kertes
A3 Gazdag Elek B3 Kastély, kertes, nyaraló
stb, stb
Nekem az kellene, hogy kidobja, hogy kertes - 27 darab, nyaraló - 5 darab stb.
a ws.range(ws.cells(...),ws.cells(...)) szintaktika működik, ugyanakkor a ws.range("A:B"), vagy ws.range("A1:B1") stb. forma továbbra sem akar nekem összejönni aktiválás nélkül.
Szeretném a segítségeteket kérni! Munkám során gazdákhoz járok. Ott adatokat kell kitöltenem a gazdáról. Ezeket összesítenem kell egy táblázatba. Na most egy munkalap egy sor az összesítőbe és ez úgy van megoldva hogy van 150 munkafüzet az embereknek és van egy 151. ami az összesítő.
Az összesítőben ez a képlet van: =INDIREKT("Munka" & SOR()-1 & "!B3") ugye a B3 változik mindig. Fogalmam sincs amúgy mit jelent mert ezt a képletet is itt írták nekem! :D
Gond: Nyitottam egy 152. munkafüzetet ahol más jellegű összesítő van a termékek és azok árai, de ugyanúgy kell a gazdák elérhetősége mint az első 151. en találhat össezítőben, de például a 151. összesítőn a névnél lévő első cella képletét =INDIREKT("Munka" & SOR()-1 & "!B3") átmásolom a 152. névhez tartozó első cellába de nem működik. Tudom egyenlőség jellel is éehet de lesznek más cellák is amit így akarok megoldani.
Hogyan lehet ezt megoldani, hogy működjön akár melyik cellával és mindegyik munkalappal? Régen csináltam ezt és már fogalmam sincs mit csináltam :D Ha kell elküldöma táblázatot is :D Köszönöm!
Az értékadásoknak attól függetlenül kell múködniük, hogy az adott munkalap aktív-e vagy sem. A leírt formában viszont valóban akkor működik helyesen, ha az a munkalap, amiről adatot kérsz, vagy amire adatot írsz, éppen aktív (erre sajnos nem gondoltam - sorry-). De ezt az akadályt kis módosítással el lehet hárítani.
Hogy miért van így, arra egy kis magyarázat:
Az excel minden olyan tulajdonságot, amihez nincs külön hivatkozás, az aktív munkalapon levőnek tekint. Azaz pl. az összws.range(cells(1,1),cells(1,utolsóoszlop)) kifejezést csak akkor tudja valóban értelmezni, ha az aktív munkalap az összws, mivel itt két tulajdonság van -range és cells - és két különböző hely lenne mivel a cells adatokat az aktív munkalapról szeretné venni és ez nem "fér össze" az össws-el.
Ennek elhárítása egyszerű: minden tulajdonsághoz oda kell írni a hivatkozását:
Még annyit kiegészítésül, hogy a ws és az összws munkalapok nem ugyanabban a munkafüzetben voltak. Most nem próbálgattam, hogy azonos munkafüzetben hogyan viselkedne a range parancs.
Ahol a ws és az összws munkalapok, amelyeket dim ws as worksheet formában deklaráltam és set ws = Workbooks(akármi).Worksheets(másikakármi) módon adtam meg.
Az első sor működik, ha egyébként a ws munkalap aktív. A második azonban nálam csak akkor működött, ha kiadtam az összws.Activate parancsot.
Tehát tapasztalatom szerint a range használatához az adott munkalapnak aktívnak kell lennie. Jól látom? Erre vonatkozóan nem nagyon találtam leírást, így hosszas próbálgatás után akadtam rá a megoldásra.
Hát igen, ezeket a "trükkös" jellemvonásokat csak a tapasztalat alapján lehet kiszűrni. Még szerencse, hogy ezeken az oldalakon nagyon sok tapasztalat gyűlik össze.
Én az excellel kapcsolatban semmiben sem vagyok biztos :)))).
Ebben az esetben csak annyit tudtam, hogy az ykorrvekt-t a debug a kép szerint listázta. Ami alapján én oszlopvektornak véltem. Pedig mint most a segítségeddel rájöttem, ha így listázza tömböt, akkor az excel sorvektornak értelmezi. Hát most már ezt is tudom.
Kösz az együttmüködést.
A transpose szintaktikát is köszönöm. Ma nálam is müködött. Tegnap ugyanez nem müködött, de akkor feltehetőleg egyéb hibák miatt.
Érdekes ez a LIN.ILL-es megoldás. De nálam nem működik (2007-es). Nem csak a te polinomialis problémádnál, de már az excel súgó mintapéldájánál sem, pedig azt copy-paste-tal vittem be. De csak #ÉRTÉK hibákat ereményezett. A te képletedben a kitevők kapcsos zárójelét hogy kell beírni? Billentyúzéssel? Meg azt sem értem minek kell transzponálni?
Ja és még valami! A felrakott polielo függvényemben maradt egy sajnálatos hiba, ezért a jelenlegi formájában csak a negyedfoku polinomot számolja ki. A javítása elég egyszerű. Az állandó kiszámításánál (9. pont) A For i=1 to 4 helyesen: For i=1 to fok.
Hát bár úgy néz ki, hogy igazad van, de a feltett udf-ben valami speiális probléma lehet Ugyanis a
'bisvekt = Application.WorksheetFunction.MMult(xikorrmtx, ykorrvekt) utasítás S4O1=S4O4*S4O1 szerkezetű aminek müködni kéne, de nem müködik,
míg a bisvekt = Application.WorksheetFunction.MMult(ykorrvekt, xikorrmtx) pedig S4O1=S4O1*S4O4 szerkezet, aminek nem lenne szabad müködnie, és mégis müködik. ????
A matrix is és a vektor is For next-tel lett feltöltve.
***********
Javasoltad a tanspose-t. De nem megy. A vba tömbök transponálásának mi a szintaktikája?
"Csak" annyi a probléma a matrix szorzásnál, hogy a matrix műveleteknél nem mindegy balról vagy jobbról szorzod a mátrixokat!
Hogy ismét az Excel helpet idézzem:
"A tömb1 oszlopai számának egyeznie kell a tömb 2 sorainak számával és mindkét tömb csak számokból állhat."
Az első esetben a 4S*4O mátrix szorozható az 4S*1O mátrixxal (eredmény 4S*1O), de az 4S*1O mátrix nem szorozható a 4S*4O matrixxal.
A második esetben szintén arról van szó,hogy a két egy oszlopból álló mátrix (azaz vektor) nem szorozható direktben össze. A szorzáshoz a második mátrixot transzponálni kell (Transpose függvény!) és akkor kapsz egy egy elemű mátrixot (skalárt) eredményül.
Ez kiadja a harmadfokú egyenlet kitevőit, amivel megkereshető az új x-hez tartozó y.
Viszont ennek kapcsán 2 további érdekességre bukkantam.
1/Ez csak 2007-es Excelnél működött (itthon ilyen van), 2010-essel valamiért nem (munkahelyen olyan van). Tudja valaki, mi lehet az oka? (ja és az utolsó mátrix 2010-ben: {123}
2/A képlet csak akkor működik, ha minden x és y érték megvan. Ugyanakkor ha kitörlök néhány x-et vagy y-t, akkor a grafikonon megjelenő egyenlet továbbra is működik. Kiváncsi lennék, ott hogyan számolnak.
Bár Jimmy szenzációs makrójával a diagramról is le tudod venni polinomialis egyenletet, úgy gondoltam, hogy ha már belekezdtem, be is fejezem a polinomialis illesztes makrósítását. Sokat tanultam közben. Neked meg felteszem ide a polinomialis összefüggés forecast fuggvényét polielo() néven.
=polielo(a,b,c,d), ahol
a: x, aminek a párját keresed
b: x adatok tartománya
c: y adatok tartománya
d: a polinomiális egyenlet foka
Fontos: A függvény moduljat Option Base 1-re állitsd.
A függvényt az Immediate ablakban ellenőrizheted, mert oda beírja az együtthatókat és az állandót, így azokat összevetheted a diagramon szereplőkkel.
A makróban van 2 kikommentelt piros sor is. Matrixmüveletek amik nem müködtek. Hátha lesz itt valaki olyan okos, aki meg tudja magyarázni, hogy mi velük a probléma.
For i = 1 To wsac ''wsac: adatparok szama x(i) = b(i) y(i) = c(i) Next i
''2.xkorrmtx kitoltese For i = 1 To fok For j = 1 To fok For k = 1 To wsac tmb1(k) = x(k) ^ i tmb2(k) = x(k) ^ j Next k xkorrmtx(i, j) = Application.WorksheetFunction.Correl(tmb1, tmb2) Next j Next i
''4 ykorrvekt kitoltese For i = 1 To fok For k = 1 To wsac tmb1(k) = x(k) ^ i tmb2(k) = y(k) Next k ykorrvekt(i) = Application.WorksheetFunction.Correl(tmb1, tmb2) Next i
''5 bisvekt (bi standardizalt regrkoef) kiszamitasa
''bisvekt = Application.WorksheetFunction.MMult(xikorrmtx, ykorrvekt) EZ MIÉRT NEM MÜKÖDIK, ha az alatta levő igen. Az xkorrvekt(4), a xikorrmtx(4,4) dimenzójú
''5 kovarvekt es Ykovar For i = 1 To fok For k = 1 To wsac tmb1(k) = x(k) ^ i tmb2(k) = x(k) ^ i Next k kovarvekt(i) = Application.WorksheetFunction.Covar(tmb1, tmb2) Next i
For k = 1 To wsac tmb1(k) = y(k) tmb2(k) = y(k) Next k Ykovar = Application.WorksheetFunction.Covar(tmb1, tmb2)
''6 kovarvektor módosítasa For i = 1 To fok kovarvekt(i) = (Ykovar / kovarvekt(i)) ^ (1 / 2) Next i
''7 bivektor (polinomialis regr. koeff) For i = 1 To fok bivekt(i) = bisvekt(i) * kovarvekt(i) Debug.Print bivekt(i) Next i
''8 xavgvekt és Yavg
For i = 1 To fok sumi = 0 For k = 1 To wsac sumi = sumi + x(k) ^ i Next k xavgvekt(i) = sumi / wsac Next i
sumi = 0 For k = 1 To wsac sumi = sumi + y(k) Next k Yavg = sumi / wsac
''9 allando ''allando = Application.WorksheetFunction.MMult(xavgvekt, bivekt). MIERT NEM MUXIK ???? Kénytelen voltam For-next-tel kiváltani. Mindkét vektor 4 elemű. sumi = 0 For i = 1 To 4 sumi = sumi + xavgvekt(i) * bivekt(i) Next i allando = Yavg - sumi
Debug.Print allando
'' 10 elorejelzes sumi = 0 For i = 1 To fok sumi = sumi + bivekt(i) * a ^ i Next i
Amíg az Excel "szerkesztés" üzemmódban van, nem lehet megváltoztatni makróval a munkalap tartalmát. Márpedig a függvény beírásakor szerkesztés feliratot látsz a statusbaron. Ha csinálsz egy kis próbát a worksheet change eseménnyel, kiderül, hogy az csak akkor kezd lefutni, ha már a függvényed lefutott.
Ilyen esetben még a VBA szerkesztő sem működik. Én már többször jártam úgy, hogy egy munkalapon belekattintottam egy cellába, majd utána átváltottam VBA-ra és az "istennek" sem akarta bevenni, amit írni szerettem volna.
Tisztára hülyét kaptam excel udf készítéskor. Segítséget kérnék, mert anélkül hamarosan begolyózok. Az alábbi 3 makró közül a makro2 a makró1-ből indítva gond nélkül lefut. Azaz a kijelölt Munka1!A11:B28 tartományt szépen másoja.
A másolandó tartományt azonban fgv-nyel kijelölve krach.
A Munka1!B30-ban levő függvény csak az első 3 lépést hajtja végre normálisan, a többit nem
A kikommentelt Copy bekapcsolva sem másol
A bekapcsolt wsaa értékadás sem müködik, ráadásul a makró futását is leállítja
A kikommentelt wsaa esetén a makro2-t ugyan meghívja, de nem hajtja vége az abban előírt másolást, és nem lép vissza a fgvmakróba.
Hogyan van ez?
**************
Option Explicit
Dim wsp As Worksheet, wsa As Worksheet, wsaa As Range, wsaacim$, wsaasor
köszi, ez jónak tűnik elsőre, DE az a bajom már csak vele, hogy függvényként menti el.
ezt a fájlt fel kellene töltenem aztán máshova, viszont így, hogy függvényként van, így nem tudja értelmezni, mert azt látja hogy =A1$B1, nekem meg az kéne hogy 001.JPG legyen.
Ha arra nyomok, hogy szövegként illessze be, akkor viszont leveszi a .JPG-t
Ha megfigyeled, a 1,81898940354586E-12 az kísértetiesen egyezik 2-39 értékével.
Valószínűleg a lebegőpontos számábrázolás törtrészének legeslegutolsó bitjében van az eltérés. Nem hiszem, hogy ez kerekítési hiba lenne, hanem inkább konverziós. Nem tudom, pontosan mi van a háttérben, de rémlik valami, hogy az op. rendszer minden számot először 32 vagy 64 bites egésszé konvertál, és csak utána tud vele dolgozni. Aztán az eredményt visszakonvertálja az eredeti típusba. Ez a probléma nem VBA eredető, és nem is korlátozódik erre a programnyelvre. A kerekítésnél jobb megoldást én sem találtam még. (Ettől még lehet, hogy van.)
A trendvonal egyenletét programmal is le lehet olvasni a diagramról, és azt némi sztring-bűvészkedéssel vissza lehet fejteni. Pl.:
Sub Polinom() Dim ch As ChartObject, Képlet As String Dim Együtthatók_száma As Long, Együtthatók() As Double Dim s As String, pos As Long
Set ch = Worksheets("Munka1").ChartObjects("Diagram 1") With ch.Chart.SeriesCollection(1).Trendlines(1) .DisplayEquation = True .DisplayRSquared = False Képlet = .DataLabel.Text End With Együtthatók_száma = 0 ReDim Együtthatók(Együtthatók_száma) Do s = Trim(Mid(Képlet, InStrRev(Képlet, " "))) Együtthatók(UBound(Együtthatók)) = s If InStr(Képlet, "x") = 0 Then Exit Do pos = InStrRev(Képlet, "x") Képlet = Left(Képlet, pos - 1) Debug.Print Képlet Együtthatók_száma = Együtthatók_száma + 1 ReDim Preserve Együtthatók(Együtthatók_száma) Loop End Sub
A piros sort azért emeltem ki, mert lényeges, hogy az R-négyzetet ne jelenjen meg a diagramon (vagy legalább ideiglenesen tűnjön el). Ellenkező esetben az is benne lesz a leolvasott képletben, és félreviszi az együtthatók visszafejtésének algoritmusát.
És még kiegészítésül kérdezem, hogy mi a helyes megoldása a problémának? Egyelőre azt tettem, hogy összegzéskor, minden egyes új adat hozzáadásakor az eredményt 10 számjegyre kerekítettem. Talán többre is lehetett volna, ha nagyobb számaim lennének, de az adott példában megfelelt, ez is. Viszont nem hiszem, hogy valóban ez a megfelelő megoldás a kerekítési pontatlanság kivédésére.
Ez az egész azért volt zavaró, és azért derült ki, mert a program egy bizonyos pontján teszteltem, hogy az adott összeg 0-e, és csodálkozva láttam, hogy a program néha nem hajtja végre azt a feladatot, amit a nulla összegű tételeknél meg kellene tennie.
Valóban körbe néztem a neten, és a legértelmesebb tanács, amit találtam, az volt, hogy rajzoltassam meg a trendvonalat, és másoljam ki az x együtthatóit.
De rejtély, hogy miért nincs alapból egy ilyen függvény az excelben, amikor a grafikon trendvonala akár a 6-od fokú polinomot is kiszámolja???
(Ha én írtam volna az Excelt, akkor az ELŐREJELZÉS függvény egy ELŐRJELZÉS.POLINOM lenne, egy új argumentummal, ahová beírom a polinom fokszámát. :-) )
Hogy milyen trendekre van szó? Ha ez ember egy elnyújtott N betűre gondolunk: egyszer fel, egyszer le, egyszer fel...
Elolvastam, köszi, de őszintén szóla nem értem, nagyon pongyolán van megfogalmazva... :-(
Az még hagyján, hogy felcseréli az x/y értéksorokat a lenti példához képest, de hogy lehet trendet számolni B-D és A között (úgy, hogy az működjön is)?
Ezt inkább NPW-tól kellett volna megkérdezned. Ő akar polinomiális összefüggés alapján előrejelzéseket készíteni. Ezek értelmességéről a véleményem teljesen megegyezik a tieddel. Írtam is NPW-nek lejjebb. Én csak az ő kérdésére/kérésére bonyódtam bele ebbe a problémába. És ha már belekezdtem, valahogy végigviszem. A terveim szerint hamarosan meglesz a polinomiális függvények előrejelzésére alkalmas udf. Aztán hogy ez mennyire hasznos, az már legyen NPW gondja. Egyébként utána néztem a neten, nincs egyedül. De a többiek is csak olyan tanácsokat kaptak, hogy a diagramról manuálisan vegyék le az együtthatókat. És szerintem ez az igazán érdekes ebben a problémában. Hogy mi lehet a magyarázata annak, hogy az excel kiszámítja az együtthatókat, hozzáférhetővé is teszi őket, de megnehezíti az elérhetőségüket? Szerinted?
Egy újabb meglepetés: Programciklusban összegzem a következő számokat: -1,-14999,-2419.24, 1, 14999, 2419.24. A változók, amibe olvasom, és amibe összegzem egyaránt double típusúak.
Az eredmény 0 kellene, hogy legyen, erre a program 1.81899E-12 értéket hoz ki.
Kipróbáltam az összegzést az immediate képernyőn a
Elég régen próbáltam már küldeni, de úgy látszik a Windows Live "tartalékolta" és most egy szuszra kinyomta az összes eddig el nem küldött levelet - amit egyébként én már el is felejtettem -, biztos nagyon megörült, hogy végre el tudta érni a gmail-es fiókomat....
Van szerintetek valami egyszerű módja, hogy az excel A oszlopában található adatokat beillesszem egy sima netes űrlapba? Vagyis, hogy minden cella után valahogy automatikusan "nyomjon" egy TAB-ot?
Csak kíváncsiságból: milyen természetes folyamat írható le harmad- vagy magasabb fokú polinommal? Én viszonylag sok függvényt illesztettem már, de magasfokú polinomot csak szórakozásból. Van bennem némi kétség, hogy ezek felhasználhatók-e egyáltalán előrejelzésre...
A lineáris trenddel nincs probléma, mert annak a paraméterei a munkalapról is elérhetők. De a többi trendtípusé csak a diagramra kerülnek rá, tehát ha tovább akarsz velük számolni, be kell pötyögni őket, már amennyiben nem tudod őket linearizálni. Márpedig egyre inkább úgy látom, hogy a polinomiálisakat a többtaguságuk miatt nem lehet. Igy marad a pötyögés, vagy a makró és az udf.
Valahol a trendlines method környékén érdemes keresni a helpben. Egyébként bő két éve készítettem programból grafikonokat. Azokra ráírattam a programmal az egyenletet is. Igaz, csak lineáris trenddel foglalkoztam. Nagyon sok grafikon volt egy-egy munkalapon, ezért kellett a program. A lényeg, hogy teljesen automatizálni tudtam.
Csak annyira összetett volt a feladat, hogy hosszabb idő kellene az előbányászásukhoz.
A diagramra ráhúzott függvény képletét ki tudod íratni a diagramra. Az alapadatokat ismered. A függvénnyel pedig ki tudod hozzá számolni az y adatokat. Ennél jobbat sajnos nem tudok. Tudom, persze sok adatsorozatnál ez eléggé hosszadalmas.
Illetve a TREND függvény idézett helpjét érdemes egy kicsit mélyebben megnézni, lehet, hogy segít valamit.
A 23087-ben felvetett eljárásra nincs valami ötleted? Azaz erre:
Abban lehet itt a segítségedre egy nálam jóbban képzett exceles, hogy elmondja, miként lehet a diagramra ráíratható függvény paramétereit lekérdezni. Ez speciel engen is érdekelne.
Van 2003-as és 2007-es egyaránt. De annyira nem szeretem a 2007-est, hogy lényegében csak a 2003-ast használom. Bár most éppen az itt emlegetett programom a laptomon fut, amin a 2007-es van telepítve, hogy az alatt a 3 óra alatt, amíg dolgozik, nyugodtan tudjak dolgozni az asztali gépemen,
Egyébként sajnos legkésőbb jövő nyáron át kell állnom, tehát biztos fogom tudni használni az érdekességeket. Kipróbálni meg most is tudom.
Most hogy újra nézem, biztos, hogy a poliniáis transzformációm egy marhaság:((((. De hogy mi lenne a jó, azt nem tudom. Így ha valaki nem súgja meg, marad, hogy az excellel illeszted a polinomiális függvényt, majd az így meghatároztt függvénnyel jelzel előre. Abban lehet itt a segítségedre egy nálam jóbban képzett exceles, hogy elmondja, miként lehet a diagramra ráíratható függvény paramétereit lekérdezni. Ez speciel engen is érdekelne.
Igen, egy kicsit félreérthetően fogalmaztam. Akkor most pontosabban. Szó sincs a harmadfokú függvény linearizálásáról, majd az eredmény vissza transzformálásáról. Ha ugyanis már megvan a harmadfokú függvény, akkor nem a forecast-t kell előre jelezni, hanem magával a harmadfoku függvénnyel.
Amiról én írtam, hogy adatpárjaid vannak és azokból akarsz előre jelezni az excel segítségével. Nos, ebben az esetben a függvények meghatározásával nem kell foglalkoznod. Azt rábízod az excelre. Te csak az adataidat teszed a lineárissá, persze csak akkor ha nem vagy megelégedve a jelenlegi linearításukkal. Írtad korábban, hogy nem akarsz veszkődni a grafikus függvénymeghatározással. Az adatok grafikus Pont(XY) diagramon való megtekintése azonban ajánlatos, mert ábrából a legkönnyebb eldönteni, hogy a függvényedhez milyen függvényt érdemes illeszteni. Nos ha ezt eldöntötted, akár az ábrából, akár hasra ütve, akkor kell az Y adataidat ennek megfelelően transzformálni. Teszem azt, ha másodfokú osszefüggést posztulálsz, akkor veszed mindegyik Y-nak a négyzetgyökét, ha harmadfokút akkor a gyök3-t, ha logarimusost, akkor a logaritmusát stb. Majd az XY' adatpárjaidra elvégzed alineáris a regressziót. Ha a korrelácó javult az eredeti adataidból számítotthoz képest, akkor érdemes volt transzformálnod, ha nem javult akkor vagy maradsz az eredeti adataidnál, vagy új transzformációt választasz. Ha meg vagy elégedve a javulással, akkor csinálod meg a lineáris előrejelzést,majd a kapott forecast visszatranszformálását az eredeti skálára, az előző transzformáció inverzével. Tehát ha előzőleg gyököt vontál, akkor most négyzetre emelsz stb.
A polinomiális előrejelzéshez úgy gondolom, hogy az Y=x+gyök(x)+gyök3(x)+gyök4(x)+..... transzformációt kellene elvégezni. De ezt azért csekkold, mert nem vagyok matematikus, lehet hogy tévedek. Azt azonban tudnod kell, hogy a polinomiális összefüggések csak az adott adathalmazon érvényesek. Ugyanis a polinomiális függvény első sorban arra használatos, hogy az adott adathalmazod összes kis kilengését baromi pontosan írja le. Ezért egy másik adathalmazon nyilvánvalóan hibás eredményeket fog előre jelezni. Ezért én a polinomiális függvényt csak az adathalmazban rejlő tendenciák felismerésére használtam, előrejelzésre sosem
Szia, ez épp jókor jött, amikor azt kezdtem tesztelgetni, hogy hogyan tudom a formulát alkalmazni, ha másik fájlból olvasom az egyik összegzendő adatsort. És sikerült a workbook és a worksheet nevét is beleillesztenem a képletbe.
A TREND függvényt polinomgörbe illesztésére is használhatja: ekkor a regresszió számítása ugyanazon változó különböző hatványainál történik. Tegyük fel például, hogy az A oszlop az y, míg a B oszlop az x értékeket tartalmazza. A C oszlopba beviheti az x^2, a D oszlopba az x^3 értékeket és így tovább. A regressziós görbe ezután a B-D, illetve az A oszlop értékei között számítható.
A feladat lényegét a #22993-ban hivatkozott http://data.hu/get/7127187/sumif_teszt.xls tesztfájl tartalmazza. Akkor éppen a Sumif tesztelésére készítettem, és az adatszerkezet bemutatására. Ezért a benne lévő program már nem aktuális, de az adatszerkezet érvényes.
Az első két oszlopban árucikkek kódja és neve szerepel, a többiben az egyes időszakokban történt értékesítések 3-3 adata. Csak éppen az éles adatfájlokban (amiből 30-nál több van, ezek az egyes üzletek adatai) átlag 20.000 sor szerepel és kereken 100 oszlop.
Ráadásul az árucikkek listája nem teljesen fedi egymást az egyes fájlokban, ugyanakkor egy fájlon belül a nevek ismétlődnek más kódszámmal.
Az egyes fájlok adatainak vízszintes és függőleges összegzésén túl kell készítenem egy olyan összegfájlt, amelyben a fájlokban előforduló összes – adattal rendelkező - árucikk (az üres tételek kihagyása miatt összesen kb. 10.000) egyszer szerepel, és annak adatait a fájlokból összesítve tartalmazza. Aztán kell egy olyan összesítő fájl, ami az egyes fájlokban (üzletekben) található oszlopösszegeket írja az egyes sorokba.
Tulajdonképpen egyszer már működött a program, de fájlonként 7-8 percig futott, összesen több mint 3 órán át. És mivel még kell egy kicsit finomítani (pl. az azonos nevű, eltérő kódú tételek összevonásával), ezért gondoltam, hogy akkor már meggyorsítom, nem mellesleg a formula- és a munkalap képletek használatával is ismerkedem.
Azért ha a feladat lényegét leírnád, lehet, többet tudnánk segíteni neked.
Hiszen az Excelben számos olyan eszköz van, amivel a táblázatokat könnyen lehet kezelni.
Pl. kimutatások készítése, amelyek utána pillanatok alatt variálhatók.
Nem biztos, hogy neked kell kitalálnod azokat a programsorokat, amiket már eleve beépítettek valamilyen excel funkcióba.
Én mindig arra törekszem, hogy először dolgozzon az Excel és csak utána jövök én. Teljesítmény szempontjából is általában ez a szerencsésebb.
Más: ha egy sort összegzőnek szeretnél és beírod a szum képletet, utána ebben a sorban a képletet kell/lehet módosítani a hozzáadandó tartomány címének megfelelően.
Továbbá: Hasznos, ha az összegző sor az adatok előtt van, mert ilyenkor az összegzőképletet csak egyszer kell beírnod, ami akár az oszlop végére is mutathat. Ha újabb adatot írsz a következő sorokba, az összeg automatikusan képződik.
Kösz, a helyzet az, hogy próbáltam a szum-al is a képletet, de azzal sem jött össze.
Az igazság az, hogy mintát mutatni nem érdemes. Az eredeti feladat egy sokezer soros, 98 oszlopos táblázat, sőt ebből is sok van. És az adatok gyűjtögetése ciklusban nagyon lassú, ezért szeretnék képleteket használni.
És amíg a megfelelő képleteket nem találom meg, addig kisméretű mintatáblákon próbálgatom, amelyekbe néhány sort, és néhány oszopot teszek csak.
És nem ragaszkodnék a formula képlethez, de az általad írt megoldás is megfelel nekem. Tökéletesen működik.
Egyébként meg éppen most elakadtam a következőnél:
With ws.Range(Cells(1, 1), Cells(1, utolsóoszl)) összws.Range(Cells(1, 1), Cells(1, utolsóoszl)).Value = .Value ' fejléc másolás End With
method range of object _worksheet failed hibaüzenetet kapok
Valószínű, hogy 1-2 óra alatt megtalálom a hibát, de hátha te kapásból átlátod.
Mindig új helyre töltöd be az új adatokat és azt szeretnéd látni a diagramon? Ha ez fontos, akkor a diagram forrását kell megadnod a makróban tartományként.
Van egy chartwizard tulajdonsága a chartnak, aminél a source paramétert kell megadni range("A1:B15") formában.
Ha elnevezted az adattartományt, akkor a név.referestorange kell a source-hoz (arra figyelj, hogy a név laphoz, vagy munkafüzethez van kötve, mert aszerint kell keresned).
Ha mindig ugyanoda töltöd be az új adatokat, akkor viszont sokkal egyszerűbb a helyzet:
Az adatokat betöltöd, utána kimutatásdiagram, létrehozod a diagramot.
Utána amikor frissíted az adatokat, frissül a diagram is.
Igaz, itt meg van kicsit kötve a kezed a diagram tipusait és formáját tekintve, de azért ez is elég kényelmes és gyorsan lehet pl. változtatni, hogy mit akarsz látni rajta.
A VBA-ban megadott formula képletekre ugyanaz a szabály vonatkozik, mint a munkalap képletekre - hiszen ugyanazok - , így a saját magával való összeadás formula megadással nem megy, ez csak a VBA-ban működik.
Áthidaló megoldásként egy másik sorban alkalmazhatod a képletet, majd értékké változtatva átmásolhatod az összegsorba, valahogy így:
with range(cells(ujsor,1),cells(ujsor,oszlopszam))
Még mindig a tartományi képleteken vagyok elakadva. A következő részt szeretném kiváltani egy egysoros paranccsal, tekintve, hogy nagyon sok sor, nagyon sok oszlopát szeretném gyűjteni:
For j = 1 To oszlopszám Cells(összegsor, j) = Cells(összegsor, j) + Cells(aktsor, j) Next i
Ez így ciklusban simán működik, de amint képletet próbálok hozzá kreálni, vagy körkörös hivatkozást jelez, vagy csak simán lenullázza az összegsorban lévő adataimat.
Ami nem működik nálam relatív címzésként makrónál, az az Excelben amúgy simán használható SHIFT+CTRL+lefelé nyíl, vagy oldalra nyíl. Ugyan jól jelöli ki az Excel látszólag, de látszik a VBA kódban, hogy fix cellanevekre hiányzik bent a pivotnál.
Sziasztok, hogyan tudom beállítani Excel 2007 angol nyelvű verzióban azt, hogy a rögzített makróm dinamikus tartományt tudjon kezelni?
Konkrétan: pivot táblát szeretnék úgy frissíteni minden egyes újabb forrásadatbetöltésnél, hogy az aktuális adattömböt vegye figyelembe.
Ami nem működik nálam relatív címzésként makrónál, az az Excelben amúgy simán használható SHIFT+CTRL+lefelé nyíl, vagy oldalra nyíl. Ugyan jól jelöli ki az Excel látszólag, de látszik a VBA kódban, hogy fix cellanevekre hiányzik bent a pivotnál.
Így legközelebb hiába fut le a lefelé és jobbra való kijelölés, a korábban fixen benne lévő cellanevekkel dolgozik a pivot a tábla frissítésénél.
Próbálkoztam azzal is, hogy túl járok a pivot eszén, elnevezést használva az adattartományra, így csak be kell frissítenem a pivotot, amikor újabb "target" adatforrásom van.
A gond csak az, hogy az elnevezést se csinálja meg jól a fent említett lefelé és oldalra való kijelöléssel. Pont ugyanez a gond a SHIFT+CTRL+End kijelöléssel is: mivel az Excel emlékszik rá, hogy korábban abban a cellában volt adattartalom, mert pl. korábban egy hosszabb adattartományom volt, akkor hiába van az újabb adattartományban kevesebb adatom, nem az utolsó sorig jelöli ki, hanem az üres cellákat is.
Ha esetleg valamilyen offsetes automatikus tartománykijelölés létezik a definiált "Target"-re, az is megoldaná a gondomat szerintem.
Az adattartomány az oszlopnevekkel az A7-es cellában kezdődik, nem A1-től. Az adatok A-tól P oszlopig terjednek, kb. 20 ezer soron. A munkalap neve Sales.
Megoldás lehet hogy linearizálod a magasabbrendű függvényed adataid és azon határozod meg a forecastot. Majd az eredményt visszaalakítod az eredeti függvény szerintire.
Van az előrejelzés (forecast) függvény, ami tök jó arra, hogyha a lineáris trend következő y-ját akarjuk kiszámolni. De mi van akkor, ha a trend nem lineáris, hanem másodfokú, harmadfokú stb? Ott milyen képletet kéne használni? (Ha grafikusan megrajzolom a trendvonalat, akkor kiírja az egyenletet, de ez többszáz esetben eléggé macerás kézzel bemásolni.)
Aha! Így tényleg készen vannak a BC oszlopok. Annyira nem mélyedtem el a feladatleírásban, hogy erre magamtól rájöjjek. De akárhogyis van, a lényeg, hogy sikeresen megoldottad :)))).
Miért kellene a BC oszlop számait összehozni. Azokat induláskor úgy kezdték el írni és ha jön egy új szám, csak folytatják a cellában. B oszlopban magánszámok, C oszlopban céges számok.
Tényleg rövidebb. De sokkal körülményesebb. Előkeresni az A oszlopból a megfelelő Miszámunkat, majd ennek a sorából egy másik cellában szöveg.keresezni… Hát nem semmi. Azt már meg sem emlitem, hogy elötte a BC oszlop celláit is össze kell hozni. Persze ha összeszedném magam, tudnék még ennél is komplikáltabb megoldást csinálni :)))))
A Redim A(2 to 5) azt jelenti, hogy az új tömbödnek az első indexe amire hivatkozhatsz, az a kettes lesz, vagyis a tömböd 4 elemet (2-3-4-5) fog tartalmazni.
A Redim(5) viszont azt jelenti, hogy az első indexed az Option Base utasítástól függően 0 vagy 1, tehát a tömbben 6 ill. 5 elem helyezhető el.
A Dim tömb utasítást egyébként ugyanigy tudod használni.
A második verzió azért sokkal-sokkal rövidebb szerintem
Szöveg.keres feladata: megkeresni az adott cellában a hívott számot. Ha a B oszlopban megtalálja, akkor magánszám, ha a C oszlopban, akkor céges a szám, ha nem találja, akkor nincs még felvéve a listába.
Az adattábla lehet majd a következő lecke szerintem.
Értem én. Nálunk is csináltak valami hasonlót egy rövid ideig. De aztán elhalt. Mivel nem sok értelme volt. Mondjuk annyi különbség azért volt, hogy a főnökségnek se voltak túlzott reményei a módszer hatékonyságával kapcsolatban. Úgy tudom, egy APEH intézkedést gondoltak így hatástalanítani.
Valamit rosszul láthatok, mert szerintem a számlista ugyanolyan hosszú, ha a magán és céges hívások el vannak különítve egymástól, mint ha nem lennének. De ha nem így lenne, 1 millió hosszúságú akkor se lenne, már pedig annyit az excel könnyedén kezel.
Nálam a szöveg.keresnek nincs funkciója, és őszintén megvallva, a tiedben sem látom, hol lenne szerepe.
A szumhatöbb is jó természetesen. De pivot sokoldalubb elemzést tesz lehetővé. Arról nem is beszélve, hogy az adattábla kezelése is egyszerűbb.
E$25 helyett írhatsz akár E$125-öt vagy amennyi sorod várhatóan lesz.
Ha csak a kiadott azonosítókig húzod le, akkor mindig beírja a B oszlopba az E oszlop megfelelő adatát.
Ha túlhúzod, akkor a B oszlopba az E oszlop utolsó adata kerül, ami azonnal megváltozik, ha egy új azonosítót kiadsz a C,D oszlopokban és melléírod a termék nevet az E oszlopba.
Szerintem nem teljesen érted a lényegét. Vannak a céges telefonok, amit a kollégáim használnak. Engedélyezve van magánhívás is de azt ki kell fizetni. Vannak alap feltételek, amiket nézünk. 4-nél többször hívta vagy 4-nél több sms-t küldött. Megkérdezem a kollégám, hogy amit Ő hívott a céges telefonjáról számot az a munkáltató érdekében volt vagy magánhívásnak minősül. Ő erre besorolja valamelyik kategóriába. Én ezt folyamatosan gyűjtöm. Magán hívásnak minősül az, ami nem a munkájából adódóan hívott. Céges hívásnak amit a munkája miatt hívott. Pl.: nekem mondjuk a UPC csak magánhívás lehet. De az informatikus kollégának céges hívás mert a cég miatt hívta.
Igen, csak ez akkor egy lényegesen hosszabb telefonszámlista lenne.
Amit most csinálnak, az a telefonszámhoz tartozó két oszlopban tudja kezelni a magán, céges kérdést - más kérdés, hogy én csak a magánt kezelném, a céges már egy kicsit "Nagy Testvéres".
Kiválogatni pedig, ahogy látod, a szöveg.keres-sel lehet egy adott cella tartalmából.
Nem mondom, hogy egyszerű a képlet, de azért még elviselhető hosszúságú szerintem.
Rendben, a Te telefonlistáddal dolgozunk (továbbra is tlista).
Akkor annyit kellene módosítani a korábban leírtakon, hogy a
A híváslistát kiegészíted a következővel:
D1 cellába beírhatod: magán/céges
D2 cellába képlet =HA(HIBÁS(FKERES(A2;tlista!A:A;1;0));"Nincs ilyen céges szám a listádban!";HA(HIBÁS(SZÖVEG.KERES(B2;FKERES(A2;tlista!A:B;2;0)));HA(HIBÁS(SZÖVEG.KERES(B2;FKERES(A2;tlista!A:C;3;0)));"Nincs ez a hívott szám a listádban!";"céges");"magán"))
Ez megmutatja, ha egy céges számot még nem vittél fel a listádba (tlista), ha egy hívott szám nincs benne még a listádban, ha pedig megtalálta, akkor beírja, hogy céges, vagy magán volt a szám.
Ezt így szűrve megláthatod azt is, hogy melyik céges szám hiányzik, illetve melyik céges számról hívták az adott számot.
Valami nem stimmel a magyarázatoddal. A H-oszlopban nem a Termék1-t és Termék2-ket számoltad meg hanem a sorozatjaikat. Ha a termék db-kat akarod megszámolni, és nem a B-oszlop kitöltésével (ami pedig szerintem egyszerübb lenne, mint a CDE oszlopoké), akkor az F-oszopba számold ki a soronkénti termékdarabok számát a D-C+1 képlettel, majd H-ban szumha-val a Termék1 és Termék2 darabszámát:
=szumha(e1:e1000;"Termék1"f1:f1000) és ugyanezt a Termék2 vel is.
Ezt most hogyan szűröd ki, gondolom kézzel - fejjel.
Úgy gondolom, ez akkor működhet, ha a magánszámokat a hozzájuk tartozó céges párjukkal együtt tároljuk a listában. Tehát nem elég megjelölni, hogy magán, azt is tudni kell, melyik hívónál magán.
Ez egy kicsit bonyolítja a helyzetet, de megoldható.
Azt szeretném hogy van mondjuk 1-től 1000-ig "vonalkód" kinyomtatva. Ahogy jön egy termék időbrendben arra rakom a kódot. De nem tudom hogy mikor melyik termék jöhet és mennyibe van csomagolva ezért kell használnom intervallumokat. "A oszlopban" van a "vonalkód" ami folyamatosan töltődik fel 1000-ig ahogy érkezik az árú. "C és D oszlopban" van a kezdő és záró érték aminél megadom, hogy egy termék mettől meddig kapta meg a sorszámot. A "H oszlopban" meg összesítem, hogy hány darab van az adott termékből. A "B oszlopot" semmire nem használom. Vagyis ha van rá ötlet akkor arra használnám, hogy oda automatikusan beírja hogy Termék1 vagy Termék2 függően hogy a C,D,E oszlopba mi van írva és onnantól meg darabteli() meg heppyhour :D
Ami most meg tudok valósítani, hogy soronként egyesével beírogatom a B oszlopba, hogy Termék1 Termék2 stb... és azt darabteli()-vel megszámolom. De nincs túl nagy lelkesedésem több száz sort kitöltögetni manuálisan :D
Tudom, hogy a Termékenkénti Egyedi ID lenne a legjobb de sajnos itt nem valósítható ez meg.
Egy pillanatra visszatérve a tegnapiakra, mert a Range használattal még mindig nem vagyok teljesen képben. Egy nagy táblázat összes sorában a nem üres cellák számát a "C" oszloptól kezdve eddig a következő ciklussal írtam be az utolsó oszlop utáni cellába:
For i = 2 To utolsósor ws.Range("O" & i) = Application.CountA(Range("C" & i, "N" & i))
Számomra a felrakott képből nem derúl ki, hogy mit akarsz.
1. Ott van az A-oszlop, semmi kapcsolata a többivel.
2. Az E oszlop forrása rejtély. Ha feltételezem, hogy az A-oszlopbeli ID-khez kapcsolódnak, akkor a B-oszlopnak is ki kéne lennie töltve az ID-khez tartozó terméknevekkel. Ha így lenne, akkor egy pótlólagos oszlop beszúrásáva az E-oszlop FKERES-sel lenne kitölthető.
3. A H az E-oszlop Darabteli-s értékelésének tűnik. Ha így van, problémamentes.
1.A magán/céges telefonszámlista (legyen a neve tlista).
Szerkezete:
A oszlop: telefonszám
B oszlop: "magán" vagy "céges"
C oszlop: eszköz (céges telefonszám, ahonnan hívják) de ez szerintem felesleges, mert céges számot általában többen is hívnak és magán számot is hívhatnak többen is (tehát több oszlop is kellene, vagy ebben az oszlopban több szám). Viszont az adott havi híváslistából egyértelműen kiderül, hogy éppen ki(k) hívták a számot.
2.Lenne egy listám az eszközök (céges telefon) használójáról (ez biztosan meg is van), hogy személyhez tudjam kötni (legyen a neve nlista).
Szerkezete: A oszlop eszköz (céges szám)
B oszlop használó neve
3.A híváslistát bemásolnám ide (legyen a neve hlista).
Ez megkeresi azokat a számokat a híváslistában, amelyek még nincsenek benne a tlistában. Amelyek benne vannak, oda pedig beírja, hogy magán vagy céges a szám.
A munkalapra autoszűrő, D oszlopban kiválasztod az "Új szám" -ot, a B oszlopban levő számokat kijelölöd, copy, majd a tlista A oszlopának végére bemásolod.
A tlista új számainak B oszlopába beírod, hogy magán, vagy céges.
Ha ezzel megvagy, visszamész a hlista munkalapra és kikapcsolod az autoszűrőt. El kell tűnnie az "Új szám"-oknak és helyettük a magán/céges megjelölés látszik.
D oszlopot kijelölöd. Copy majd irányított beillesztés ugyanide! értéket, utána ESC. Ezzel eltüntettük a képletet.
Most már minden telefonszámhoz megvan, hogy magán vagy céges.
A hlista sorbarendezése: fejléc van.
A oszlop emelkedő majd D oszlop emelkedő.
Ezután adatok részösszeg:
csoportosítási alap: A oszlop illetve a fejléce
összesítő függvény: Összeg
összesítendő oszlop: C Hívásdíj
összegek az adatok alatt
Ezzel megkapod minden eszközhöz a céges és a magán hívások díját.
Próbáld ki, eddig sikerül-e eljutni. Utána lehet még egy kicsit tovább javítani a megoldáson.
Igen, jól érted. Az eszköz a céges telefonszám és erről lehet céges vagy magánhívást is kezdeményezni. Minden hónapban vannak új számok is de amiket már leadtak nem kérdem meg újra.
Két dolgot gyűjtik de külön táblában.
Van egy táblázat amiben gyűjtöm a kollégák által megadott céges és magánszámokat. Ezt minden hónapban frissítem.
Utána pedig az adott havi listából kigyűjtöm mi a céges és mi a magán hívás. Illetve mennyi a magánhívás összege.
A hívás listából kellene megállapítani a b oszlop - azaz a hívott szám - alapján, hogy a hívás magán vagy céges volt-e.
Mivel azt mondod, hogy az eszköz(ami a céges telefon számának felel meg), nyilván hívhat magán és céges számokat is, a telefon használójának kell megmondania, hogy melyik hívott szám milyen célú. Gondolom, ezeket folyamatosan "bemondják" a munkatársak, ha új szám keletkezik.
Még azt nem értem, hogy a Te táblázatodban akkor mit és hogyan gyűjtesz:
A céges telefonhoz (eszközhöz) tartozó konkrét telefonszámokat, vagy a magán és céges hívások díját?
Ezeket legalább ismerni kellene ahhoz, hogy értelmes megoldást tudjunk adni.
Köszönöm szépen a válaszod. A probléma abból adódik, hogy lehet, hogy ami nálam céges szám, az a kollégámnál magán. Így szükséges, hogy az eszközt (céges számot) is figyelembe vegye.
A hívás lista tábla:
a oszlop: eszköz (céges szám)
b oszlop: hívott szám
c oszlop: hívás díja
Az én táblázatom, amiben a számokat gyűjtöm:
a oszlop: eszköz (céges szám)
b oszlop: magán hívás
c oszlop: céges hívás
A saját táblázatom úgy módosítom, ahogy szükséges. Illetve a híváslista táblát is tudom másolgatni, szerkezgetni.
Eddig ezt úgy oldottam meg, hogy a híváslistára rászűrtem céges számonként. Lementettem egy új excel-ben. FKERESSEL a hozzá tartozó általam kígyűjtött táblázatomból megkerestem a céges számokat és a másik oszlopból a magán számokat. Viszont ez nagyon időigényes, mert sok a céges szám. Így segítséget kértem, hátha lehetne egy képlettel könnyebben megoldani és utána csak rá kelljen szűrni.
Lenne megint egy eszement kérdésem: Azt hogy csinálja az excel, hogy az =INDEX($A$4:$A$10;0;0) képlet bizonyos cellákban nem #ÉRTÉK hibát eredményez? Az indexelt tartomány sávjában levő cellákban ugyanis a vele azonos sorban levő értéket adja vissza.
This statement declares that a variableXis an integer — a whole number between –32,768 and 32,767. If you try to setXto a number outside that range, an error occurs. If you try to set X to a fraction, the number is rounded. For example:
Nem tudtam róla. Sehol sem láttam az eltérő kerekítésre történő utalást, így aztán igencsak meglepődtem amikor hülye eredményt kaptam. Eltartott egy darabig, amíg rájöttem az okára....
Eddig jobb híján ciklusban szaladtam végig a Cells.SpecialCells(xlLastCell).Row/Column után hátulról tesztelve a cellák üres voltát. Ez különösen akkor érdekes, ha sorokat/oszlopokat töröltem a táblázat végén.
A válasz az integer és a double közötti tulajdonság különbség. Az integer - és a long - a törteket a kerekítés szabályai szerint kerekíti, azaz neki az 5,51 már 6.
Próbáld ki: k%=5.51 : debug.print k% => 6
k%=5.31 : debug.print k% => 5
Ezzel szemben a double és a variant lebegőpontos és nem kerekít, neki tehát az 5 után következő 6 már nagyobb, mint az 5.51.
Az xlLastCell eredménye nem hamis, hiszen a formázás is a használatba vétel egyik formája - hiszen az xlLastCell a munkalap használt tartományának utolsó celláját adja meg - csak az eredmény nem a mi elképzelésünknek felel meg...., mi nem ezt akartuk megtudni, de az Excel ezt tudja nyújtani.
Ezért én nem is használom ezt a paramétert.
Akkor már inkább a specialcells xlcelltypeblanks (vagy xlblanks) paraméterét érdemes használni. Ez megmutatja, hogy hány üres cella van és azok hány területen helyezkednek el, a címét is megmondja területenként.
Szerintetek mi a logikája annak, hogy az alábbi makróban a k-változót integernek vagy longnak definiálva 6x fut le a ciklus (azaz kerekít), míg double vagy variant k-k esetében 5x (azaz csonkol)?
Sub ciklusszam() Dim k Range("o1:o10").Clear For k = 1 To 5.51 Cells(k, 15) = k Next k End Sub
sorok hamis eredményt adhatnak, ha az adatokon kívüli celláknak valamilyen formát adtam.
Sub mm() Dim usor As Long, uoszlop As Long usor = Cells.SpecialCells(xlLastCell).Row uoszlop = Cells.SpecialCells(xlLastCell).Column MsgBox usor & Chr(10) & uoszlop End Sub
A formázott terület utolsó sorát-, és oszlopát adja ereményül (szegélyezés nagyobb területen, mint az adatok).
Ha új adatot kell beírnod, akkor sem kell a képleten módosítani: az utolsó adatokat tartalmazó 3 oszlop elé szúrj be 3 oszlopot. Ekkor az összegző oszlopok képletei automatikusan alkalmazkodnak! (Ha az összegző oszlopok elé szúrod be, akkor nem!) Ha fontos az adatok sorrendje, akkor az "eltolt" 3 oszlop adatát másold be a beszúrt oszlopba és a helyére kerüljenek az új adatok.
Szerintem még szebb, ha az összegző oszlopokat közvetlenül a név oszlop után teszed (azaz az adatok elé). Ennek az az előnye, hogy az összegzőképletet kiterjesztheted az ezután beírandó (még meg sem lévő) adatokra a beíráskor (akár a munkafüzet utolsó oszlopáig!). Az új adatokat egyszerűen csak be kell írni a meglevőek mögé és máris kész az új összegzés.
Az összegzést megcsinálhatod egy új munkalapra is, hogy csak azt lássák mások. Ekkor az összegző képletbe fel kell venni az adatokat tartalmazó munkalap nevét: (az adatok az Adat nevű munkalapon vannak)
És csak most veszem észre a végső trükköt, ahogy veszem át soronként a programot a sajátomba.
Így még azzal sem kell bíbelődni, hogy a rövidített neveket /left(C1,7)/ bemásolgassam az összegző oszlopok fejlécébe. Egyszerűen a képlet tartalmazza a rövidítést. És így még a képletek értékké való átalakításával sem kell foglalkozni. Nagyon jó!!!
„Bár ez a R1C& ""*"" szintaxis nekem új, de majd megpróbálom megérteni.”
Ezzel kicsit pontatlanul fogalmaztam. Azt értettem, hogy a * itt egy wildcard karakter, csak nem igazán értettem az alkalmazásának módját, illetve a szintaxisát.
A megoldásod "=SUMIF($C$1:$N$1,left(C$1,7) &""*"",$C3:$N3)"
(a fejléc hiányában persze $C3:$N3 helyett persze $C2:$N2-t alkalmazva) tökéletesen működik. Köszönöm.
Igazad van, ugyanakkor a ws.cells() formát január óta használom következetesen, amikor kiderült, hogy az Excel 2007-es verziója (vagy a 2003-asra konvertáló funkció) nem kompatibilis a 2003-assal. Ezt megírtam a http://forum.index.hu/Article/viewArticle?a=123557575&t=9009340 hozzászólásban, amire – az azóta a fórumról sajnálatosan eltűnt és törölt – robbantómester adta meg a kulcsot. A gondot az okozta, hogy hiába választottam ki worksheets(2).select paranccsal egy másik munkalapot, a cells() parancs munkalapnév nélkül csak a 2003 alatt működött jól, 2007 alatt a munkalapváltást figyelmen kívül hagyta. Aztán kicsit később Retro Image (http://forum.index.hu/Article/viewArticle?a=123577102&t=9009340) magyarázta el, hogy miért célszerű egzakt hivatkozásokat használni. Ráadásul most veszem észre, hogy az általa javasolt Application qualifier használatáról időközben meg is felejtkeztem.
Igazad van a"=SUMIF($C$1:$N$1,left(C$1,7) &""*"",$C3:$N3)" képlettel. Ennek a segítségével a 3 oszlop képleteit 1 lépésben beírhatjuk. Nincs szükség sor beszúrására, és törlésére, képletek helyett értékek beillesztésére.
A makró tömörebben:
Sub sumifteszt() Dim utolsósor As Long, utolsóoszl As Integer
Application.DisplayAlerts = False If Worksheets.Count = 2 Then Sheets(2).Delete Application.DisplayAlerts = True
Az hasznos szerintem, hogy a munkalapra is hivatkozik, mivel nem feltétlenül marad mindig az adott munkalap aktív (jó, ebben az esetben nem változik az aktív lap). Így legalább biztosan nem téved el a képlet.
Bár ez a R1C& ""*"" szintaxis nekem új, de majd megpróbálom megérteni.
A szöveg keresésben vannak speciális karakterek (ezt biztosan ismered), a csillag, a kérdőjel.Ezt lehet használni a szumha függvényben, meg más számolós,hasonlítós függvényben is. A fenti formulában azt jelenti, hogy minden olyan számot összegez, ahol az oszlop első cellájában levő érték kezdő karakterei (esetünkben 7 db karakter) megegyezik a megadott karakterekkel. Tehát pl. "Tranzak*" eredménye minden Tranzak-kal kezdődő oszlop összesítése, akármivel is folytatódik.
szöveg(j) itt az zavart meg, hogy a munkalapfüggvények között is van ilyen nevű függvény - az álmoskönyvek szerint nem szerencsés a rendszer neveit bekeverni a saját neveink közé.
chr(34) ahogy már írtam, korrekt a chr(34) használata, ha idézőjelet akarsz a szövegben megjeleníteni - de akkor csak egy kell belőle. A formula képleteknél gyakran előfordul, hogy idézőjel kell a szövegbe, itt az idézőjel megduplázása az elegánsabb megoldás (lásd az első felvetésed és Delila képlete).
Nem tudom, felfigyeltél-e rá, hogy az új lapnak nem adtam nevet, és a Set ws= ... sort sem használtam, a továbbiakban a hivatkozások sem kezdődtek ws. -tal. Mikor a másolatot elkészíted az első lapról, hivatalból a másolt lap lesz aktív, ezért nincs szükség laphivatkozásokra.
A Delila által írt képletet ("=SUMIF($C$1:$N$1," & Chr(34) & "Tranzak" & Chr(34) & ",$C3:$N3)") is át lehetne úgy alakítani, hogy ne kelljen új fejlécsort beszúrni? Hogy a "Tranzak" helyén valami hasonló automatizmus működjön? Próbálgattam, de azzal nekem nem jött össze.
Szia Feri, neked is köszönöm. Kipróbáltam, működik. Az különösen tetszik, hogy nem kell hozzá a fejléccel babrálni, és egyetlen sorban intézi el a teljes tartományt. Bár ez a R1C& ""*"" szintaxis nekem új, de majd megpróbálom megérteni.
Azért válaszolok az előző hozzászólásodra is:
- szöveg(j). Elsőre nem is értettem, mire gondolsz aztán rájöttem. Én nem a függvényt használtam, hanem egy szöveg() nevű tömbváltozót.
- A chr(34)-ek szerepe az volt, hogy a makrórögzítéssel készített programszöveget akartam megvalósítani. Az pedig a következőképp nézett ki:
És ez ráadásul működött, ha makróban futtattam. És ott voltak dupla idézőjelek, amiket másképp nem tudtam előállítani.
De most, hogy kaptam megoldást Delilától és tőled is, erre a formulára nincs szükség. Így is vért izzadtam, míg előállítottam, ráadásul nem is működött. És ami fontos, nem is volt elegáns.
Delila, ez szuper. Sajnos a tartományok kezelésében bizonytalan vagyok. Magam is gondoltam erre, de rosszul sikerült, ezért használtam a ciklust. És jogos volt az előző észrevételed az utolsósor változó hibájával, azt elnéztem. A megoldásod kiválóan működik, és jól áttekinthető. Köszönöm.
Én nem igazodtam ki, hogy melyik szumif-es képleted működik és melyik nem. Abban azonban biztos vagyok, hogy a szumif 0-t fog adni eredményül, ha Tranzak-ra keresel és a keresősorban egy fia tranzak sincs :)))).
Én azt javaslom, hogy szúrj be még egy sort az első sor elé, és a havi 3 oszlopokat számozd be 1-2-3-mal, majd a szumha-val összegezd az oszlop1-ket, az oszlop2-ket és oszlop3-kat.
szöveg(j) Ez a magyar excel függvény, nincs helye a vba sorokban,akkor sem, ha cellába írod a formulát!!! Gondolj arra, hogy SUMIF -et írtál a SZUMHA helyett!
szöveg(j) Nincs szükség szöveggé alakítani a változót, azt megteszi magától a vba a hozzáfűzésben!
képlet = Chr(34) & nem kell a chr(34) &, simán képlet ="= és a folytatás.
Chr(34) & Chr(34) & szöveg(j) & Chr(34) & Chr(34) itt sem értem a chr(34) duplázásokat, ennek az lesz az eredménye, hogy dupla idézőjelek lesznek a szövegben - amit gondolom nem akarsz és nem is jó.
Egy kicsit játszadoztam. Mindjárt jön Jimmy, és 2 sorban elintézi az egészet.
Sub sumifteszt() Dim utolsósor As Long, utolsóoszl As Integer
Application.DisplayAlerts = False If Worksheets.Count = 2 Then Sheets(2).Delete Application.DisplayAlerts = True
Sheets("3500").Copy After:=Sheets(1) 'Másolat az első lapról utolsósor = Cells.SpecialCells(xlLastCell).Row ' a most megnyitott file utolsó sorát megkeressük utolsóoszl = Cells.SpecialCells(xlLastCell).Column
If utolsóoszl <> 14 Then MsgBox "Utolsó oszlop nem N! Ellenőrizd", vbOKOnly + vbExclamation Exit Sub End If
'Képletek helyére értékek beillesztése, mert az első sor törlése után a képletek fejre állnak enélkül Range("O3:Q" & utolsósor + 1).Copy Range("O3:Q" & utolsósor + 1).PasteSpecial xlPasteValues Rows(1).Delete ' Az új első sor törlése ' A teszt alatt ezt is kihagyom End Sub
Köszönöm a segítő szándékot. Időközben volt egy kevés egyéb feladatom, ezért csak most válaszolok.
Hát sajnos a szövegfelvágottba még jobban belekeveredtem.
Egyszerűen képtelen vagyok programból megoldani a SumIf függvényt. És hogy ne rébuszokban adjam elő a panaszomat, készítettem a tesztfájlt, benne egy nyúlfarknyi tesztprogrammal, amin bemutatom a problémámat: http://data.hu/get/7127187/sumif_teszt.xls
A tesztfájlban néhány mintaadat van. A program először a munkalapot átmásolja egy új lapra, és azon dolgozik, hogy tesztelés közben ne rontsuk el az adatokat, hátha újra akarjuk indítani.
Ezután az új teszt munkalapon létrehoz egy új fejlécsort, és ebbe átmásolja a fejléc oszlopok első néhány karakterét, hogy ezek felhasználásával tudjuk a feltételes összegzést végrehajtani.
A teszt kedvéért bemásoltam értékadásra a makrórögzítővel kapott eredményeket, és az működik. Ezeket kommentekben be is írtam a programba.
A programmal létrehozattam (látszólag) ugyanazt a kódot, amit a makrórögzítővel kaptam.
És az új munkafüzet végén az első szabad oszlopba be is másoltam ezt az értéket. De valamiért nem működik. Pedig nem látom a különbséget a programom által előállított kód és a makrórögzítős kód között.
Másrészt, mivel gondolom a telefonköltségekre vagy elsősorban kíváncsi, az még egyszerűbben megoldható a Szumha függvénnyel:
A magán-céges listádat tartalmazó táblázatod utolsó oszlopa után írd be a következő képletet:
= szumha(híváslista telefonszám oszlopa;telefonszám;híváslista költség/díj oszlopa), azaz
=szumha(munka2!A:A;munka1!A2;munka2!G:G), ha a híváslista a munka2 munkafüzetben van, A:X oszlopig, a táblázatod pedig az A oszlopban tartalmazza a telefonszámot és az első sor az fejléc.
Ezt a képletet húzd végig a táblázatodon lefelé.
Az oszlopot megcímezheted a hónappal és így minden hónapot behozhatsz ide egy-egy oszlopba.
Természetesen a copy irányított beillesztés érték manőver itt is kell, hogy a képletek "eltűnjenek".
A táblázatodban az első oszlopban vannak a telefonszámok, a második oszlopban a minősítése, hogy magán vagy céges (azaz ugyanabban az oszlopban!), mellette lehet a harmadik oszlopban pl. a név.
Nevezd el ezt a táblázatot pl. maganceges (kijelölöd a táblázatot, utána E2010-ben képletek, név megadása, munkafüzet szintű név)
Gondolom, a híváslistád is Excelben van, vagy oda betehető. Legyen a híváslista ugyanabban a munkafüzetben, mint a táblázatod, de külön munkalapon az A1 cellától.
Az fkeres függvénnyel megoldható a feladat, a híváslista utolsó oszlopa után írd be a képletet az első cellába:
=ha(hibás(fkeres("A1";maganceges;1;0));"Nincs ilyen szám";fkeres("A1";maganceges;2;0))
Ezt a képletet húzd/másold végig a híváslista végéig. Utána jelöld ki az oszlopot, másol, majd irányított beillesztés--értéket. Utána Esc, hogy visszatérj normál módba.
Ezután már bármilyen szűrést tudsz a kiegészített híváslistában csinálni.
Ha a "maganceges" táblázatodban a név van az első oszlopban, akkor cseréld meg az oszlopokat, hogy a telefonszám legyen az első oszlop. (Ha ezt nem akarod, akkor az index függvényt kell használni a hol.van függvénnyel kombinálva.)
A neveket ugyanezzel a módszerrel adhatod hozzá a híváslistához, ott azt az oszlopot kell a második fkeresbe írni, amelyikben a név található.
És te miben kapod ezt a listát a szolgáltatótól, xls-ben vagy csv-ben?
Tudom, hogy unalmas vagyok, de azért kérdezem, mert ez megint egy tipikusan adatbázis-kezelőre való feladat. Én úgy fognék hozzá, ha választhatnék. Határeset, mert meg lehet még oldani viszonylag normálisan Excelben is, de mivel ismétlődően kell elvégezni a munkát, szerintem fölöslegesen bonyolult lesz.
Segítséget szeretnék kérni. Az adott havi híváslistából kellene kigyűjtenem a magán és céges hívásokat. Ehhez adott egy lista az aktuális hónapban, hogy melyik céges számról milyen hívást indítottak. Ez a lista excel-ben van. Van egy másik táblázatom, amiben céges számonként gyűjtöm a munkavállalók által lenyilatkozott számokról, hogy céges szám vagy magán. A kérdésem az lenne, hogy melyik függvénnyel tudom azt megcsinálni, hogy kikeresse, hogy az adott eszközhöz (céges számhoz) tartozó hívás az az én nyilvántartásomban ennél a céges számnál magán vagy a céges oszlopban van?!
A VB szerkesztőben a lapodra állsz. A tulajdonságainál (properties) a ScrollArea értékeként add meg a területet, ahova a felhasználó írhat, pl. A1:C15. Ezután csak ebbe a területbe léphet be a júzer, de a többi cellában a fenti területre történő hivatkozások, képletek továbbra is működnek.
Az adott tartományt (Range-et) rendeld a makróban egy változóhoz mielőtt dolgozni kezdesz vele.
Pl:
dim tartomany as range,talal as range
set tartomany=activesheet.range("A1:Z25")
set talal=tartomany.find(what:="mit",lookin:=xlvalues,lookat:=xlwhole)
if not talal is nothing then
msgbox "Megtaláltad, a cella helye " & talal.address
else
msgbox "Nincs találat"
endif
De activesheet helyett működik másik munkalapon is, akkor ide a munkalapot úgy írd be, hogy
sheets("Munkalapneve").range("A1:Z25")
A keresésnél a lookat paraméter azt határozza meg, hogy az egész cellának meg kell felelnie, vagy részleges találat is jó. Ez utóbbi esetén xlpart a paraméter értéke.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Application.Intersect(Target, Range("B5:B10")) Is Nothing Then MsgBox Target.Address End Sub
Tökéletesen bevált a leírásod, sikerült összefűznöm a két táblázatot. Kezdtem a számformátummá konvertálással, majd az első képlettel a hét oszlop átvitele után is az eredmény oszlopokat át kellett konvertálnom számformátumúvá, ugyanis szövegként össze-vissza kutyulta az eredményeket.
A nevek átvitelénél két kis gubanc volt, a képletben az utolsó 3-ast ki kellett javítanom 2-esre, mert a 3-ik oszlopot hozta a nevek helyett, ami ugye a második oszlop. Szerencsére magamtól rájöttem a megoldásra. A másik gond, hogy egyszerre nem sikerült a művelet a 10K tételnél. Sok cellába hibás (üres) eredményt írt, így megpróbáltam 6-700 cellánként lehúzni fokozatosan, így tökéletes lett a végeredmény!
Nagyon köszönöm mégegyszer, borzasztó nagy segítség volt, több órát mentettél meg az életemből!
Ha számok vannak az első oszlopban, de nem számként, hanem szövegként vannak tárolva, akkor az fkeres csak akkor találja meg azokat, ha a keresendő érték is szöveges formában van. Tehát ilyenkor a keresendő értéket is szöveggé kell alakítani a kereséshez (pl. szöveg(A1;"#"))
Ha az első oszlop számként van tárolva, akkor viszont a keresendő értéket is számértékként kell keresni (pl. érték(A1)).
A dolog szépsége, hogy (ha nincs bekapcsolva a hibafigyelés) első ránézésre nem látszik meg, hogy milyen típusu a cella formája és ezek akár keveredhetnek is. Aztán törheted a fejed, hogy az egyik "számot" miért találta meg, a másikat pedig miért nem. (Emlékezz a szöveges dátum problémára.)
Szám vagy dátumértékek keresése alkalmával ügyeljen arra, hogy a tábla első oszlopában az adatok ne szöveges értékként legyenek tárolva. Ebben az esetben az FKERES hibás vagy váratlan eredményt adhat.
A két táblázat egy munkafüzetben van, két külön munkalapon. Ha nem így lenne, azt gondolom meg tudod csinálni.
Az 5000 cikkszámos táblázatban levő minden cikkszám előfordul a 10000-es táblában.
Javaslat:
Az 5000 cikkszámos táblázatot nevezd el pl. jocikk -nek. (2010-ben képletek - név megadása, munkafüzet szintű, korábban név hozzáadása vagy valami ilyesmi.)
C-I oszlopok adatainak áthozatala
Ezután a 10000-es táblázatban a J1 cellába (mivel az I oszlopban még van adat) írd be a következő képletet
és így tovább, egészen a P1 celláig, minden oszlopban növeld a számot 1-el.
Ha megvan, akkor az egész első sorban (J-P oszlopok) levő képleteket húzd le a 10000 sor végéig.
Eredmény: azokban a cellákban, ahol "jocikk" táblában van adat, az ide belekerül, egyébként látszólag üres marad a cella (de a képletet látod benne!)
A képletek "eltüntetése": kijelölöd a J-P oszlopokat, másolás, kijelölöd a J1 cellát, irányított beillesztés értéket.
A nevek áthozása:
Itt is az fkeres függvényt használjuk, de nem a B oszlopba írjuk a képletet (mert akkor az eredeti neveket "hazavágnánk"), hanem a sorok következő, Q1 cellába:
Ennek az lesz az eredménye, hogy minden olyan cikknél, ami szerepel a "jocikk" táblában, az új név lesz itt, amelyik nem szerepel, a régi neve a B oszlopból.
Segítséget szeretnék kérni, sajnos csak alapszinten értek az Excelhez, viszont van egy nagyobb feladatom, ami bőven meghaladja a tudásom:
Van két táblázatom: 1. táblázat 10000 tételes raktárkészlet A oszlop: cikkszám B oszlop: név C,D,E,F,G,H oszlopok egyéb adatok
2. táblázat 5000 tételes kiegészített és javított raktárkészlet A oszlop: cikkszám B oszlop: név C,D,E,F,G,H,I oszlopok egyéb adatok (teljesen különbözik az 1. táblázat egyéb adataitól)
A feladat:
egyesíteni a két táblázatot az alábbiak alapján: 1. A tételek cikkszáma mindkettőben megegyezik, a többi adat nem. Tehát A oszlop fix. 2. Egyező cikkszám esetén a 2. táblázat név oszlop adata felülírja az 1. táblázat név oszlopát 3. A 2. táblázat C,D,E,F,G,H,I oszlopai az egyesített táblázatban I,J,K,L,M,N,O oszlopba kerülnek (tehát a 2. táblázat C,D,E,F,G,H,I oszlopai nem írják felül az 1. táblázat C,D,E,F,G,H és üres I oszlopaitt hanem eltolódnak)
Nagyon szájbarágós leírást kérnék szépen, tényleg csak alap szinten kezelem a szoftvert.
Próbálkozásként oda eljutottam, hogy van már egy táblázatom, ahol az oszlopok a helyükön vannak, viszont 5000 tétel kétszer szerepel. Esetleg lehet innen könnyebb kiindulni. Itt már csak az egyező cikkszámú sorok összefűzése lenne a feladat, megtartva minden oszlop adatait, és a sorrendben második tétel neve felülírja az elsőt.
E helyett: ws.Cells(i, j).Formula = "=sumif(C1:CT1," & j & ",B" & i & ":CT" & i &")"
A formulákban nem kell idézőjelbe tenned az oszlopok betűjeleit, írhatod úgy, mint ahogy a cellában írod a képletet. Viszont a változók értékeit csak hozzáfűzéssel lehet a képlethez hozzáadni. Ezért akárhányszor változó értéket használsz, ott mindig hozzáfűzés kell.
Ha idézőjel kellene valamiért a képletbe, pl. egy szövegdarabot akarsz beletenni, akkor ott dupla idézőjelet kell használni az elején és a végén is ( & ""szöveg"" &).
Továbbá a számértékeket nem kell átalakítani szöveggé, azt "magától" megteszi az összefűzésnél (pláne nem trim(str(i)).
Nem egészen értem a j szerepét a feltétel helyén. ide annak a cellának a címét kell megadni, vagy azt a szöveget, amire az összesítés ki van hegyezve. (Persze, ha a hónapot számmal jelölted és csak annyi a feltétel, akkor nem kérdés a kérdés.)
Kösz, tbando képlete segítségével kézből kiadva tökéletesen működött. (Valóban be kellett hozzá illesztenem egy új 1. sort, hogy az eredeti oszlopok végén szereplő dátumot mutató részek kiessenek. Tehát az új első sorba csak az oszopok első néhány karaktere került, amivel így az azonosakat felismerte az Excel.
Viszont programba képtelen voltam beírni. Lehet, hogy a 2003-as verzióm volt az oka, és most nincs energiám megnézni ugyanezt 2007 alatt.
Szóval makrórögzítéssel sikerült megtalálni a formulát:
ActiveCell.FormulaR1C1 = "=SUMIF(R1C2:R1C156,""valami"",RC2:RC156)", és ez természetesen makróban futtatva is működött. De ezt nem tudtam szabályos függvénnyé alakítani:
Amig a kódot írtam, a VBA felismerte a sumif-et és szépen átírta SumIf-nek, de amikor ráfutott a vezérlés, akkor azt mondta, hogy Sub or Function not defined, és a SumIf nevét jelöli meg a hiba okaként.
A gond az, hogy egyelőre nem tudom a fentieket átalakítani a makrórögzítő és az általad is megadott range(cells(1,1),cells(1,utolsóoszlop)).formula="=sum(A3:A22000)" formára.
Mára fel is adom, majd a napokban átrágom magam rajta.
A későbbi kérdésedre: Az első két oszlopban termékkód és név van, de ez az adott feladat szempontjából most nálam érdektelen
Még valami, az nem derült ki, hogy az oszlopokban levő hónapok évekkel hogyan vannak megkülönböztetve, illetve van-e az első oszlopban bármi egyedi (pl. termék neve).
Mert akkor termékre, évekre a szumha(több) függvény kiválóan használható.
Beszúrsz egy sort a táblázat elejére (a fejlécek elé):
majd beírod a képletet mondjuk az A1 cellába =szum(A3:A22000) (ha itt kezdődnek az adataid).
Ezután végighúzod az utolsó oszlopig a képletet.
Persze, ez az árakat is összeadja...
Viszont, ha a képletet makróval írod be: range(cells(1,1),cells(1,utolsóoszlop)).formula="=sum(A3:A22000)", akkor egy ciklussal a felesleges képleteket ki is tudod törölni.
Kösz. Bírni bírja a 2003. A programsor is egyszerű:
Application.Sum(Range(ws.Cells(i, 3), ws.Cells(i, utolsóoszl))), ahol ws as adott worksheet, az i pedig az egyes sorok sorszáma.
Az sem gond, hogy a 3-utolsóoszl között ciklusváltozóval végigszaladok és külön változóba gyűjtöm a 3., 6., 9., 12. stb, illetve egy másikba a 4., 7. stb., és egy harmadikba az 5., 8. stb értékek összegeit.
Csak reméltem, hogy van valami elegánsabb megoldás.
Én valszeg azt csinálnám, hogy lenne a Munka1 a havi adatokkal, és egy ugyanolyan szerkezetű Munka2 a kumuláltakkal. Megnéztem egy ősöreg XP-n excel2003-mal, játszva elbírja. Az automatikus számolást persze érdemes kikapcsolni.
Igen. Eddig nem használtam, és nem ismerem as Accest. Az jövő évi terv. AZ adatok Excelben vannak, a programot még ma szeretném megírni. Még 1-2 óra és meg is lesz. Ha más mód nincs, akkor elviselem, hogy ciklusban kicsit lassan fut le. Végső soron úgysem kell sokszor használni.
Szóval inkább elvi céllal érdekel, hogy van-e rá megoldás az Excelben.
Van egy nagyméretű táblázatom. Benne 3-3 oszlop a eladott darabszám, eladási át és összérték ismétlődik havonként, majd ugyanez több éven át. Szeretném összegezni őket csoportonként, azaz a darabszámok összegét és az összértékek összegét megkapni. Tehát az első oszop után a negyedik, és azt követően mindig 3-al emelve az oszlopszámot. Illetve ugyanezt a 3. oszoptól indítva, szintén hármasával léptetve.
Természetesen ciklusban ez nem okoz gondot, de egyrészt nem elegáns, másrészt mintegy húszezer sorral kicsit lassú, és mindezt több mint 30 fájlban kellene. Van erre valamilyen elegáns és gyors megoldás?
A szöveggel számoláshoz excel 4 makrófüggvény kell.
Pl. Az A2 cellában: 5+5
Az eredményt a B2 cellában szeretnéd látni, akkor :
Jelöljük ki a B2 es cellát! Ezután kat- tintsunk aKépletek/Név megadása - majd Név megadása...
Az ablak tetején lévő mezőben ad- junk meg egy találó elnevezést, pl. "számít" Ezután aktiváljuk a lenti Hivatko- zás mezőt, és töröljük ki a tartalmát! Utána írjuk bele a következő szöveget: =KIÉRTÉKEL(A2) Ezek után Hozzáadás, majd OK. Az A2-es cellában található szöveges feladat kiértékeléséhez adjuk meg a B2- es cellában a következő képletet: =számít Miután megnyomtuk az Enter billentyűt, megjelenik a kívánt eredmény a cellában.
Ezt a képletet a már megszokott mó- don átmásolhatjuk a B2-esből más cel- lába, vagy használhatjuk az automati- kus kitöltés lehetőségét, s így akár több szöveges számolási feladatot is elvégez- hetünk.
Van olyan cella, ami tele van írva szöveggel. Ha rámegyek arra cellára, elfoglalja a fél képernyőt. Persze más munkafüzetnél visszakapcsolom, ahol nem takarja ki.
Egy oszlop néhány cellájába írnék több számot, pl így nézne ki:
pl A2 cellába: 100+300+150
A3 cellába: 400
A4 cellába: 150+200
Igenám, de így nem tudom SZUM fügvénnyel összeadni. Ha = jelet teszek a cellákban, akkor tudom SZUMmázni. Viszont akkor nem látszik, hogy milyen összetevők vannak.
Szóval az lenne a lényege, hogy F2 nyomása nélül látszódjanak ezek a tételek "100+300+150" stb. és össze is lehessen adni.
Kösz. A mérőműszeres példáddal megnyugtattál, hogy nem olyan nagy égés, hogy nem ismertem a 2 bájtos beolvasást. Mivel még csak olyan műszerrel találkoztam, ami helyből felajánlotta az excelbe tölthetőséget, amivel még én is megbírkóztam :))).
Képzeld el, hogy van egy elektronikus hőmérő, ami fájlban tárolja a mért adatokat. Például másodpercenként egy mért értéket, éspedig előjeles, kétbájtos egész formában. Amikor olyan programot írok, amivel ezt a fájlt akarom feldolgozni, be kell olvasnom a fájlból az adatokat. Van két lehetőségem.
1) Beolvasom bájtonként (High Byte és Low Byte), az eredmény pedig = High Byte * 256 + Low Byte. Csak itt még külön figyelnem kell a High Byte első bitjére, ami az előjelet takarja.
2) Beolvasom Integer változóba, ami két bájtos, előjeles ábrázolási mód, és ha szerencsém van, akkor automatikusan kezeli az előjelet, és nem kell szenvednem vele.
De ez mindig lutri. Ha lekódolod, hogy a program olvasson be két bájtot egy integer vltozóba, akkor melyik lesz elöl: a High Byte, vagy a Low Byte? Pl. Ha ez a két bájt jön a sorban: 11, 65 (hexadecimális számok) akkor azt 4453-nak, vagy 25873-nak fogja venni? Azt hiszem, ez programnyelv-függő, szóval mindig kísérletezni kell vele. Egyszer írtam egy jó kis programot Delphiben, ami egy mérőműszer adatait dolgozta fel, abban használtam ezt a módszert. VBA-ban talán még sosem kellett.
Jimmy kösz. Így már értem. Az a variáció eszembe se jutott, hogy már maga a szorzás overflow-t eredményez. Az integer negligálás javasoltságáról idáig nem hallottam. Ezentúl nem fogom használni. És végezetül hagy kérdezzem, azon mit kell érteni, hogy bináris file-ból 2 byte-s adatok beolvasása?
Gondolom az integer itt maradt a 8 és 16 bites korszakból, amikor az adat és parancsszélesség a mai gépekhez képest alacsony volt(a belső adat bus szélesség ugyanis ekkora volt), amikor még spórolni kellett a memóriával. Aki ismeri az akkori hardwareket azoknak ez egyértelmű. Tehát ahogy te is használod érdemes a számértékek megjelenítésére long vagy egyéb nagyobb számérték megjenítésére alkalmas numerikus változókat deffiniálni ugyanis ezeknek a lefutását ma már nem korlátozza a belső adat bus szélesség azaz a számértékek 32 vagy 64 bit szélességben egyidejüleg hajtódnak végre azaz nem lassitják a gépet.
Az első esetben a és b integer, tehát az a*b műveletet integer változókkal akarja elvégezni, és ez már önmagában overflow-t okoz.
A c változóig már el sem jut. Próbáld ki c nélkül:
a = 2: b = 20000
MsgBox a*b
A második esetben double a és integer b összeszorozható, de az eredmény már nem fér el c-ben.
Az okosok azt szokták mondani, hogy felejtsük el az integer típust. Folyton csak a probléma van vele, azon kívül a program futását is lassítja, szóval mi haszna? Én minden egész változót Long típusúként deklarálok már évek óta. Integert kizárólag olyan (ritka) esetekben használok, amikor bináris fájlból kell kétbájtos adatokat beolvasni. Ott sem mindig.
Nem egészen világos elöttem, hogy hogy milyen szabály szerint írja át a vba a változók exlpliciten meghatározott típusát. Az alábbi példában a szorzás mindkét Dim-nél overflow-t eredményez. De amíg ehhez az elsőnél át kell írnia Dim c#-t, addig a másodiknál meg változatlanul kell hagynia a c%-t. A kérdésem tehát, hogy milyen szabály szerint alakul a változók típusa?
Szerintem nem zavaró, inkább vicces :) Elképzelem, hogy mi lehet mögötte: egy lelkes ember, aki annyira bír lelkesedni, hogy minden mondat szinte kirobban belőle :))
Mivel olyan kort írunk, amikor az ember már a levelet indító megszólítás után sem meri kitenni a felkiáltójelet, nehogy sértőnek, agresszívnek, stb. tűnjön, a hsz-eid tulajdonképpen üdítő változatosságot jelentenek :)
Tudnátok segíteni abban, hogy képlettel meg tudom-e azt csinálni, hogy darabteli függvényt még szűröm dátumra is.
Az alaptáblám ez, de van kb. 15 munkalap, s mindegyiken van több adat (van ahol 100 sor is van):
Munka1
xxx AB 2012.08.01
yyy CD 2013.10.10
zzz AB 2013.10.22
Munka2
xyz CD 2013.11.02
Azt csináltam eddig, hogy Darabtelivel összeszámoltatttam egy összesítő munkalapra, hogy Munka1 B oszlopában van 2db AB, 1 CD. De itt, így nem tudom, hogy mikor dátummal.
Így néz ki:
AB CD EF
Munka1 2 1 0
Munka2 0 1 0
Munka3
stb.
Azt szeretném kiíratni, hogy 2012-ben hány db AB van. (vagy épp 2013-ban) Ezért ezt kellene még szűrni úgy, hogy dátumra is be tudjam állítani. Tehát ha azt adom meg, hogy 2012, akkor nem 2 AB lesz, hanem csak 1,mert a többi nem abban az évben volt.
Gyakoraltilag úgy kellene, mint egy Kimutatásnál, hogy ott a dátumra tudok szűrni, s akkro csak azt jeleníti meg. Csak képlettel vagy szűrővel.
Private Sub GépINF1_Click()! sor = Application.Match(Me.Gépszám1, Range("C:C"), 0)! If VarType(sor) <> vbError Then! ActiveWorkbook.FollowHyperlink Cells(sor, "I").Hyperlinks(1).Address, NewWindow:=True! End If! End Sub!
Sikerűlt megoldanom a dolgot a következőképpen! Ha netán valakinek szüksége lenne rá:
Private Sub GépINF1_Click() sor = Application.Match(Me.Gépszám1, Range("C:C"), 0) If VarType(sor) <> vbError Then ActiveWorkbook.FollowHyperlink Cells(sor, "I").Hyperlinks(1).Address, NewWindow:=True End If End Sub
Sziasztok! Sikerült elkjészíteni a táblázatomat, (hatalmas köszönet Delila10-nek)! Minden funció, amit akartam, működik rajta! Munkatársaim nagy örömére :) ! Volt viszont egy kérésük, hogy az adatok bevitelére egy ablakot lehetne-e használni? Elkezdtem Userformos "önoktatásomat" és sikerült megcsinálnom úgy, hogy az adatokat azon az ablakon keresztül lehessen bevinni! Viszont:
A táblázat fő tulajdonsága az, hogy bizonyos oszlopok sorainak kitöltésekor egy másik oszlopban megjelennek az adatok, a bevitt elemhez! Az adatok persze egy hivatkozás, amire rákattintva egy txt, vagy doc típusú file-t nyit meg! Szóval userformos ablakomon elhelyeztem 3 gombot és szeretném, ha az adatok bevitelekor a megjelent hivatkozások ezekkel a gombokkal megjeleníthetőek legyenek! Mindig az aktuális sor hivatkozásai! Szóval, a gombhoz milyen parancssort kellene beírnom, hogy az adott oszlop utolsó kitöltött cellájában lévő adatot megnyissa?
Én is köszönöm a korrekciót. Elsősorban azt, hogy a sor/oszlop long és nem integer. Mert az emiatti hiba korrekciójával biztos sokáig eltökölnék :)))).
Arra persze figyelni kell, hogy a Munka1 helyére a kívánt munkalap neve kerüljön. És nyilván lehet olyan eset, amikor azt akarjuk, hogy mindig az aktív munkalapon induljon a makró. Ilyenkor akkor a ThisWorkbook.Worksheets("Munka1") rész nem kell, tehát az eredeti megoldás részben jó.
De a "Set itt_van = ...." szerkezet használata továbbra is indokolt.
Ez a megoldás azért nem tökéletes, mert csak az aktív munkalapon működik, és ott is csak akkor, ha van rajta "XY" részértékű cella. Máskülönben hibára fut, és az nem mutat jól egy makróban. Helyette ajánlanám az alábbi megoldást. Kicsit többet kell hozzá gépelni, de cserébe nem fog csütörtököt mondani.
Bizony így van. És ez nagy hibája az autószűrőnek. Mert azért úgy illene, hogy a 255 karakternél hosszabb stringekből is lássa az első 255 karaktert. De valamiért erre nem készítették fel. Az írányitott szűrőnek azonban 32 ezer karakterig nincsenek ilyen korlátai.
Ja, hogy te az e-mailre gondolsz! Bocsi, privinek a belső üzenőket szokták hívni.
Hát két eset van: vagy megjelenik a "küld" az adatlapon, vagy nem. Ha nem, akkor az illetőnek nem publikus az e-mail címe, meg kell kérni, hogy ő írjon neked. Egyébként ha ide beírod egy kicsit megbontva a címet, nem kockáztatsz sokkal többet, mint ha az adataidnál publikussá teszed a beállításokban.
Ha van küld, és mégis hiába kattintasz rá, akkor nincs jól beállítva a levelező azon a gépen, jobb egérgombbal lehet a címet kimásolni.
Működött régebben, azóta is levelezek INNEN néhány fórumtaggal.
A hozzászólásban rákattintasz a fórumtárs nevére, feljön az adatlapja, ott egy "küld" szövegre kattintva már írhattad is a levelet. Most kattintgatgatok estig, nem történik semmi.