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.
Sziasztok! A kérdésem a követlező lenne: szeretnék készíteni egy olyan oszlopdiagramot, mint a mellékelt képen, hogyan tudnám megoldani azt, hogy itt például tantárgyi csoportonként mindig a legnagyobb értékű oszlop kerüljön előre (ami tegyük fel minden tárgy esetében másik hónap) és az csökkenő tendenciát mutasson a csoporton belül, tehát az informatikánál a balról jobbra haladva a lila, piros, zöld, kék sorrend, de ha egy másik tárgy esetén a piros oszlop a legmagasabb, akkor az kerüljön előre, és így látszódjanak az értékek? (Az egyszerű szűrővel rendezés azért nem jó esetemben, mert nem minden tantárgy esetében ugyanaz a tendencia a hónapokon végighaladva.) Köszönöm előre is a segítséget!
De a legegyszerübb megoldás, hogy a C oszlopban végigsorszámozod a rekordokat 1-től végig. Aztán csinálsz egy sorbarendezést az AI minősítő oszlopra. És Kész. El vannak választva. Ha vissza akarod kapni az eredeti sorrendet akkor újra egy sorbarendezés, most a C oszlopra. :)))
Miután megírtam a szűréses választ, beugrott hogy az excel nem hajlandó az írányitott szűrést másik lapra tenni. Ez egy kicsit megbonyolitaná a makróírást, ezért inkább javasonék egy egyszerűbb FKERES-es megoldást. Ehhez kéne egy kiegészító oszlop a táblázat elött. Tételezzük fel, hogy a C oszlopod üres. Ekkor a C4-be ez jön:
=AI4 & darabteli($AI$4:AI4;AI4), és ezt végigmásolod.
Ezután a következő lapokat A4-től sorszámozod 1-től akármeddig, az A1 cellába meg beírod a kritériumot: Pl. Megtartandó.
Ezután gombnyomás se kell, a munkalapokon up to date szét vannak választva a beszállítóid. A Hahibás üresstring miatt, ahol az Fkeres még nem talált adatot, ott az üresnek látszik. (Ezért én általában nem is "" -t használok hanem "."-t, hogy lássam meddig van képletekkel kitöltve az oldal.
Az oszlopNo-kat vagy manuálisan adod meg, vagy egy előre besorszámozott sorból származik, vagy akár az aktuális oszlop-1 képlettel határozod meg. Természetesen az A oszlopbeli sorszámok is kiválthatók a sor-3 kifejezéssel.
Még annyit, hogy a makrósítás esetén az alaptáblázat méretét jóval több sorra méretezném, mint az aktuális rekordok száma, hogy az új beszállítók esetén ne kelljen az adattábla méretezésével veszkődni. Vagy a másik megoldás: a makróban átírni a sorok számát jó nagyra.
Én három külön lapra történő írányitott szűrést csinálnék egymás utan. A megfelelt, az ideiglenes, és a megtartandó kritériumokra. És már szét is van osztva a táblázat. Ha ezt egy gombnyomásra akarnám elvégezni, akkor az első alkalommal bekapcsolnám a makrórögzítőt. Amit bekapcsolva hagynék a táblázatok kicsicsásítása közben is (esetleges fejlécek odamásolása, lapfülek megírása stb).
Adott egy elég terjedelmes táblázat, ahol a cég különböző beszállítói vannak felsorolva; sorokban az egyes beszállítók és oszlopokban a hozzájuk tartozó adatok (cégnév, cím, kapcsolattartó...., minősítés).
A feladat az lenne, hogy a beszállítókat minősítésük (Megfelelt, Ideiglenes, Megtartandó) alapján három, másik fülön lévő, "Megfelelt", "Ideiglenes" illetve "Megtartandó" táblázatba másolja át (a teljes sorokat).
Először síma Fkeres függvénnyel indultam neki, de rájöttem, hogy ez nem túl jó, hiszen így az egyes cél táblázatokban üresen maradnak azok a sorok, amikor az illető beszállító (minősítése alapján) éppen nem az adott táblázatba kerülne. Működik tehát, de a hézagos táblázatokat utólag "reszelni" kell, ráadásul ha a kiindulás táblázatba utólag beszúrok sorokat (új beszállókat), akkor a képletezést is folyamatosan másolni kell.
Megoldható lenne-e a probléma egy parancsgombbal, amelynek megnyomására egy VB modul (makró?) elvégezné a kívánt szétválogatást?
Mellékeltem egy képet az egyszerűstett táblázatról.
Az Fkeres numerikus adatokkal úgyanúgy működik mint a stringekkel.
A HAMIS módban (tehát amikor megtaláláshoz teljes egyezést igényel) a numerikus adatoknál ha nem találja meg amit szerinted meg kéne, gyakran az a hiba hogy a 16-ik tizedesben különböznek. Ezért ha a numerikus adataid számítottak, célszerű őket Kerekites (round) függvénnyel azonos tizedesszámra beállítani.
A stringeknél a stringvégi láthatatlan szóköz okozza leggyakrabban, hogy nem találja meg a keresettet. Ezt a trim függvénnyel küszöbölheted ki. Vagy a Helyette-vel (substitute).
Az ismétlődésekkel az a helyzet, hogy mindig az első megtaláltat adja vissza. Ha többször keresel rá, mindig ugyanazt az elsőt adja vissza, hiába szerepel a táblázatban esetleg többször. Tehát fontos, hogy a keresett táblázatban egy azonosítóhoz csak egy rekord tartozzon, (vagy a keresett tulajdonságra ugyanazt az adatot tartalmazza). Nálam gyakran előfordult, hogy egy kereső azonosítóhoz több keresett is tartozott, ezért csináltam anno egy makrót, amelyik az Fkeres lefuttatása után átnézi ilyen szempontból a listát, és az ismétlődéseket is kibányássza a táblázat aljára. Ha érdekel, előbányászom.
A kifejezetten téves találatok tipikus IGAZ módú FKERES hibák. (Míg a HAMIS módra a HIányzik hiba a jellemző). Ezért nem is értem, hogy nálad IGAZ módban hogy lehetett sok HIÁNYZIk hiba. Az IGAZ módú keresés ugyanis gyakorlatilag mindig teljesül, csak mint írtam az előző posztomban, könnyen hibás eredményt adhat.
Az Fkeres tanulmányozásához meg sok sikert. Érdemes megtanulni, mert nagyon hasznos.
Válaszoltam a mailban. Lenne még egy kis probléma a dologgal:) Makro nélkül nem lehet megoldani? Tiltva vannak a makrok a számítogépeken biztonsági okokból és nem tehetek semmit ez ellen:)
Szia! Köszönöm a választ, de nem jól magyaráztam el. Elküldhetem az excel fájlt, abban érthetően látszik,h mit szeretnék. Nem nehéz szerintem a dolog, csak én sehogy se tudok rájönni, hogyan tudnám megoldani. Adsz egy mail cimet légyszives?
Köszönöm a válaszokat neked és rhcpgergőnek is. Sajnos (vagy talán szerencsére?) nem jött össze sem így, sem úgy, sem amúgy. Talán azért, mert az FKERES inkább numerikus adatokra működik? Vagy a stringek több kérdést vetnek fel? Pl. az ismétlődés kezelését? Nem tudom. Mindnesetre kontrollálhatatlan eredményeket kaptam. Sajnos esetenként kifejezetten téves találatok is jöttek, azaz olyan névhez tartozó adatott mutatott, amelyik nem egyezett meg a párjával.
Ezért végül nekiálltam, és irtam rá egy kis keresőprogramot. Ezt talált is hibákat, ahol valóban nem stimmeltek a nevek, mert az egyik táblázatban némelyik másképp volt írva, mint a másikban. Meg voltak ténylegesen hiányzók is, ahogy jelezted nekem. De ezzel legalább össze tudtam hozni az összetartozókat. Igaz, elment vele néhány óra, de sürgős volt, hogy mára készen legyek vele.
Később azért majd tanulmányozni fogom az FKERES működését. Most legalább vannak megbízható adataim, aminek tudom az eredményét, nincsenek hibái, így tudok vele tesztelni.
Az A1-tol B6-ig terjedő táblázatnak az A oszlopában nevek szerepelnek, a B oszlopban pedig a nevekhez tartozó értékek. A D1-től E6-ig terjedő táblázat egy üres táblázat, aminek ha a D oszlopába beirom az első táblázatban szereplő nevek egyikét a D1-től D6-ig terjedő mezők egyikébe és a tőle jobbra levő cellába az osztandó értéket, akkor a következő cellába irja ki eredményül a két érték elosztott értékét. Egyszerübben:
1. táblázat: 2. táblázat
Név Osztó Név Osztandó érték Eredmény Ádám 4 Pl. beirom,h Dávid 12 ? Béla 6 vagy Zoli 18 ? Dávid 8 Sanyi 10 Zoli 12 Peti 14
Remélem érthetően magyaráztam el. Nagyon szépen köszönöm a segítséget!!!
Csak a rend kedvéért: Rájöttem, hogy az Fkeres IGAZ paraméteres módjának a kritérium relációját tévesen adtam meg. Az ugyanis nem >=, hanem csak >. Nem gondoltam át eléggé.
Az Fkeres az IGAZ feltétellel (vagy az azzal egyenértékű elhagyásával) csak akkor ad jó eredményt, ha az adataid szigorúan növekvő sorrendben vannak. Mivel ekkor a keresési kritérium nem =, hanem a >=. Amikor aztán a kritériumot kielégítő első cellát megtalálta, akkor nem erre a cellára, hanem az elötte levőre mutat. Stringek közt keresve nem igen van értelme e módnak, de számok esetén már gyakran. Például ha a legdrágább, de még 1000 ft-ból kifizethető pizzát akarod kiválasztatni az excellel, akkor az Fkerest-t IGAZ feltétellel érdemes használni, mert így akkor is eredményt fog adni, ha nincs pontosan 1000 ft-os pizza. Ami azonban csak akkor lesz garantáltan releváns, ha pizzák növekvő ársorrendben vannak.
Érdekes, hogy a fordítottját, tehát a "legkisebb, de még jó" feltételt (tehát <=) az Fkeresnél nem lehet beállítani, szemben mondjuk a HOL.VAN-nal.
Tehát, ahogy rhcpgergő írta, esetedben az Fkerest HAMIS feltétellel (vagy az azzal egyenértékű nullával) érdemes használni.
És még valam. A fentiek miatt úgy vélem, hogy amikor "a mintegy 100 név egy részében megtalálja a megfelelőt, sok esetben azt adja eredményül, hogy #HIÁNYZIK.", akkor azok zömmel valódi hiányzók. Ugyanis az IGAZ mód csak akkor ad HIÁNYZIK eredményt, ha a listának már az első eleme nagyobb mint a keresettt. Az összes többi esetben ugyanis talál eredményt, csak nem biztos hogy jót. És itt lehet a bibi szerintem akkor is, amikor az ismétlődő nevek közül az egyiket megtalálja, a másikat meg nem. Azaz hogy az ismétlődő nevek nem pontosan úgyanúgy ismétlödnek. Érdemes lenne leellenőrízned.
Amíg nem jövünk rá, hogy az excelt miképpen lehetne rábírni a dátumigényedhez igazodjon, addig talán hasznos lesz az alábbi makró. A currentregió exceldatumait írja át a kedvedre. A jelenlegi feltételbeállítással a 01.máj formátumot máj.01-re, amin persze könnyedén változtathatsz, ha szükséges.
Ha jól tudom, az excel az oprendszerből veszi az alapértelmezett dátumformátumot. A vezérlőpultban a regionális és nyelvi beállításoknál lehet vele szórakozni. Persze lehet, hogy nincs igazam, de egy próbát megér.
Nem, mert mindig másik táblázatban van. :-) Elég gyakran használok dátumot, és idegesít, hogy automatikusan ezt az ortopéd formátumot veszi fel, mintha a középkorban lennénk. Ctrl+Shift+3 nekem nem csinál semmit.
Hogy kell rávenni az Excel 2007-et, hogy ja csak begépelem, hogy 4/30, akkor ne alapértelmezetten 30.ápr formában jelenítse meg, amitől hányingerem van? A vezérlőpult beállításai jók.
Kipróbáltam azt a scriptet, amit küldtél. Elég érdekes volt az eredmény, legalábbis számomra. Igazából még mielőtt Alt-F11-et nyomtam volna, megnéztem, mi a helyzet egy üres táblázat esetén, és ekkor megvolt a jobb egér menüben a Hiperhivatkozás menüpont. Abban a táblázatban viszont, amit a júzernek használnia kéne, nincs meg, akár lefuttatom a scriptet, akár nem. Fogalmam sincs, hogy miféle trükk lehet egy táblázatban, ami eltünteti, de ezek szerint nem a program hibás, és nem is a felhasználó beállításai, hanem a táblázatban lehet a bibi valahol (kipróbáltuk egy másik lapon is, és ott is ugyanez volt a helyzet). Ha esetleg erre volna ötlet, azt is megköszönném. A júzer azt mondta, megpróbálja átmásolni az adatokat egy másik táblázatba, de ennek az eredményét nem vártam meg. Igazából nem is annyira fontos, mert így is tudja használni, most már kétféle módon is, de a probléma azért még érdekel minket.
Kicsit kezdő vagyok ebbe még nem csináltam kérlek a vasco3@freemail.hu címemre vezesd le nekem ha nem zavarlak naggyából értem de mikor és mit másoljak és hogy az nem tiszta
Mindekettőbe megtalálhatók azonos cikkszámok de az egyikbe mondjuk 10000 cikkszám a másikba 5000 cikkszám van és ehez kacsolodnak árak is! Hogyan tudom átmásolni a kisebbik exceltáblát a másikba, hogy lecserélje az azonos cikkszámot és a mellete lévő oszlopba melléirja az árakat?
Akadt egy új problémám, segítséget kérek: Egy listboxban szeretném programból beállítani a kezdőértéket.
Erre a ListIndex tulajdonságot használom. Csak az a gond, hogy valamiért nem érvényesíti, hanem továbbra is az első elemre ugrik. Ha viszont valahogy megállítom a programot. Pl. egy Break beállításával, vagy a ListIndex utáni sorba egy msgbox "valami" paranccsal, akkor már érvényre jut.
Mi a megoldás, hogy érvényre jusson a default érték?
Ez az. Gubanc van sajnos. A Personal végig ott volt az általad javasolt mappában (is). De ami az igazi fejtörést okozza, hogy tegnap még minden külön hókusz-pókusz nélkül behivódott. És nem emlékszem semmi rendkivülire, ami előidézhette ezt a gubancot. Azon töprengek, hogy nem kellene-e újra istallálni az excelt.
Kösz. Sajnos hiába jelöltem ki indítókönyvtárnak. Semmi. Kipróbáltam az Office11\Library-t is. Abból elindult. Ahogy a c:\aaa-ból is. Szemben a két indításra rendszeresített xlstart-tal. Jó lenne tudni az okát.
Egy elég furcsa problémába futattam bele. Mi lehet az oka?
Az XP gépemen futó excel2003 egyik napról másikra nem hvta be indításakor a Personal.xls makrófüzetet. Megnéztem a Beállításoknál az indító könyvtár megnevezését: üres volt. Valahogy kitörlődhetett, gondoltam. Ezért Beírtam: C:Program FilesMicrosoft OfficeOffice11xlstart. |gy se hívta be, noha az indítókönyvtár megnevezést most nem radírozta ki. Erre Personal.xls-t átraktam egy C:aaa nevű mappába, és ezt neveztem meg indítókönyvtárként. Innen normalisan indult. Mi történhetett az xlstart könyvtárral? Javítható-e?
2. A belső modul alatt az űrlap saját kódmodulját értettem, mivel ez az, amit űrlap, mint komplett objektum, tartalmaz. Külső modul pedig az, ami az űrlapon kívül van, tehát gyakorlatilag minden más.
1. Nem kell nagy dolgokra gondolni, ugyanaz a lényeg, mint a függvényeknél. Tulajdonképpen a form felfogható úgy is, mint egy függvény. Bemenet az, amit beadsz neki, pl. kiindulási értékek, a form pedig valamilyen algoritmus alapján előállítja a hasznos értéket, amit aztán kiveszel belőle és használod. Ez utóbbi a kimenet.
Például (egy klasszikus adatbázis feladat):
Van egy elsődleges (adatbeviteli) űrlapom, amelyen a felhasználónak ki kell töltenie a mezőket. E mezők közül több olyan, hogy nem tetszőleges érték megy bele, hanem listából választható, de nem feltétlen ugyanabból a listából. Például az üzleti partnert az üzleti partnerek listájából, a feladat felelősét a dolgozók listájából, az alkatrészt az alkatrészek listájából, stb. Erre a célra tervezek egy másodlagos űrlapot, ami az összes ilyen listából választósdit kezelni tudja.
Ebben az esetben a függvény (avagy másodlagos űrlap) bemenete az az SQL lekérdezés lesz, amivel a választható értékek listáját elő tudom állítani az adatbázisból. A kimenet pedig az az érték, amit a felhasználó kiválaszt a listából.
Az űrlap belső modulján (lásd 2. pont) megírom az összes kódot, ami a bemenetet lekezeli. Nagy vonalakban:
- lekérdezem az adatbázisból az SQL alapján választható rekordok halmazát
- a rekordhalmazból megállapítom, hogy hány darab oszlop (mező) van
- létrehozok egy listboxot a másodlagos űrlapon, amely a választható értékeket tartalmazza, annyi oszloppal, ahány az adathalmaz megjelenítéséhez kell
- betöltöm az adathalmazt a listbox-ba
- megírom az összes kódot, ami a felhasználó kattintgatásaira reagál, köztük sorbarendezési, szűrési lehetőségeket
- megírom az összes hibakezelő és a felhasználó lecseszéséért felelős programrészt
- megírom azt a kódot, ami az OK gomb megnyomására a felhasználó által kiválasztott értéket előállítja, és visszaadja az elsődleges űrlapnak.
Ebben az a jó, hogy akármelyik projektemben fel tudom használni, ahol ilyen listából választósdi játék van. Csak annyit kell tudnom, hogy mit kell beadnom az űrlapnak, tehát mi a bemenet, és hogy a kimenetet hogyan, milyen formában kapom vissza. Az űrlap belső működését akár el is felejthetem (ha sikerült egyszer jól megírni).
Egyébként az összes beépített objektum és függvény, amivel találkozol, így működik. A súgóban le van írva, hogy milyen bemenő paraméterek kellene hozzá, és hogy a kimenetet milyen formában kapod meg.
A felbontásról.
Ez elég fogós kérdés. Amikor egy ablak különböző felbontásokon is működik, ott többnyire csak arról van szó, hogy felnagyítják/lekicsinyítik a méreteket. Pl. egy kép simán skálázható, vagy egy szövegdoboz is, legfeljebb több/kevesebb szöveg fér bele. Ha viszont egy 1280x1024-as űrlapot zsúfolásig megtömsz vezérlőkkel, bajosan tudom elképzelni, hogy azok el fognak férni 1280x800-on. Ha szellősebben vannak a vezérlők, esetleg egy átrendezés segíthet, de nekem nincs olyan algoritmusom, ami ezt elvégzi.
Igazából két lehetőséget látok. Az egyik, hogy csökkented a form méretét más elrendezéssel, vagy multipage használatával. A másik, hogy csinálsz egy tök ugyanolyan formot más felbontásokra optimálva, és mindig azt használod, ami éppen kell. Ez elég macerás, mert ha az egyiken módosítasz, azt át kell vezetni az összes többire is.
A kekeckedés nem zavar. Sőt, örülök, mert olyan dolgok végiggondolására késztet, amelyek magamtól nem jutottak volna eszembe.
Azért sajnos itt nekem alapfogalmaim hiányoznak.
1. Függvényeknél természetesen tudom, de formoknál fogalmam sincs mi a ki- és bemenet. És nem találtam utalást rá hosszas keresgéléssel sem.
2. A külső/belső modul fogalmával sem biztos, hogy tisztában vagyok. Én azt hittem, hogy azzal, hogy ha ugyanabban a munkafüzetben hozom létre a formokat és az általuk meghívott függvényeket tartalmazó modult, akkor az belső modul. És ha átviszem másik gépre a munkalapot, akkor az ott is van. Ki is próbáltam, és minden további nélkül működik a program.
Viszont a kipróbáláskor beleütköztem egy új problémába. A képernyőm felbontása 1280x1024. A másik gépé, amin kipróbáltam, 1280x800, mert ott a harver ennyit enged. Programozáskor a formot a teljes képernyő méretére állítottam, és a kilépés gombot az aljához közel helyeztem el. Viszont a másik gépen futás közben nem látszik ez a gomb. Próbáltam keresgélni megoldást, de nem találtam.
Az világos, hogy 1024 pontot nem lehet elhelyezni 800 ponton. De feltételezem, hogy van valamilyen megoldás erre, hiszen sok program működik különböző felbontások mellett. De fogalmam sincs merre induljak el a megoldás keresésében.
kész van az excel táblám, most pedig szeretném ellátni lapvédelemmel, da van benne egy makrós legördülő menü, és ha levédem akkor nem lehet változtatni rajta. de ha jobb klikk vezérlő formázása védelem nincs kipipálva de mégsem lehet lapvédelem alatt módosítani
Picit kekeckednék azért, mert jobb ma egy véreb, mint holnap kettő.
A form kódjának áttekinthetősége egy dolog, más dolog a hordozhatósága. Van úgy, hogy az ember csinál egy formot egy adott feladatra, aztán pár hónappal később jön egy másik feladat, ahol hajszálra ugyanaz a form jó lenne, vagy csak minimális változtatásokkal. Ha az első feladatnál hordozhatóra írtad meg, akkor könnyű átvinni. Ha nem, akkor nem annyira.
A hordozhatóságnak (vagy más szóval újrafelhasználhatóságnak) ebben a kontextusban ilyen kritériumai vannak:
1) A form jól definiált bemenetekkel és kimenetekkel rendelkezik.
2) A form tartalmazza az összes kódot, ami ahhoz kell, hogy a felhasználóval kommunikáljon, illetve a bemenetekből a kimeneteket előálltsa.
Ha a formról olyan függvényeket hívsz meg, amelyek külső modulon vannak, a 2. feltétel nem teljesül. Ez nem feltétlenül probléma, csak fel kell jegyezni valahová (célszerűen a form kódlapjának tetejére commentben), hogy a form csak az ilyen-olyan külső modullal együtt használható. Aztán ha kell, akkor együtt vinni mindkettőt a következő alkalmazásba.
De különben, ha csak egy adott form használ egy adott függvényt, akkor azt a form saját kódlapján is el lehet helyezni, Private megjelöléssel. Akkor kívül esik az eseménykezelő rutinokon, és nem zavarja az áttekinthetőségüket, de mégis a form része marad.
Még annyit a függvények önálló modulba gyűjtéséről, hogy nagyon nagy segítség. Kiválóan áttekinthetővé tudom ezzel tenni a formok eseményeinek programozását. Mert nem csak azokat feladatokat teszem ki, amelyeket több form is használ, hanem áttekinthetőbbé tudom tenni az egyes események vezérlését. Érthetőbbé tudom tenni az események vezérlését és csökkenteni tudom a kódjaik méretét. Nagyon jó!!!
Köszönöm. Egyelőre csak meg akarom érteni. Mert egyelőre látva, hogy mennyire bonyolult, feladtam ezt az elképzelést, és inkább létrehozok egy "átmeneti" munkalapot. Ide írom a módosult adatokat az eredeti munkalappal azonos szerkezetben, és mentéskor csak bemásolom ezt a sort az eredeti munkalapra. Egyébként adatnyilvántartásról van szó, tételenként mintegy 50 adattal. És a felhasználókat meg szeretném kímélni attól, hogy az Excel táblázatban bogarászva kelljen azt kitölteniük.
1) Userform2-n deklarálni publikus változókat, és azoknak értéket adni
2) Property-k használata.
Most nem írnám le részletesen őket, inkább mondd el, mi a célja, mire akarod használni.
Függvények:
Alapvetően azt kel sztem bekódolni egy Userform-ba, ami logikailag oda tartozik. Ha van egy függvényed, amit több form-ból is szeretnél elérni, az nem tartozik logikailag egyikbe sem. Az ilyen függvényeket én kiiraknám egy normál modulba, publikusan. Akkoraztán akárhonnan meghívhatóak.
Köszönöm. Szép kifejtés volt. Az túlzás, hogy értem, mindenesetre kipróbáltam és működik. És most próbálom értelmezni.
A mintapélda rról szól, hogy a meghívott Userform át tud adni adatokat a meghívónak. Azt viszont nem tudom kibogozni, hogy ez működik-e úgy is, hogy ez oda-vissza megtörténjen? Mert olyasmiben gondolkozom, mint a klasszikus funkcióknál. Hogy a hívó átad egy paramétert a meghívottnak, az pedig módosítja az értéket és azt visszaadja. Ehhez a mintában nem találtam meg a kulcsot.
A másik - tegnap késő esti - kérdésem azt hiszem, megoldódott a leírásod alapján. "...az adatok átadását a Form-ok között ... eseményekhez kötjük." Ebből az következik számomra, hogy a Formok között a függvények nem átjárhatók, tehát nem oldható meg, hogy egy adott függvényt csak az egyik form kódjában szerepeltessek, és azt a másik form kódjából is meg tudjam hívni. Jól értem?
sziasztok, teljesen tanácstalan vagyok, kellene csinálnom egy excelt, amiben legordülö menük vannak.
es van hozzá egy táblázatom, amiben benne vannak az adatok, a cel az lenne hogy a végén ha a legördulö menuben mindent kivalasztottam akkor egy eredmény kijöjjön.
pl kiválasztom, egy oszlopban melyik ország akkor azt szeretném ha odaírná mellé a pénznemét, de az országnak van egy szorzó száma is, meg egy kódja is es azt is odaírná. fkeressel próbáltam, de az egy cállát ir csak mellé.
Ajánlom mindazok figyelmébe, akik a "Class Module = megfejthetetlen talány" című műsorban érdekeltek.
Alapvetően a Userform a Class Module-hoz hasonlóan egy objektumosztályt jelent. Amikor azt mondjuk, hogy Userform1.Show akkor valójában az Excel létrehozza a Userform1 nevű objektumosztály egy példányát, amit alapértelmezés szerint ugyanúgy ("Userform1") hívnak, és azt jeleníti meg. Tehát a konkrét műveletet sosem az objektumosztállyal, hanem annak egy példányával végezzük. Legalábbis ezt gondolom, mert leírva nem találtam sehol. Mindenesetre egy Userform1 típusú form megjelenítésének szabályos módja az alábbi lenne:
Dim UF As Userform1 Set UF = New Userform1 UF.Show
Ez azért lényeges, mert ugyanabból az objektumosztályból tetszőleges számú példányt létrehozhatunk, és ez igaz a "Userform1" nevű objektumosztályra is:
Dim UF1 As Userform1, UF2 As Userform1 Set UF1 = New Userform1 Set UF2 = New Userform1 UF1.Show UF2.Show
(Mindkettő egyszerre csak akkor jeleníthető meg, ha a Userform1 osztály ShowModal tulajdonsága False.)
Na most. Az objektumorientált programozásban az egyes ineraktív objektumok történéseit, felhasználói beavatkozásra adott reakcióit az objektum eseményein keresztül lehet kezelni. Ilyet már mindenki látott, pl. a Munkalap típusú objentum Worksheet_Change eseménye személyében.
Kézenfekvő, és szerintem elegáns és konzisztens megoldás az, ha az adatok átadását a Form-ok között ilyen eseményekhez kötjük.
Ehhez szükséges, hogy az adatot átadni szándékozó Userform-on definiáljunk egy publikus eseményt. Ez nem olyan esemény lesz, ami a felhasználó kattintgatásaira reagál. Ezt az eseményt programból váltjuk ki, de a formon belül. Ugyanakkor a formot meghívó külső egység fogja érzékelni, hogy itt esemény történt, és kezelni azt.
A gyakorlatban hogy néz ez ki.
Van 2-féle Form tervező üzemmódban összerakva: Userform1 és Userform2. Userform1 az elsődleges űrlap, ez hívja meg majdana másodlagos űrlapot. Userform1-en legyen - egy gomb, amelynek neve Btn1 - egy textbox, aminek neve TextBox1
Userform2 a másdolagos űrlap, ebbe kell a felhasználónak adatokat beírni, és ez adja majd vissza az adatokat az elsődleges űrlapnak. Ezen az űrlapon legyen - 4 db Textbox, amelyeknek neve: Txt1, Txt2, Txt3, Txt4 - egy gomb, amelynek neve btnReturn
Userform2 kódlapján, lehetőleg a lap tetején definiáljuk a "Visszatérés" nevű eseményünket:
Public Event Visszatérés(Érték1 As String, Érték2 As String, Érték3 As String, Érték4 As String) Lényeges, hogy Public legyen, mert csak ekkor látszik kifelé, a létrehozó felé. A Userform2 összes többi, gyárilag definiált eseménye Private, ezért nem is látszik kintről.
Szintén Userform2 kódlapján definiáljuk, hogy a btnReturn gomb megnyomása kiváltsa ezt a bizonyos űrlapeseményt: Private Sub btnReturn_Click() RaiseEvent Visszatérés(Me.Txt1, Me.Txt2, Me.Txt3, Me.Txt4) End Sub
Userform1 kódlapján (legfelül) először is deklarálunk egy Userform2 típusú változót.
Private WithEvents UF As UserForm2
A WithEvents kapcsoló kötelező, ellenkező esetben nem tudjuk Userform1-ről kezelni az UF objektum eseményeit.
Aztán Btn1-hetz rendeljük az űrlap megjelenítését: Private Sub btn1_Click() Set UF = New UserForm2 UF.Show End Sub
Amint a Private WithEvents UF As UserForm2 deklarációt beírjuk, a kód-ablak fölötti, bal oldali lenyílóban megjelenik az UF objektum, amit ha kiválasztunk, a jobb oldali lenyílóból ki lehet választani az UF valamely eseményét. Mivel UF-nek csak egy eseménye van definiálva, jelenleg nincs sok választási lehetőség, de amúgy lehetne.
Leprogramozzuk az eseményt: Private Sub UF_Visszatérés(Érték1 As String, Érték2 As String, Érték3 As String, Érték4 As String) Me.TextBox1 = Érték1 & "-" & Érték2 & "-" & Érték3 & "-" & Érték4 Unload UF End Sub
Használat közben akkor mi is történik? Usefrom1 létrehoz és megnyit egy Userform2 típusú objektumot, mely utóbbi neve UF. A felhasználó az UF-en beírja az adatokat a 4 szövegdobozba, aztán megnyomja a gombot. A gombnyomás (mert így programoztuk le a gomb eseményét) kiváltja az UF űrlap Visszatérés nevű eseményét, amely magában foglalja 4 paraméter átadását. A Userform1 érzékeli, hogy az UF-en publikus esemény történt, és mivel van hozzá eseménykezelő rutin írva (Private Sub UF_Visszatérés), azt végrehajtja, és ennek keretében beírja a TextBox1-be a UF által visszaadott 4 sztringet kötőjellel elválastzva. Aztán bezárja az UF űrlapot. (De akár nyitva is hagyhatja, ha éppen arra van szükség.)
Az adatok visszadása bármilyen lehet. Sok adat esetében érdemes tömböket összeállítani, és/vagy egyéni típusokat használni, és akkor egy-két változóban többszáz vagy többezer adat átadható a másik űrlapnak.
Ha simán megosztok egy táblázatot, akkor ugye bárki más is le tudja venni a megosztást, nem csak az eredeti megosztó személyiség?
Valamint ha van egy megosztott táblázatban egy szürke pipa a megosztásnál, és senki nem tudja levenni, annak mi lehet az oka, és hogy lehet gyógyítani?
Előre is köszönöm. És ha nem vagyok nagyon telhetetlen, akkor ugyanez függvények vonatkozásában is érdekelne, hogy ne kelljen több helyre bemásolnom az ismétlődő függvényeket. Nem mintha nagy munka lenne, de hát az igényes, struktúrált programozás kritériumainak nem igazán felel meg.
Nagy gondban vagyok. Hogyan lehetséges a különböző UserFormok között változókat továbbadni. Reménytelenül keresgélea google-ban. Olyan tanácsokat látok, amire magam is gondoltam, csak éppen nem működnek.
- Próbáltam az első használt UserFormnál (ahonnan a többieket hívom) Public-nak deklarálni, de nem segített.
- A másik tanács az volt, hogy a General Deklarációknál kellene Public-ba tenni, de nekem az sem működött.
- Volt olyan tanács is, hogy az egyes vezérlőelemek tag-jébe kell írni. De ez sem jött be, mert a vezérlőelemet nem tudom elérni egy olyan UserFormban, amelyikben nem szerepel.
Végső soron megoldás lesz, hogy egy átmeneti munkalapon tárolom a kb. 50 változómat, de valahogy nehézkesnek érzem, és semmiképpen sem elegánsnak.
Mellesleg a végleges helyükre azért nem akarom kiírni, mert erre csak akkor kerítenék sort, mikor az operátor kéri a mentést. Minél kevesebb esélyt szeretnék adni félbemaradt mentésre.
A tegnap lementett fájlom ma azzal az üzenettel örvendeztett meg, hogy a beolvasáskor az Excel olvashatatlan tartalmat talált a benne és akarom-e hogy kijavítsa. Akartam. Kijavította. A problémám csak az, hogy a hibajelentésből nem derűlt ki, hogy melyik rekordot törölte (látszólag semelyiket).
Tudna valaki segíteni a hibaüzenet értelmezésében?
Szóval az a probléma, hogy másnap reggel 2 filet is találsz a mappában? Egy készlet.xlsx-t és egy készlet(ütközés).xlsx-t? Még ilyennel nem találkoztam.
Lövésem sincs mi lehet a háttérben. Egy ötlet: Végig gondolnám a 29 munkafüzet kereszthivatkozásait. Hátha azok okozzák az ütközést.
Eddig még semmilyen kérdésbe nem futottam bele. Egyszer csak (többnyire másnap reggel) látom, hogy készlet.xlsx és készlet[ütközés].xlsx. Természetesen jó dolog, hogy nem irogat random mód felül dolgokat! :) De jelenleg 29 MF-ből áll és tartok tőle hogy valami fontos változtatás az egyik excel-be a másik fontos változtatás az üzközésesben hajtom végre... Ezért szeretném valahogy megoldani hogy rákérd mielőtt létrehozza. Vagy legalább abban a pillanatban figyelmeztet és nem egy egész napi munkát kell összehasonlítani, hogy mi is az eltérés.
Én inkább úgy gondolkodnék, hogy létezik-e olyan vezérlőelem, amivel ez a feladat megoldható. Ha van, akkor azt Excelből is lehet használni. Rengeteg custom vezérlő van. Ezek úgy készülnek, hogy valaki leül és megírja pl. C++ vagy Delphi nyelven, aztán közzéteszi. Nem biztos, hogy a MicroSoftra kell várni ez ügyben. Aztán persze lehet, hogy meg kell venni, de ez van.
Ha meg nincs olyan, ami kell, még mindig meg lehet írni SK. Príma lehetőség a Class Modulok felhasználására :)
Hát, a pivot jó is meg nem is. Próbálkozom vele még mindig. Nem igazán erre találták ki. Egy nagy faszerkezet karbantartása/módosítása nehézkes.
A Microsoft Treeview Control-nak utánanézek.
Kell hogy legyen valami, szerintem alap. Excelben nincs ilyen funkció, nem is erre való egy táblázatkezelő, de valamilyen más környezettel együtt kell hogy legyen valami. (Pl. MS Visio, vagy valamilyen xml-es lehetőség excelen belül akár)
Szintén kötelességemnek tartom közkinccsé tenni, mert ez is nagyon jól használható a UserForm vezérlőelemek megismerésében. És ez azokat is elmagyarázza, amelyek a korábban belinkelt ozgrid féle anyagban (http://www.ozgrid.com/Excel/free-training/ExcelVBA2/excel-vba2-index.htm) nincsenek részletezve.
Az AfterUpdate akkor indul, mikor bevitted az adatot, és a következő objektumra lépsz. Ha nincs a formon következő objektum, nem indul az eseménykezelő makró. Valószínűleg ez történt.
A ControlSource feladatát jól értelmezed. Egy ComboBoxnak legegyszerűbben így adhatod meg a listát a RowSource tulajdonságnál, amiből majd választhat a júzer.
A lentebb említett VL, VT, FL és FT Visible tulajdonságait eleve False-ra állítottam.
A wiki egy általános fogalom, kb. mint a táblázatkezelő. Én a konkrét wikiszoftverek közül a MediaWikire esküszöm, amelyik a Wikipédiát is hajtja. Szabad szoftver, kell alá PHP meg MySQL, ha egyébként nincs a gépeden, akkor egy pár perces XAMPP-telepítés segít. Nagy a támogatottsága és az ismertsége. Szerepel azon a listán, amit linkeltél.
Az imént azt írtam, hogy "Ez meg csak kiírta, de nem jegyezte meg." Időközben rájöttem, hogy én értettem félre valamit. Hiszen a TextBox, mint objektum, nem "jegyez meg" semmilyen adatot. Hanem a ControlSource gondoskodik arról, hogy a munkafüzetbe kiírt adat megjelenjen kedőértékként az objektum használatakor.
Elnézést a pontatlan fogalmazásért. Sajnos még csak ismerkedem ezekkel a UserFormhoz kapcsolódó fogalmakkal.
Azért kipróbáltam a kódodat. Érdekes, jó tudni, hogy ilyen is van. (Eredetileg hosszasan keresgltem, hogy lehetne mozgatni a UserForm-on a ScrollBart, mire kiderült, hogy ilyen lehetőség nincs. De jó, hogy legalább tesztelni lehet, hogy mit kocogtatok az egérrel.
Ami a megoldást illeti, magam is hasonlóra leltem pár perce. Beírtam a ControlSource-hoz, hogy "munka1!a1", és máris kiírta és megjegyezte. Megpróbáltam az általad javasolt after_update-el, ami meglepetésemre nem csinált semmit. Aztán vettem helyette Change eseményt. Ez meg csak kiírta, de nem jegyezte meg. Kezd egy kicsit konfúzus lenni a dolog.
Amúgy nem baj, mert az érdemi munkát amúgy is úgy tervezem, hogy rekordonként (soronként) változókba mentem az adatokat, és csak az új tételre való áttérésnél mentem a munkalapra az összes adatot egyszerre. Nehogy bármilyen okból félig mentett adatsor keletkezhessen. Például kávézás, vagy trécselés közben történő áramszünet, vagy ottfelejtett gép kikapcsolás stb.
Ebből kiderült, hogy nem egyről beszélünk. Te scrollbar(oka)t tettél a formra, én meg a formnak a scrollbars tulajdonságát állítottam 3-ra, ami a form alján és jobb oldalán jelenít meg két gördítősávot. Ezek nem gördíthetőek, a scroll esemény azt érzékeli, melyikre kattintottam. Ezt írtam hozzá (jobb ötlet híján):
Private Sub UserForm_Scroll(ByVal ActionX As MSForms.fmScrollAction, ByVal ActionY As MSForms.fmScrollAction, ByVal RequestDx As Single, ByVal RequestDy As Single, ByVal ActualDx As MSForms.ReturnSingle, ByVal ActualDy As MSForms.ReturnSingle)
If ActionX Then
VL.Visible = True: VT.Visible = True
FL.Visible = False: FT.Visible = False
VT.SetFocus
Else
FL.Visible = True: FT.Visible = True
VL.Visible = False: VT.Visible = False
FT.SetFocus
End If
End Sub
A VL egy label, a Caption tulajdonsága "Vízszintes érték", a VT ennek a textboxa.
Az FL és FT a fentieka függőleges párja.
A TextBox1 AfterUpdate eseményébe beírhatod: Sheets("Adatok").Range("A1")=TextBox1, ezzel rögzítheted a scrollbarjaid értékét a füzetedben. Az adat rögzítését egy gomb click eseményéhez is rendelheted.
Egyelőre csak tanulásra használom. Úgy döntöttem, hogy amíg nem ismerem a Controls Toolbox valamennyi elemét (most csak az alaphelyzetben elérhető 16-ra gondolok), addig nincs értelme nekiállni egy adatfelvivő program megírásának. Már két napja ezt csinálom, és még két fontos (Frame és TabStrip) hátravan.
Viszont ezt az ActionX-et nem értem. Amivel sikerült Jimmy javaslata nyomán a TextBoxban megjeleníteni a Scrollbox görgetősávja használatakor az értékeket, az a következő volt:
Private Sub ScrollBar1_Scroll()
TextBox1.Value = ScrollBar1.Value * ScrollBar1.LargeChange ' vagy .SmallChange is lehet
End Sub
Még mindig van egy bökkenő, ugyanis a fenti értékadás csak a képernyőn adja át, és jeleníti meg az értéket, a userform bezárásakor megmarad a textbox eredeti értéke.
Miközben ugyanazon a Userformon belül egy másik Textboxnál egy másik ScrollBar-al (ahol a dátum módosítást teszteltem) megmarad az érték a bezárás után:
Private Sub ScrollBar2_Change()
TextBox2.Value = Format(Date + ScrollBar2.Value, "yyyy mmm d dddd")
End Sub
Feltétezem, hogy valamelyik tulajdonságot állíthattam el, de a fene se ismeri ki magát ezeken:-)))
Igen, köszönöm. Ezt kérdeztem, csak elfelejtettem megírni, hogy egy UserFormban van a gondom. Végül nyomravezettél. Ugyan a MouseMove eseményben nem találtam meg a megoldást, de a ScrollBar_Scroll eseményben korrigálva a TextBox értékét, sikerült megtalálnom a megoldást.
A leírásodból nekem úgy tűnik, hogy nem az excel hozza létre az ütköző fájlokat, hanem te, az újbóli megnyitással. Ilyenkor az excel a lehető legokosabbat teszi: rákérdez hogy melyik filet akarod a továbbiakban használni. Legalábbis a 2007-ben ez történik. A 2010-ben már nem?
Köszönöm szépen a kimerítő leírást, le is mentettem favoritok közé. A leírtak alapján valóban hasonlít az sql-ben használható view-k gyakorlati hasznára, így értem. Egy következő munkámhoz megpróbálom használni majd, igazából akkor fogom műszakilag is megérteni.
Más, és kicsit off:
Tudsz arról valamit, hogy az office valamely programja képes lehet (acces, excel, visio) fastruktúrát kezelni/használni. A cél, hogy fastruktúrát képes legyek használni excelben vagy accesben. A cél, hogy főkönyviszámok ft értékeit egy fastruktúra szerint tudjak részösszegezni.
"A "Class Module" funkció szerint olyasmi lehet, mint mssql-ben a tárolt eljárások (stored procedure), vagy a view-k"
Ezt nem tudom.
Viszont RHCPgergo jól mondta, saját objektumokat lehet létrehozni velük. Pontosabban objektum osztályokat, vagy nevezhetjük őket típusoknak, ez nyelvfüggő. Azért lehet kicsit nehéz megérteni, mert általában ezeknek az objektumoknak nincs vizuális megjelenésük. De az excel vizuálisan megjelenő objektumain jól le lehet vezetni az analógiát.
Pl. a Range az egy típus, konkrétan a Range("A1") pedig egy Range típusú objektum.
A Range típusnak vannak tulajdonságai (Property), vannak hozzá kapcsolódó eljárások (Method). Eseményei (Event) ugyan nincsenek, de éppenséggel lehetnének. A típus definíciója tartalmazza mindazt, ami a típusból generált egyéni objektumra jellemző.
Amikor azt mondod, hogy Range('A1").Value, akkor a .Value property használatát a Range típus definíciójából vesz elő a rendszer, és vonatkoztatja azt konkrétan az A1 cellára. Az A2 cella esetében ugynez: a .Value property használatát a Range típus definíciójából vesz elő a rendszer, és vonatkoztatja azt konkrétan az A2 cellára.
Így tehát a Range típus .Value tulajdonságának leprogramozását egyszer kell megcsinálni, és az utána minden Range típusú objektumra érvényes lesz.
Ennek analógiájára kell elképzelni a Class Module-okat. A Class Module arra való, hogy azon 1 azaz egy darab objektumtípust definiálj. Meg kell adni a típus nevét, ez a fenti példában "Range", én mondjuk elnevezem az objektumtípusomat "Hűtőszekrény"-nek.
Innentől kezdve bármelyik (normál) makróban létre tudok hozni Hűtőszekrény típusú változókat.
Pl.
Sub Macro1
Dim hsz1 As Hűtőszekrény, hsz2 As Hűtőszekrény
Set hsz1 = New Hűtőszekrény
Set hsz2 = New Hűtőszekrény
'kód
'még több kód
End Sub
És akkor van két Hűtőszekrényem, amelyek kezelése, viselkedése egyforma, de mégis egymástól független objektumok.
Az egyiket kinyithatom, a másikat zárva tarthatom.
Az egyikből átrakhatok húst a másikba.
A Hűtőszekrény nevű típus összes tulajdonságát, eseményét, eljárásait a hozzá tartozó Class Module-on kell megírni, a szokásos VBA kóddal.
Én pl. egyszer írtam egy olyan objektumtípust, amivel ADODB kapcsolaton keresztül adatbázist kérdeztem le.
Olyan tulajdonságai voltak, hogy
- DBPath (adatbázis elérési útvonala)
- SQL
- Visszaadott rekordok 3 különböző módon (lista, tömb, RecordSet)
Olyan metódusai voltak, hogy
- Connect (kapcsolódik az elérési útvonalon megadott adatbázishoz)
- Execute (végrehajtja az SQL propertyben beadott SQL utasítást)
- Retrieve (lekérdezi az SQL propertyben beadott SQL lekérdezést)
Amikor használni akartam, csak annyi kellett, hogy:
Sub Macro1
Dim myQuery As clsQuery
Set myQuery = New clsQuery
With myQuery
.DBPath = "D:\mappa\DB.xls"
.Connect
.SQL = "SELECT FirstName, LastName FROM Employee"
.Retrieve
'és itt még kivenni belőle a visszaadott rekordokat
End With
End Sub
Párhuzamosan több clsQuery objektumom volt, egymástól függetlenek, mindegyikkel azt csináltam, amit akartam, de ha javítani kellett a kódon, vagy új funkcióval bővíteni a típust, akkor azt csak egy helyen kellett megtennem: a típust definiáló Class Module-on.
Egy kérdés: Hogyan tudom elérni, hogy a ScrolBar mutató húzásakor is látszódjon a hozzátartozó TextBoxban is a változás. Pillanatnyilag csak azt tudom elérni, hogy amikor elengedtem a mutatót, akkor mutatja csak az eredményt.
Emlékeztem, hogy volt Tőled ezzel kapcsolatban hsz. (Sőt, már magam is feltettem itt ezt a kérdést.)
A 15462-ben az előzményeket trölték, a 13636-nál szintén vannak már lyukak az előzményben.
A 9698 egy jó példa, kipróbáltam. Még tanulmányozom ezt is + amit találni külföldi fórumokon.
Sajnos még mindig nem értem a gyakorlati jelentőségét - pedig tuti hogy sok mindenre jó lenne. Viszont amíg nem értem, nem fog eszembe jutni, hogy ezt kell használnom :(
Sokszor érzem úgy, hogy egy-egy "fejlesztői projektet :)" lehetne jobban is csinálni, jó lenne továbblépni. Ezt a class modult meg csak évek óta nézem, hogy "ott van". Elég volt.
Segítségeteket kérném abban, hogy van-e valami megoldás arra, hogy az Excel 2010 ne hozzon létre ütközéses file-okat.
Szerintem azért hozza létre mert megnyitom egyszer majd nem figyelek és nyomok egy entert a TotalCommanderben a fileon de akkor nem a megnyitott excel-t hozza előtérbe hanem megnyitja újból. De ez csak feltételezés. Mindig csak azt veszem észre Total Comannderben, hogy van ütközéses file.
Esetleg mi más okból hozhat létre ütközéses file-okat?
"Viszont megtaláltam azt, ami nincs az eredetiben - a Calendar Control 11.0 vezérlőt - és ez jónak tűnik."
A Calendar Control vezérlővel vigyázni kell. A 11.0-ás naptár alapértelmezésben a 2003-as Office tartozéka, ami ráadásul az Office "szokásos" telepítéskor fel sem kerül a gépre. Tehát nem magától értetődő, hogy ha a kis programodat átviszed egy másik PC-re, akkor az ott működni is fog, még akkor sem, ha 2003-as Excel van rajta. Ha meg más verzió (bármelyik másik verzió), akkor szinte biztosan nem.
Megoldható persze, hogy a letöltöd az mscal.ocx 11.0-s verzióját, és telepíted mindegyik célgépre, csak macerás. Egyébként itt egy letöltési lehetőség és telepítési segédlet:
Wiki alatt kisbetűvel nem a Wikipédiát értem, amit nem is lehet ilyen célokra használni, hanem a wikiszoftvert. Az van benne, amit beleírsz. :-) Meg lehet csinálni korlátozott írhatóságúra is. Lehet kategorizálni, módosításokat visszakövetni és visszavonni, crosslinkelni stb. Word dokumentumot egyébként is nehéz publikussá tenni.
Egy pár ezer rekordos táblázatban memóriafoglalás szempontjából van-e különbség ha egy bonyolult összetett függvényt, egyben, több cellára elosztva vagy udf-ként használok?
A google témában igazad van, magam is mindig a google-vel keresek, és van, amikor elsőre jó találatot ad, de néha csak 2-3 óra után találok valamit, vagy legkésőbb addigra feladom. Most például egész délután gyűjtöm azoknak a Userform Toolbox vezérlőelemeknek a használatára vonatkozó ismereteket, amelyek sem a Kovalcsik könyvben nincsenek részletezve, sem az általam belinkelt - egyébként kiváló - tananyagban. Viszont megtaláltam azt, ami nincs az eredetiben - a Calendar Control 11.0 vezérlőt - és ez jónak tűnik.
SK-nak: Nem tudom, hogy gyűjtésre valóban a wiki-e a legalkalmasabb. Nem használtam még írásra, de úgy tudom, nem igazán megbízható. Állítólag könnyen belekerülhetnek téves információk. Akkor inkább maradok a saját megoldásomnál. Egy Word dokumentumban gyűjtögetem a linkeket, illetve ami letölthető, azt egy Excel Visual Basic nevű könyvtárba rakom.
még sosem használtam, de ha minden igaz arra jó, hogy saját objektumokat hozz létre. Ezeknek te adhatod meg, hogy milyen tulajdonságaik meg metódusaik legyenek és használhatod őket a makróidban. Szerintem magasabb szintű/komplexebb makróknál, VBA alapú alkalmazások fejlesztésénél lehet igazán hasznos.
használta már valaki vire az osztálymodulokat? Mire lehetnek jók ezek? Azt olvasom hogy nem használnak pl. memóriát. De nem találok anyagot a gyakorlati használatára.
Tegnap arról panaszkodtam, hogy mennyire nehéz összeszedni az Excel makróprogramozással kapcsolatos témakörökhöz a válaszokat.
Azután a keresgélés során olyat találtam, ami ugyan szintén nem ad választ az összes részletkérdésre, de olyan alapos, és közérthető (még a középszintű angolom ellenére is), hogy például a UserForm - ezen belül a MultiPage használatával kapcsolatos kérdésekben tökéletesen eligazítot. De ahogy elnézem a tartalomjegyzékét, a kezdő szinttől kezdve nagyon alapos, jól használható anyag. Ezért úgy gondolom, jótékony cselekedet, ha közzéteszem: http://www.ozgrid.com/Excel/free-training/ExcelVBA2/excel-vba2-index.htm
Viszont erről jut eszembe, hogy jó lenne egy olyan hely (és nem vagyok biztos benne, hogy ez egy fórum lehetne, mert abban elég hamar mélyre kerülnek az egyes hozzászólások), ahol összegyűjthetnénk a leghasznosabb hasonló tananyagokat. Esetleg létezik már ilyen?
Azt szeretném megkérdezni, hogy az excel beépített feltételes formázás funkcióját (amikor nyilakat , zászlókat, pipát stb lehet választani) lehet e ezt konfigurálni. Nekem az istenért sem sikerül.
Pl van egy számsor -3, 0, 10, -10, 13, 78 Azt szeretném elérni, hogy a 0 feletti értékeknél egy zöld nyil felfelé a 0 alattinál egy piros nyíl lefelé legyen, a 0-s érték pedig sárga nyil jobbra. Ha ráengedem a formázást akkor az lesz az eredmény, hogy a 78 as értéknél egy felfele zöld nyíl a többi piros le !
Így csak a számsor elemeihez tartozó számsor intervallumát vizsgálja a formázás , de ennek gyakorlatban kevésbé van értelme, (statisztikát általában viszonyszámokhoz mérünk és csak ritkán egymáshoz) tényleg ilyen bénán van megcsinálva, vagy én vagyok rosszul összerakva és valamit elbénázok ? :)
(Azt tudom, hogy sima szinezéssel meg lehet csinálni, de most ezek a nyilak kellenének)
Lehet, hogy nem erre gondoltál, de VBA-ban az amúgy simán excelből is elérhető függvények az Application.Worksheetfunction objektumon belül vannak. :D
Én eddig abban a hitben éltem, hogy minden excel függvény elérhető VBA-ból ily módon, de most ez megcáfolódott. (Mondjuk van megfelelője, ami egyszerűbb is, de akkor is.)
Azt én sejtem, hogy alapvető szövegkezelő függvényeknek a Basicben is kell lenniük, de nem tudtam, hogy ezek felülírják az Excel függvényeit, illetve azt olvastam lentebb itt a topicban, hogy érdemes mindig az Excel-függvényeket választani, mert gyorsabbak.
Állítsd az Excelt teljes képernyőre. Az Immediate ablakban kérdezd le a méreteit, amiket az előbbi ablakban megadtam, és ezeket az értékeket add a formnak.
Az If Worksheets(lapok(j)).Cells(k, 3).Value = "szla" Then feltétel helyesen találja meg a sima "szla" stringet (és itt gebedjen meg a zindex, hogy nincs állandó szélességű fontja), ellenben az
a várakozásommal ellentétben nem a szla végű cellákat találja meg, hanem folyton igazat ad. És az is furcsa volt, hogy az Application.WorksheetFunction. után a listában nem jött fel a Right függvény, de hibajelzést sem kaptam. Nem így kell Jobb(valami,4) függvényt csinálni?
Igen, ezt próbálgattam már. Most még egyszer megnéztem. Pl. 3-ra állítva megjelenik a vízszintes és a függőleges görgetősáv, de futtatáskor csak a függőlegest látom, és a mozgatási lehetőség (ennek a kék csíknak nem is tudom a hivatalos nevét, amivel görgetni tudok) nem jelenik meg, így a vízszintes görgetősávot nem is látom.
Ráadásul nem bánnám, ha futás közben teljes képernyős lenne a userform, hogy a felhasználó ne lássa alatta az excel táblát, mert minek. De nem találok utalást erre, csak a with tulajdonságnál látok egy számot: 718.5. De, hogy ez mi a fene, és hányra kell állítanom, hogy full screen legyen, arról semmi sem szól. Próbáltam 1024-et, ami a képernyő felbontásom, de az sok. Majd 1 órás találgatással be fogom tudni állítani.
De ahelyett, hogy most titeket kérdezgetlek tulajdonságonként, nincs ez valahol egyértelműen leírva? Furcsa ez az excel nyelv. Iszonyúan sokat tud, de dokumentációt nem, vagy alig találok a részletekről. Úgy kell összeszedegetni kérdezgetéssel, guglizással és próbálgatással:-(((
Köszi, délután kipróbálom a MultiPage controlt. Egyébként eltöltöttem egy fél órát azza, hogy próbálgattam a userform scroll tulajdonságait, de képtelen voltam elérni, hogy futás közben működjön a scrollozás lehetősége. Sőt képes voltam beírni olyan olyan textboxot a képernyő aljára, amit aztán scrollozás híján nem sikerült futás közben látni.
A userform-on a vezérlők sorrendjét "Tab Order" néven ismerik. Ez határozza meg, hogy TAB billentyű megnyomására hová ugrik a fókusz. Ugyanez vonatkozik az Enter gombra is, bár nem minden vezérlőtípus esetén.
Szóval kattints jobb gombbal a form-ra, és válaszd a Tab Ordert. Ott pedig rendezd megfelelő sorrendbe a vezérlőidet, hogy oda ugorjon Enterre, ahová kell.
Esetleg lehet játszani az EnterKeyBehavior Property-vel, bár az kissé mást csinál.
A vezérlő objektmok eseménykezelői hasznosak lesznek a projektedben, érdemes őket tanulmányozni.
Ha nem fér ki 50 vezérlő a form-ra, érdemes megfontolni a MultiPage control használatát.
Amúgy szerintem jöhet ide minden kérdés, úgyis pangás volt az utóbbi időben :o)
Adatfelvitelre. Egy 50 oszlopt tartalmazó Excel táblában szeretném az adatfelvivőknek a dolgát megkönnyíteni, és programból vezérelni az adatbeírást/módosítást. A billentyűkezelés célja, hogy ahol csak numerikus adatot várok, ott ne lehessen más karaktert beírni, ahol csak kétféle válasz lehet (igen/nem vagy férfi/nő), ott az első betű helyes leütésére kerüljön be a teljes szó, ahol majd névsorból lehet választani, ott segítsem a sok közül kiválasztandó név megtalálását. Az utóbbira még nem is tudom, hogy a legördülő menün kívül milyen technikák vannak az Excelben. Régen alkalmaztam olyan megoldásokat, hogy a program néhány karakter leütése után megtalálta a keresett nevet. (Az ilyen jellegű gyakorlatomat sok éve Clipperben szereztem, de ez egész más)
VBA adatfeldolgozást már csináltam többfélét is, de az adatfelvitelt illetően teljesen kezdő vagyok. Azért is vállaltam el a feladatot szívességből, hogy legalább megtanuljam ezt is.
Még abban sem vagyok biztos, hogy jó irányban indultam el azzal, hogy userformmal gondolom megvalósítani a feladatot. Itt eddig az első néhány adat textboxokban történő felvitelének a megoldásával kezdtem a tesztelést, és rögtön beleütköztem abba, hogy az első textbox kitöltésénél Down lenyomására a második textboxra ugrik, viszont az Enter lenyomására kettőt lépve a harmadikra, amit nem akarok. Bizonyára nem a 13-as enter kód cseréje a helyes megoldás, de egyelőre nem tudok jobbat erre sem.
Bizonyára lesz még rengeteg kérdésem a következő napokban/hetekben. Az egyik például az, hogy jó megoldást választottam-e egyáltalán a userformmal? Ha jól látom, ennek korlátja lesz majd a képernyő, tehát az 50 oszlopot nem fogom tudni egyetlen fel/le gördülő képernyőn kezelni.
Ha valaki tud tippeket egy ilyen munka általános nehézségeivel kapcsolatban, vagy internetes referenciákat (Sajnos a Kovalcsik Géza féle könyv csak főbb vonalakban ismerteti az interaktivás kérdéskörét), azt megköszönném. És, hogy ne terheljük vele a közösséget, akár privátban is szívesen fogadok tanácsokat.
Időközben megtaláltam, ha nem is volt könnyű: A KeyDown/KeyUp eseményekkel tudom kiolvasni, a Sendkeys metódussal tudok beírni, már csak az eredetinek a törlése hiányzik, hogy le tudjam cserélni a kiolvasott kódot az újra.
Egy kérdés: Hogyan lehet VBA kóddal kiolvasni az utoljára lenyomott billentyű kódját, és szükség esetén átcserélni másra? Például Enter helyett Cursor down.
Két kérdés, hátha fejből gyorsabban megy valakinek, mint nekem gugliból:
Ha max a sorok száma, akkor az A7:D(max+6) tartomány tartalmát hogy lehet a legegyszerűbben, leghatékonyabban törölni? For ciklussal egyenként nekem is menne.
Hogyan lehet a cells(x,y) formátumát forint, hármas tagolás, nulla tizedesre állítani?
Szívesen. Érdemes körülnézni a kitehető ikonok között. Sokat gyorsít a munkán, ha az olyan funkciókhoz rendelt ikonokat teszed ki, amiket gyakran használsz. Nem kell menüből, almenüből előcsalni.
No akkor legyen egy exceles megoldás is hozzájuk. Az eszement feltételek: A bank csak 1-2 milla közötti összegű hitelszerződéseket hajlandó kötni, 250eFt-os lépcsőkkel.
c8: szükséges hitel:
c10: tényleges hitel/250 000 =HA(MARADÉK(C8;250000)=0;INT(C8/250000);INT(C8/250000)+1)
Van egy táblázatom és abban egy érték (jelen példában: 5 032 237 Ft)
Van-e olyan függvény, ami kiszámolja beavatkozás nélkül, hogy ez az összeg a táblázatban megadott értékekből hogy áll össze (B1 cella: 1 000 000 Ft, C1 cella:1 250 000 Ft, D1 cella:1 500 000 Ft, E1 cella:1 750 000 Ft, F1 cella:2 000 000 Ft)
A példánkban ez így néz ki (2*2 000 000 Ft + 1 250 000 Ft).
Tudja-e valaki, hogy a 2003-as Excelben a helyi menüt (jobb egér menü) hogyan lehet testreszabni? Konkrétan az a gond, hogy eltűnt belőle minden, ami a hiperhivatkozásokra vonatkozik, és egy javítás ráküldésétől nem jött helyre. Mivel lehetne még próbálkozni?
(Bocs, ha már volt a kérdés, de a Keresés segítségével nem találtam meg!)
egy ötlet: lehet, hogy #HIV! hibaüzenet van az 1300 összeadandó cella között is. Célszerűbb azokat kijavítani, de ha nem akarod, akkor valami ilyesmi képlettel össze lehet adni a maradékot:
sziasztok, van egy oszlop 1300db árral, ezt szeretném összeadni, ha a legalsó cellába klikkelek és summázok, akkor a képernyőn látható tartományt jelöli ki, és összeadja, ha elkezdem felvinni a kijelölő négyzetet a sarkainál egészen az 1-es celláig, és úgy summázok, akkor megjelenik a HIV! jelzés, nem tudok rájönni miért? ötlet? kösz
Application.Dialogs(xlDialogSendMail).Show sor, ami megnyitja a levelezőt, csatolja az aktív füzetet, csak a címzettet kell beírni. Az meg nem túl összetett feladat a usereknek, hiszen a címjegyzékből egyszerű előkapni.
Amikor "kézből" dolgozom, akkor mintha kéne, hogy müködjön a saját gyártású függvényem, de amikor programot futtatok, akkor tényleg piszokul lelassítja a futást.
Ugyanaz a program, ugyanazzal az adattal 2-3 mp helyett 4-5 perc!
Esetleg próbáld ki ezt. Tüneti kezelés ugyan, de szerintem jó lesz.
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) Dim pf As PivotField For Each pf In Target.RowFields pf.DataRange.NumberFormat = "mmm-yy" Next End Sub
A másik kérdésem, hogy csinálnák egy pivot chartot ami dátumokat mutat.
A pivot label ilyen fomában mutat "01/02/2012".
Én így szeretném: "mmm-yy"
A pivoton belül, ha rálépek az opiciókta nem jelenik meg a "Number" ahol beállíthatnám, csak mint cella formátum tudom átírni. OK, átírom.
De az a nyomorék chart a régi verzóban mutatja...hiába "mmm-yy" már a pivotban, a grafikonon régi label van.
Ok. megpróbálom a charton beállítani a dolgot és hiába állítom át, nem úgy mutatja...ugye levileg ott is lehet axis label formátumot mutatni.
Komolyan kiborulok...
:-(
Ha kifüggvényezem hogy csak textkénet irja a nyers adatba így : text(a1,"mmm-yy")...akkor minden kalssz, viszont PIVOTBAN is nyílván textként rakra ABC sorrendben...
Valahonnan valamikor kimásoltam ezt a makrót, működik.
Sub DeleteOldItemsWB() Dim ws As Worksheet Dim pt As PivotTable Dim pf As PivotField Dim pi As PivotItem
On Error Resume Next For Each ws In ActiveWorkbook.Worksheets For Each pt In ws.PivotTables pt.RefreshTable pt.ManualUpdate = True For Each pf In pt.VisibleFields If pf.Name <> "Data" Then For Each pi In pf.PivotItems If pi.RecordCount = 0 And Not pi.IsCalculated Then pi.Delete Next pi End If Next pf pt.ManualUpdate = False pt.RefreshTable Next pt Next ws End Sub
Áttettem a kódot a "module1"-be, kicsit változtattam a kódon
Function sajat_fuggveny(p_ertek As Integer) As String If 2 * Int(p_ertek / 2) = p_ertek Then sajat_fuggveny = "páros" Else sajat_fuggveny = "páratlan" End If End Function
Müködik!!!!!!!
Fasza!!!!!!!
Csereberélem A1 értékét, és automatikusan jön a megfelelő válasz!
Function sajat_fuggveny(p_ertek As Range) As String If 2 * Int(Range(p_ertek).Value / 2) = Range(p_ertek).Value Then sajat_fuggveny = "páros" Else sajat_fuggveny = "páratlan" End If End Function
, de még csak fel sem ismeri a nevét, #NÉV? üzenet gyün.
A saját függvény (UDF) automatikusan le kéne kövesse a bemeneti értékek változását. Ha nálad nem teszi akkor lehet, h. manuális számolásra van állítva a workbook-od.
Az UDF-eket simán lehet használni ugyanúgy mint a normál (beépített) függvényeket, szóval a feltételes formázás sem kellene probléma legyen. Ha nem műxik annak az lehet pld. az oka, hogy nem abban a workbook-ban próbálod használni a feltételes formázást mint amiben a UDF kódja van.
Szóval a jó hír az az, hogy mindkettő kérdésed lehetséges, a rossz az, hogy már most is működnie kellene mindenféle trükk nélkül.
A legalapvetőbb a szűrés. Az mondjuk, ami értelmes is. Aztán az AB. függvények, amelyek a magánvéleményem szerint nehezen használhatók és rugalmatlanok, akkor már inkább az adatbázis, bár persze néha szükség van rájuk. Teljes körben nem tudom felsorolni őket, mivel ennél többet nem használok.
Van egy listám, ahol oszlopon belül a cellák kettesével össze vannak vonva. Hogy tudok belőle sima listát csinálni, vagyis hogy az összevont cellákban lévő számok megszakítás nélkül egy-egy cellába kerüljenek? Próbáltam megszüntetni az összevonást, de akkor minden második sor üresen marad. Vagy arra tudtok valamilyen képletet, hogy ilyenkor a felesleges sorokat ne egyenként kelljen törölgetni? Több száz számból áll a lista, kissé bonyoldalmas lenne egyenként végigmenni rajta.
Ami az adatbázist a táblázattól megkülönbözteti. Ezt nem tudom röviden és közben pontosan leírni, a lényege, hogy csökkentjük a redundanciát (nincsenek felesleges ismétlődések), amihez a táblázatainkat több táblára bontjuk, illetve rendezzük a függőségeket. Az alap, amiről beszélünk, hogy egy adott mezőben csak azonos típusú adatok képzelhetőek el, ami egy Excel-táblázatra nem igaz, és nem lehet két teljesen azonos rekord (valamilyen azonosítóban mindig kükönböznek). Ezért zavar, amikor az Excel-táblázatokat egyesek laza szóhasználattal letáblázzák, mert a fenét táblák. Tábláról adatbázisban beszélünk. (Excelen belül vannak adatbázis-funkciók, és ezekhez létrehozhatók táblaszerű táblázatrészletek, de tábláról beszélni hiba).
Ha B11-től és C11-től végigmásolod jónéhány soron (50-1000) az alábbi 2 képletet, akkor az A11-től beírt eredmények azonnal megjelennek a C oszlopban, ahogyan szeretnéd.
Épp az lenne a lényeg, hogy ne kelljen minden forduló után új lekérdezést csinálni, hanem csak az eredményeket beírni és az excel automatikusan újraszámoltatni
Még egy szó: az Excel arra jó, hogy adatokat rendezetten tároljunk, számításokat és más műveleteket végezzünk velük, diagramokat rajzoljunk, színes-szagos szép formázásokat csináljunk.
A kulcsszó, a vészjelző a kapcsolat. Amikor az adatok közötti kapcsolatokon van a hangsúly, azonnal megszólalhat a kis sziréna a fejünkben, hogy ez adatbázis.
Ahogy sk írta, az excelben elég komplikált a kapcsolatok áttekintése. De én már csináltam valami hasonlót. Lehet, hogy neked is megfelel.
A oszlop: Lista a személyekről
CDEF..stb oszlopokba hogy A kit ismer
B: CDEF.. nevek összefűzve.
Ezek után a B-oszlop bármelyik névre szűrhető, kiadja hogy kikkel áll kapcsolatban. A szűrés *..* helyettestő jellel oldható meg. Például. ha Pista kapcsolataira vagy kiváncsi akkor *Pista*
A CDEF oszlopok csak technikai szempontból hasznosak, szerintem könnyebb velük a B-oszlopot összehozni, mint abba bepötyögni a kapcsolatokat.
A pivot a legegyszerübb megoldás. Csak az 'A' oszlopot kell hozzá vezetned. A kimutatás beállításakor a bal alsó négyzetbe behúzod az "eredmény" fejléc-cimkét majd a jobb alsóba is, ahol aztán darabfüggvényre állítod. Persze csak akkor, ha statisztikát is akarsz az előfordulási gyakoriságukról. És ezt mindig megismétled, amikor új adatokkal bővülsz.
És működik? Nálam azt írta ki, hogy nincs ilyen objektum. Hogy milyen, azt nem részletezte. Lehet, hogy nem is checkbox volt, hanem valamilyen más beágyazás. Valami választékot ajánlott fel.
Először is kicsit pontosabban kellene megfogalmazni, mit jelent a "több személy több szervezeten belül kit ismer". Másodszor pedig ez tipikusan adatbázis-kezelési feladat, Excelben csak akkor kezdj hozzá, ha mazochista vagy.
Excelben szeretnék egy olyan 'ismeretségi hálózatot' létrehozni, ahol egyszerűen kereshető, hogy több személy több szervezeten belül kit ismer. Sok esetben ugye a kereső fél nem ismeri konkrétan a keresendő személyt és nevét, mert akkor egyszerű Ctrl+F és happy end lenne.
Ezzel kapcsolatban tudtok nekem adni valami jó tippet? Hogyan tudom ezt úgy csokorba szedni, hogy utána megkönnyítsem a keresést és ne kelljen egyesével végigmászni a neveken?
Egy futball eredményeket tartalmazó excel táblából szeretném kiíratni az előforduló eredményeket egymás alá vagy mellé úgy, hogy minden előforduló eredmény pontosan egyszer szerepeljen.
Odáig még eljutottam, hogy DARABTELI függvénnyel megvizsgáltam, hogy az adott eredmény hanyadszor fordul elő, a B oszlop 1 értéke jelzi adott eredmény első előfordulását, így az A oszlopban szereplő eredmények közül annyi egyedi van, ahány 1-es érték található a B oszlopban. Ezzel csak az a probléma, hogy nekem nem elég az egyedi értékek száma, hanem ki is kellene íratnom valahogy egymás alá (lásd E oszlop) vagy mellé. Továbbá mivel hétről-hétre újabb eredmények kerülnek rögzítésre a táblázatba, a szűrt értékek köre is folyamatosan bővül, ami szintén problémát jelent. Ha esetleg új előfordulás jönne képbe, szeretném, ha automatikusan "hozzáadódna" az egyedi eredmények listájához. A probléma megoldásában szeretném segítségeteket kérni!
'=================================================================================== ' Megvizsgálja, hogy létezik-e a paraméterként megadott könyvtár, ha nem létrehozza '=================================================================================== Sub MakeDirektory(KonyvtarHelyeNeve As String)
If Len(Dir(KonyvtarHelyeNeve, vbDirectory)) = 0 Then MkDir KonyvtarHelyeNeve MsgBox "A megadott könyvtárat létrehoztam!", vbInformation, "Ellenőrzés" Else: MsgBox "A megadott könyvtár már létezik!", vbCritical, "Ellenőrzés" End If
End Sub
Pl. mappa3 létrehozása: MakeDirektory("C:\mappa1\mappa2\mappa3")
1.) For ... Each ciklussal menj végig minden objektumon és töröld
Delete only specific shapes
What if you only want to delete control toolbox controls, Pictures or forms controls. You can loop through the collection and check the Type of the control.
12 = ActiveX control (control toolbox) or a linked or embedded OLE object. 13 = Picture
Sub Shapes2()
'Loop through the Shapes collection and use the Type number of the control
Dim myshape As Shape
For Each myshape In ActiveSheet.Shapes
' ActiveX control (control toolbox) or a linked or embedded OLE object.
If myshape.Type = 12 Then myshape.Delete '
You can also use myshape.Visible = False
Next myshape
End Sub
2.) Próbálj meg egy jobb klikket rajta és Cut-olni (olvastam, h. nem lehet kijelölni, de hátha a jobb klikk műxik)
3.) Go To menüpont, Objektumok és amikor kijelölte az összeset akkor egy szimpla Delete.
4.) Az excel Home tab // Find& Select részében van egy olyan menüpont, hogy Select Objects. Utána delete
5.) Ha az excel Checkboxnak érzi (valószínűtlen, szerintem valami képként jött át, de a remény hal meg utoljára) akkor: ActiveSheet.CheckBoxes.Delete
Phpmyadminból, Firefoxból másoltam be sorokat a táblázatba (2007), és a takarítás után az egyik sor első cellájában ottmaradt egy checkbox, és az istennek se bírom kipaterolni. Cella törlése, sor törlése, tartalom törlése mind kipróbálva, kijelölni nem tudom, ha kitörlöm a sort, az alatta levőbe helyeződik át a rohadék, és még csak egy nem látható jelek gombom sincs, mint a Wordben. Mit tegyek? Egész elképesztő. Több másik egyébként szépen eltűnt.
Bocs, de miért az asztalra akarsz menteni? Ha egy-két fájlról lenne szó, akkor talán elfogadható a dolog, de ahhoz nem kell program. Tekintettel arra, hogy programot használsz hozzá, feltételezem, hogy fájlok sokaságát akarod menteni. Erre nem az asztal való!!! Ebből ugyanis előbb-utóbb áttekinthetetlen katyvasz lesz az asztalon, annak eredeti célja helyett, ami szerintem az, hogy a leggyakrabban használt programjaidat, esetleg fontosabb fájljaidat könnyen megtaláld.
Olyan nagy gond lene, hogy mondjuk a dokumentumok mappában (vagy a példádban a d: gyökerében) hozz létre az adott feladatnak megfelelő mappát, és oda pakolgasd a fájlokat?
Az ugye beállításoktól és Windows verziótól függ, hol van az asztal, alapesetben ennél bonyolultabb, pl. Win7 alatt c:\Documents and Settings\Default User\Desktop\.
Ahogy a te útvonalképzésedet elnézem, súlyosan hiányzik egy backslash az elérési út meg a filenév közül.
A célom az, hogy a felhasználó asztalára kerüljön mentésre a dokumentum. De ehelyet a felhasználó mappájába menti és a fájlnevet kezdi asztal-lal. Desktop-pal is próbálkoztam
Legtöbben Kovalcsik Gézától Az Excel (verziószám ide) programozása című könyvet ajánlják. Krizsák Lászlónak is jelent meg (régen) ilyen című könyve, az is nagyon jó.
A YouTube-on, Excel VBA-t beírva sok példát találsz, és Exceles fórumokon – pl. itt – sokat tanulhatsz. Akár a tökfőzelékről és a grízestésztáról, mint válóokokról.
Egyébként tudnál abban segíteni nekem, hogy ezt a makró programozást milyen szakirodalomból lehetne elsajátítani? Teljesen kezdő vagyok a témában, de van rá affinitásom, és érdekelne is a dolog.
Tudtok olyan xlsx viewer programról, amit lehet használni a TotalCommander betekintőként is?
A cégemnél korábban xls állományban kaptam fontos adatokat. Volt hozzá olyan viewer, hogy ha rááltam az állományra a TC egyik ablakában, akkor a másik oldalon már láttam is a tábla bal felső sarkát. Mióta áttértek az xlsx használatára, nem találok hasonló programot hozzá!
A másik ami nagyon rosszul érint, hogy eddig az xls állományok könyvtárában, szintén a TC-vel, egyszerű stringkeresővel meg tudtam keresni azokat az Excel állományokat, amiben szerepel bizonyos karakterlánc. Sajnos ez sem működik már az xlsx-nél! :-(
Köszönöm a segítséget, flottul ment minden. Kérhetném a segítségedet a dolog megfordításában is? Tehát sok lapból álló munkafüzetet laponként új fájlba menteni. Excel 2010.
Van egy készlet. Xlsx és egy készlet(ütközés). Xlsx ami eltér mentés időpontban és file méretben is.
És szeretném tudni mi az ami eltér a két file között
Nem írtad, az Excelnek melyik verzióját használod. 2003-hoz írtam a makrót.
A D meghajtó Innen nevű mappájában vannak a behívandó füzetek, ezt az utvonal="D:\Innen\" sorban írhatod át. A lapokat az Ide.xls fájlba gyűjti be. Ezt 2 helyen kell átírnod a makróban. Ha magasabb verziót használsz, az xls kiterjesztést is módosítanod kell. Mivel az Ide nevű fájlban lesz a makró, xlsm (makróbarát) lesz.
Sub Osszesites() Application.DisplayAlerts = False Application.ScreenUpdating = False
Dim utvonal As String, FN As String, Ulap As Integer utvonal = "D:Innen"
'Fájlok behívása ChDir utvonal FN = Dir(utvonal & "*.xls", vbNormal) Do If FN <> "." And FN <> ".." Then Ulap = Workbooks("Ide.xls").Worksheets.Count Workbooks.Open Filename:=utvonal & FN 'Másolás a megnyitott füzetbe Sheets(1).Copy After:=Workbooks("Ide.xls").Sheets(Ulap) ActiveWindow.ActivatePrevious 'Behívott fájl ActiveWindow.Close 'Zárás mentés nélkül End If FN = Dir() Loop Until FN = ""
Application.DisplayAlerts = True Application.ScreenUpdating = True MsgBox "Kész van!" End Sub
A következő problémával találkoztam. Lehet, hogy bugyuta kérdés, de nekem nagy segtség lenne. Van egy mappám, tele azonos formátumú (xlsx) excel táblázatokkal (50 db), és mindegyik excel tábla egyetlen munkalapot tartalmaz (a sorok száma eltérő). Arra szeretnék megoldást találni, hogy az 50 fájl munkalapjait egyetlen fájlba összerakjam, de mindegyiket külön lapra. (Tehát az 50X1 lapból, 1X50-et csinálni.) A Másolás vagy áthelyezés megoldást ismerem, de ez meglehetősen bonyolult.
Ha valaki tud segíteni valami egyszerűbbet találni, azt megköszönöm!
Elkövettem azt a hibát a makrós excelemben, hogy ugyanazt a nevet adtam meg egy public változónak és egy makrónak. Ettől az excel kiakad és nem hajlandó megnyitni ezt a munkafüzetet (ami számomra fontos programokat tartalmaz). Azt szeretném kérdezni, hogy hogy lehetne esetleg máshogy megnyitni ezt az excel-munkafüzetet (más programmal), vagy hogy lehetne valamilyen csatornán keresztül hozzáférni a makrókhoz (hogy ki tudjam a hibát javítani).
Egy közvetett kérdésem lenne az Excel hez.
Van egy 25-27 munkafüzetből álló excelem. Lassan kezdem elveszteni a fonalat hogy melyik munkafüzet melyikre van hatással.
Van valami ötletetek hogyan lehetne hatékonyan(nem paintbe :)) rajzolni/tervezni a kapcsolatukat ?
Pl A mf3!B5 kitörlöm az hatással lesz a mf8!G6ra...
A SZUMHA függvény egyáltalán nem igényli, hogy az összeadandókra tegyél feltételt, pont ez a jó benne. Egyszerűen használd a függvénybeszúró varázslót, minden argumentumhoz oda van írva, mire való.
Eddig én is eljutottam, csak nem tudom mit írjak feltételnek, mivel nem magára az összegezendő számokra van kritérium, hanem a mellette lévő oszlopban kell megkeresni egy szakot, ami többször is szerepel és az ezek mellett lévő számokat kell szummázni. FKERES-sel próbálkoztam még, de eddig nem jutottam sokra sajnos.
Sziasztok! Van egy táblázatom, amiben 2 oszlopban vannak különböző szakok és a mellettük lévő cellákban pedig számok. Egy másik munkalapon pedig fel vannak ezek a szakok sorolva és mellé ki kellene számolnom, hogy az 1. munkalapon ahol az a bizonyos szak szerepel, mennyi a mellettük lévő számok összege. Ezt meg lehetne valahogy oldani segédcellák nélkül? Előre is köszönöm a segítséget!
Azért rejtett, mert a képernyős nézetben nincs rá szükség és zavaró is.
Mivel nyomtatásban több oldalra fér ki, ott kell valami, ami összetartja.
De lehet, hogy a filenevet fogom végül beleírni, mert végül is van egy kérésünk a felhasználók felé, hogy milyen néven elmentve küldjék vissza az űrlapot, és ha csak a 80%-uk betartja, akkor már jó vagyok ezzel is.
Nem értem, hogy miért kéne rejtett sorként felvenned a fent ismétlődő sort. Ahogy én elképzelem: mivel annak semmi akadálya, hogy a több sort vegyél fel fel fent ismétlődőnek, hát kijelölsz mondjuk 4-t, abból az alsó lehetne a tényleges táblázatfejléc, a felső pedig a címbe bekerűlő cellák. Ha a táblázatod celláit, beleértve a fejlécét is, tetszés szerint szegélykeretezed, a cellák nyomtatása parancsot kikapcsolod, és ha kell, még a margókkal is elszórakozol, akkor szinte egy tökéletes felsősor vezérelt élőfej imitációt tudsz létrehozni. Vagy félreértem a problémát?
A fent ismétlődő sorok egyik cellájában legyen a részösszeg függvény, vagy teszel oda egy nyomtatásban is látható alakzatot, amihez hozzárendeled a függvény cellájának a címét. Az alakzaton állva a szerkesztőlécre beírod: =függvény_cellájának_címe
Köszi, de ez azon alapul, hogy mindig szigorúan ugyanannyi sor kerül egy nyomtatott lapra, ami a konkrét esetben távolról sem áll fenn.
Nem értem, miért nem bírtak egy ilyen kézenfekvő dolgot beépíteni, amikor annyiféle mezőt meg lehet ott jeleníteni.
Még eszembe jutott, hogy rejtett sort lehetne fent ismétlődő sorként felvenni, de nem ér meg annyi pepecselést, amennyibe kerül újból kijátszani a nyomtatási képet.
Akkor érdemes lenne megismerkedned vele. Mert bár a számlázáshoz a 20855-ös megoldás a praktikusabb, de ha a főnököd egyszercsak tájékoztatást kérne a kuncsaftok fizetési moráljáról, akkor a számlázólistát a kimutatásvarázslóval lehet áttekintehetőbbé tenni, egyrészt azzal hogy az ismétlődéseket elhagyja, másrészt a kuncsaftkódokat sorbarendezi. És csak pár klikk az egész. A kurzort a listára állitod, majd KIMUTATÁS, majd az A oszlopot a jobbsávba húzod, a B oszlopot a felsősorra és be középre, itt átállítod az AB.függvényt DARAB-ra és kész. Próbáld ki.
Köszönöm, de sajnos nem látom "rögtön". Itt ugyanúgy át kell néznem az egészet. Cca. 10.000 emberke van, és mindenek 6-8 számlája. Uh a táblázatom nem éppen kicsi.:(
Coszlop: =DARABTELI(A:A;a1) (hány db van ugyanabból)
Doszlop: =SZUMHA(A:A;a1;B:B)(abből hányszor 1)
Eoszlop: =HA(C1=D1;"ok";0) (100%: ok)
A fenti képletekkel a számlakibocsájtások tetszőleges sorrendűek lehetnek. Tehát lehet kibocsájtási is, azaz amikor hozzáírod a listához az új számlát, rögtön látod a delikvens eddigi fizetési készségét.
Egy üres oszlopban (legyen ez a D) összefűzöd a két oszlop adatát, közöttük egy alsó kötjellel.
=A1&"_"&B1
Ezt lemásolod az adataid mellé. Kijelölöd a D oszlopot, Ctrl+c-vel másolod. Jobb klikk, Irányított beillesztés, Értéket. Ezzel a képleteket értékekké alakítottad, tehát nem függnek az A és B oszlopok adataitól. Rendezed a D oszlopot, és rögtön látod, kinek van a kódja mellett vegyesen 0 és 1, ki fizetett mindig időben, ki soha.
Az A oszlopban lévő számok emberkéketet jelentenek, készült részükre x db számla, amit ha időben fizettek, akkor a B oszlopban 1 az érték. A kérdés az, h ki az,aki minden szláját időben fizette. Így jó? Köszi
Az A oszlpoban sokféle szám van, a B oszlopban 1 és 0.
A feladat az, hogy amennyiben az A oszlopban azonos számohoz, a B oszlopban minidig 1 tartozik, akkor OK. A többi esetben nem. (az A oszlopban a számok növekvőbe rendezve)
szó szerint előcsalogatni nekem sem sikerült (még) a munkalapját, hogy pl. tudjak rajta módosítani.
Túlzottan nem is érdekel, mert az xlam megvan xlsm-ben is - és egyikből tudom a másikba mozgatni a makrókat - szükség esetén pedig xlsm-ben módosítom a munkalapot és rámentem (másként) az xlam-re.
Favágós, de így tudom jelenleg.
Eléggé zavar hogy nem tudom közvetlenül piszkálni, de biztos (Legyünk jóindulatúak... :) megvan rá a MikeRowSoft oka.
Pl. fennt van szalagmenün is nekem az xla-ban lévő makró - ennél fogva bárhonnan lehet indítani. Ha valamit nem látni, akkor valószínűleg úgy van megírva az xla-ban a makró, hogy ne lehessen a lehetséges felületekről indítani(nem tudom van e ilyen, de kell h legyen) Énkonkrétan nem tudom, hogy mi a különbség a private meg a public között - talán a private-t csak a munkafüzetből lehet elérni, a publicot meg bárhonnan.
Pl azt sem tudom mivel kell (még nem volt rá szükségem) olyan változót deklarálni, amit bárhonnan elérek és megőrzi az értékét stb...
az az érdekes, hogy egy elmentett *.bas makrót "belehúzok" az xla(m)-be, akkor az látszik alt+f8-ra felugró futtatás ablakban. Ma próbáltam ki.
Hogy a solvernél nem látom? Speciel jelszó védi. Legalábbis most az otthoni gépen néztem meg, de munkahelyi gépen meg le tudtam nyitni ha jól emlékszem. Nem néztem, de talán be is lehet állítani, hogy a felhasználó ne "lássa" a module-kat.
Valószínüleg azért, mert akkor órákig kereshetnéd az xls makróidat a tengernyi bővítményeljárás infuz listájában. Mivel ezutóbbiak rengetegen lehetnek, minden bizonnyal célszerűbb őket valami módon saját menükbe szerkeszteni. De hogy hogyan, ahhoz kevés vagyok.
Meg különben is, csak kevés tapasztalatom van az xla-kal. Szerintem ui. csak a saját függvényeket praktikus xla fileba gyűjteni, az általános makrókra már praktikusabb a Personal füzet. Emiatt még mindig nem tudom a saját xla füzetem munkalapját előcsalogatni, hiába variálgatom a 20831 posztod szerinti eljárást. Az okulásomra nem raknád ki ide a teljes eljárást? Vagy küldöd el priviben?
Van egy 25-27 munkafüzetből álló táblázatom aminek van egy nagyon idegesítő "szokása". A beírt értékeknek mindig USD az alapértelmezett kategóriája. Nem lehet ezt egységesen a teljes munkafüzetre definiálni, hogy általános vagy szám és amikor kell akkor én az adott cellának megváltoztatom?
Azt hittem minden további nélkül lehetséges. De nem. Megírtam a makrót egy xla modulba, hogy rakja át az egyik lapját egy megnyitott füzetbe, de Subscript of range hibaüzenetet adott. Ami alapján úgy vélem, hogy a bővitménymentés során valszeg nem is menti el a füzetet, hanem csak a VBA alkalmazásait. És akkor ez lehet a magyarázat arra, hogy miért nem lehet láthatóvá tenni.
Azt viszont minden további nélkül megy, hogy az xla-ban elmentett makróval egy tetszőleges xls füzet tetszőleges lapját, bemásold egy másik füzetbe. Praktikusan ugyanaz mintha a formázott lap is az xla-ban lenne.
És van még a nekem legszimpatikusabbnak gondolt Personalos megoldás. Ennél a formázott lapott a Personal füzetedbe mented. Az mindig nyitva van, láthatóvá tehető, szerkeszthető, és makróval is mozgatható.
A törlésben remélhetőleg tudok segíteni. A windows commmanderrel lehet, gondolom a windows filekezelője is tudja. A filet, ha minden igaz, az Office12/Library könyvtárban találod meg. De hogy, hogyan lehetne füzetformátumban megjelentetni, ahhoz kevés vagyok. Pedig határozottan érdekelne. Megjegyzem, ezért szoktam a füzetlapbeállításaimat a Personalba vagy templatként menteni. Az xla-ba meg csak a függvényeket és a makrókat.
most módosítottam úgy, hogy xlsm-ben megvolt és újra elmentettem xlam-ben. Viszont nem tudtam felülírni az előzőt illetve azt törölni sem tudom. Azt mondja, hogy meg van nyitva. De feladatkezelőben sem látszik. Ez valahol a BackOffice-ban fut valószínűleg.
Örülök, hogy sikerült megoldanod a problémád. Nekem viszont sehogy sem sikerült az xla filemat füzetformátumban láthatóvá tennem. Kiírja hogy rejtett füzet, és hogy a felfedés paraccsal tehető láthatóvá. De a felfedés parancs nem müxik (halvány). Neked hogy sikerült?
Még azt szeretném megkérdezni, ha az elmentett xla-ban van egy formázott munkalap, akkor azt a formázást hogy tudom másolni a legegyszerűbben/leggyorsabban ebből az xla-ból.
Az xla mentés tökéletes. Van még hogy az egyéni makrófüzetbe mented a makród, amit az Alt+F8 ablakban ajánl fel. Ez lesz a Personal füzet, amit szintén automatikusan hív be az excel minden indításkor. És van még hogy te nyitod meg a makrót tartalmazó normál füzetedet, amikor szükségesnek látod. Ha egy füzet meg van nyitva, a makróit a többi füzet is tudja használni.
Ha a makrót nem munkafüzettel akarom menteni, hanem azt szeretneém, hogy folyamatosan rendelkezhessek vele, akkor mit kell csinálni? (Pl elérjem a szalagmenüről)
xla, bővítményt kell készíteni?
A segítséget köszönöm előre is, igyekszem viszont segíteni.
talán a 2003 előtti időkből a makrólap és makrófüggvények használatához. (Amikor nem volt vba, akkor volt makrófüggvény, megvan még mindig, csak kevesen ismerik/használják)
Bingó! Lehetséges cellacímű makró nem indítható az alt +F8 makróabkaból. VBE-ből igen, meg subrutinként is, de így nem. Kipróbáltam egy a1 makró b1 makróból való hivásával. VBE-ből ment, makróablakból azonban egyik sem volt elérhető. Kösz.
Én arra gyanakodnék, hogy az ok az, hogy az mcr60 létezik mint cella cím (kivéve persze xl2003-ban). Van olyan xl belső szabály, hogy létező cellacímeket nem lehet bizonyos módon használni (pld range name-nek sem lehet megadni). Én valahol itt keresgélnék.
Odáig jutottam a probléma kezelésében, hogyha átnevezem a makrót, az új névvel már semmi baja. Tehát a névadás okozta a problémát. Dehogy miért, azt nem értem.
A makróimat mcr0-tól mcr60-ig neveztem el. Ezek közül csak az mcr0-hoz lehetett hozzáférni a makróablakból. A többihez csak átnevezés után. Pl. az mcr50-t macro50-nek és a mcr 54-t macro54-nek átnevezve. Nem tűnik nagy különbségnek, és mégis.
VBE-ből a makrók mcr-néven is vígan futnak.
Van valakinek valami ötlete, hogy mi okozza a makrónév és a makróablak összeférhetetlenségét?
Az excelem jónéhány makrómat nem engedi megnyitni szerkesztésre az ALT+F8 makró ablakban. Ilyenkor innen futtatni sem lehet. (Halványak az opciók). De nem ez okozza a gondom, hanem hogy így indító billentyüt sem tudok hozzájuk rendelni. Mit lehet a probléma?
Minden további nélkül írható rá makró. De addig is míg valaki kisegít vele, megodhatod az oszlopok manuális balról jobbra rendezésével.
A táblázataid fölé vagy alá beírod, hogy az adott oszlop hanyadik legyen, majd rendezed a táblázatot balról jobbra (A beállításoknál kell választanod ezt az opciót.)
Csak egy dologra kell ügyelned: nevezetesen hogy a rendezés során a relatív hivatkozásaid borulhatnak.
Arra van-e makró, vagy lehet-e makrót írni, ha van két olyan munkalapom, ami azonos fejléccel vannak, de más sorrendben és a makró azonos sorrendre hozza össze úgy, hogy mindkét munkalapon azonos sorrendbe lesznek az oszlopok? Pl.: az első munkalapon
SorszámIktatás dátumaSzerződő Partner neveAdószám
A második munkalapon:
AdószámSorszámSzerződő Partner neveIktatás dátuma
Ennek a két munkalapnak az oszlopait kellene átmozgatni úgy, hogy azonosak legyenek az oszlopok sorrendje?
Igen, ezekre giondoltam és tettem magam is...Azt hittem, valami rosszul van beállítva a beállításokban, de nem találtam semmilyen utalást erre. Köszönöm a válaszaitokat!
Ja igen, a vessző az tizedesjel, attól nem lesz szöveg, ugyanúgy szám.
Ha utólag átformázod szöveggé, nem biztos, hogy beveszi. Előre szöveg, úgy beillesztés, vagy szöveggé alakítás után szaladj végig rajta egy F2/enter párral. De lehet, hogy F9 is elég.
Ha a számok elé 1-es számot írok, a számok végét 0-ra kerekíti így:
1601125098660740,
1601125098660860,
1601125098661010,
1601125098661030,
1601125098661060,
1601125098661070,
Megnéztem, a formátum ok, a listát bemásoltam egy txt fájlba és onnan egy akkor megnyitott, új táblázatba és akkor is felkerekítette. Mit lehet tenni, hogy a formátum és a szám vége megmaradjon?
Igazából egyszerűbb képletet szerettem volna, mert meg mertem volna esküdni rá, hogy egy cellatartomány n-edik elemét nemcsak VBA-ban, hanem képletben is meg lehet hivatkozni valami ehhez hasonló módon:
2007-hez szerintem lehet downgrade licenszt kérni a Microsofttól, szóval ha a 2007 jogtiszta, de nem használod, akkor a 2003-asba nem nagyon lehet belekötni. Ajándékozás után szintén. Ami a letöltést illeti, elhangzott pár ésszerű tanács, de nyilván nem kötelező megfogadni őket.
A lapodhoz rendeld a makrót. Akkor indul, ha az A vagy B oszlop cellái változnak módosítás, vagy új adat felvitele által.
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A:B")) Is Nothing Then Dim sor As Integer, sor1 As Integer
sor1 = 1: sor = 1 Do Cells(sor1, "F") = Cells(sor, "A") sor1 = sor1 + 1 Cells(sor1, "F") = Cells(sor, "B") sor = sor + 1: sor1 = sor1 + 1 Loop While Cells(sor, "A") <> "" End If End Sub
Védelem fülön kivettem a pipát a Zárolt elől, de a Lapfület ne találom. A korrektúra fülbe találok Lapvédelmet, de akkor ha arra rákattintok akkor semmit nem enged módosítani utána a dokumentumba.
Nyilván nem feltétlen reális az, hogy a NAV, a TEK vagy valamelyik egyéb terrorszervezet rádborítja a lakást egy 20ezres program miatt, de ettől még nyilvános fórumon nem bölcs dolog hirdetni. Esélyesen nem figyelik az index 0-24-ben, de tévedhet erre olyan, akinek van adóellenőri jogosultsága és kész a gáz.
És még egy felmerülő kérdés: lehet még egyáltalán 2003-as Ms Office-t kapni valahol? Mert nekem ugye van 2007 telepítő CD-m (na, az az tényleg teljesen jogtiszta), csak éppen a régihez ragaszkodtam...
Nekem egy kicsit szürreális a kép, hogy a NAV-nál van egy ember, aki napi 8 órában a gép előtt ülve az indexes hozzászólásokat figyeli és nyomozza le. Ez kb. olyan, mintha a BKV-nál valaki a facbookon böngészné, hogy melyik diák posztolja aznap, hogy "hehehe, blicceltem a hetes buszon". Ennek ellenére bármit kinézek a NAV-ból... Viszont ha már ellenőriznek, és a helyükben az Ncore-on és hasonló oldalakon néznék szét, ott tízezrével hemzsegnek az illegális szoftverletöltők.
Egyébként ha a netről töltöm le a szoftvert, és használom, amíg le nem jár a próbaverzió, aztán ismerősi körből nagynehezen kerítek egy eredeti telepítőcédét, és az ismerős, aki már nem használja ezt a szoftvert, szívességből nekem ajándékozza a kódját, az már jogtiszta, nem? Illetve ha kell a munkámhoz, nonprofit, anyagi hasznot nem hozó másodállásomhoz, hobbimhoz, tanulmányaimhoz, mittudomén titkos naplómhoz, bevételeim-kiadásaim táblázatban vezetéséhez, stb., de nincs belőle konkrét üzleti hasznom, illetve nem terjesztem, szerintem akkor sincs gáz. Vagy mégis lehet?
Annyit még megtudsz mondani hogy hol tudom az beállítani hogy bizonyos cellák le legyenek zárva hogy oda még csak véletlenül se lehessen beleírni vagy kitörölni?
Nehogy véletlenül félreüsek valamikor és emiatt utána rosszul számoljon valamit.
A 2. sor képlete mindig az aktuális sorszám adatait összegzi.
Beírsz egy új nevet és a hozzá tartozó fizetést, az Excel alapbeállítása szerint a képletek másolódnak a hozzá tartozó sorba. Nem írtad, melyik verziót használod, így nem tudom megmondani, hol találod ezt a beállítást.
Még annyi kérdésem mégis lenne hogy: ha az utolsó sort lehúzom hogy több sorban számoljon ne csak 5ben akkor az összesenben csak az első 5 sort összesíti. Mit kell csinálnom hogy az összes sort összesítse?
A google segítségével rákerestem a cimletező és az excel szavakra. A találatok közül az első, nagyon egyszerű és elegánsnak tűnő megoldás a következő volt: www.sgus.hu/files_dwld/EXCEL/Cimletezes.xls. És még csak nem is használ makrót. Szerintem jó kiinduló alap lehet annak ellenére, hogy ő függőlegesen listázza a címleteket, Te meg vízsszintesen szeretnéd. De ezt könnyű lesz átalakítani, ha egyáltalán szükséges.
Egy munkahelyen van mondjuk 20fő dolgozó. Ennek a 20 főnek van 20féle munkabére.
Egy program elkészíti a fizetési listát PDF formátumba a 20 névvel és összeggel.
Mivel minden mubnkabér szinte más összegű, eddig egyenként kicímletezem mindegyiknek a bérét, és utána összegzem hogy a bankból milyen címletekből mennyit kérjek ki, hogy a fizetést előre ki tudjam borítékolni. Elég időigényes munka hogy 20 embernek egyenként számolgatom ki a címletét és utána ezt a 20 fajta címletet még összegeznem is kell.
Erre kellene nekem egy olyan excel program, amibe (mondjuk az "A" oszlopba) beillesztem egymás alá a 20 ember bérösszegét (amit kimásolok a PDF-ből) és a program kiszámolja személyenként a címleteket és a végén összesíti. Ezt az összesített címletet kérem le a banktól, és így biztos mindenkinek külön tudom borítékolni a fizuját.
Címletezőre lenne szükségem, de olyanra ami több számot tud címletezni nem csak egyet. Magyarul beillesztek egy oszlopba 20-30 számot egymás alá és a program kiszámolja ennek a 20-30 számnak a címletét.
Csak részben. A filmek és zenék felvétele a rádióból-tévéből, megvásárolt példányról történő lemásolása magáncélra legális. A letöltése viszont egy szürke zóna, kivéve a legális letöltésre felrakott műveket, ugyanis ezek általában eleve illegálisan vannak feltéve, tehát már a forrástól nem tiszta. Nincs sehol leírva, hogy ez legális lenne, csak éppen jelenleg nem üldözik.
Tudomásom szerint filmek és zenék letöltése otthoni, magáncélú felhasználásra megengedett, legalábbis a magyar törvények szerint. Ugyanez nem igaz a szoftverekre.
A magánemberek ellenőrzésének valóban kicsi az esélye, de azt tudnod kell, hogy pl. az indexfórumos, indafosos regisztrációd pillanatától kezdve minden lélegzetvételed elektronikusan dokumentálva van, visszakereshető, és az ISP adataival kombinálva valós személyhez köthető.
Folyamatosan rettegni egy letöltött kalózprogram miatt irreális, de kitenni a táblát, hogy "emberek, én kalóz office-t használok" szintén nem túl bölcs.
Persze vannak, akik az extrém sportokat kedvelik :)
Oké, de nyilván az egész Ncore nem jogtiszta, a filmek, a zenék, a programok letöltése meg főleg nem az. Az ilyen torrentoldalak, fájlcserélők álnéven netező felhasználói milliónyian mind folyamatosan attól rettegnek szerte a világban, hogy egyszer csak rájuk rúgja az ajtót néhány egyenruhás, vagy hogy több tíz-százezer forintra megbüntetik őket? Értem én, hogy mi a különbség a boltban vásárolt és a netről letöltött Microsoft (meg a jogdíjas filmek, zenék) között, és ha jól tudom, van különbség az otthoni, magáncélú felhasználás meg a további terjesztés, jogosulatlan pénzszerzés között, de az ilyen, magánemberek ellen irányuló ellenőrzéseknek valóban van realitása?
Pl. mert nem jogtiszta? A nem jogtisztaság egyéb következményeit már gondold ki magad. Van valamid, amiért pénzt szoktak kérni, te meg nem fizettél érte s nem ajándék volt...
Kár, mert az a címem ezer éve nem él... :( Írok a másik címemről.
Amúgy muszáj volt nekiállnom dolgozni, ezért letöltöttem az NCore-ról a 2003-as verziót, telepítettem, és úgy néz ki, működni fog. Otthonos érzés. Az Open Office-t is megtartom, hátha hasznát veszem még.
Fent vagyok az NCore-on. Most nézem, hogy milyen verziók vannak fent. Van sima Microsoft Office 2003, meg van Professional SP3 X86, ezeket töltötték le a legtöbben, gondolom, nem lehetnek rosszak. Ha letöltöm és telepítem, az op. rendszer simán befogadja majd? (XP Professional van a gépemen)Nem fog hibaüzeneteket küldeni, hogy nem jogtiszta? Nem fog kódot kérni?
Erre jó lehet, amit a 20500-ban írtam. Annyi különbséggel, hogy a clsApp kódlapjára ezt kell bemásolni:
Public WithEvents App As Application
Private Sub App_WorkbookOpen(ByVal Wb As Workbook) Dim A As Long, p As String If Left(LCase(Wb.Name), 8) = "personal" Then Exit Sub A = MsgBox("Megnyitás csak olvasásra?", vbYesNo) If A = vbYes Then Application.EnableEvents = False p = Wb.FullName Wb.Close App.Workbooks.Open Filename:=p, ReadOnly:=True Application.EnableEvents = True End If End Sub
A 2003-as Office-t lehet éppenséggel elavultnak nevezni, de csak abból a szempontból, hogy az újabbak bizonyos funkcióit nem tudja, és ezért nem mindig lehet megnyitni vele újabb verziókban készült dokumentumot. Még akkor sem, ha az egyébként nagyon hasznos kompatibilitási csomagot telepíted. Ettől eltekintve szerintem a 2003-as szinte mindent tud, amire szükség van.
Ezzel együtt én nem ragszkodnék a 2003-ashoz, pont azért, mert ciki és körülményes, ha nem tudod megnyitni a fájlokat, amiket kapsz.
Venni ma már csak 2007-est vagy újabbat lehet, felszereltségtől függően kb.20-40 ezerért. Ebben annyira azért nem vagyok otthon, de egy gyors keresés ezt adta ki.
Letölteni bármit le lehet. Az MS Office letöltésének két bukkanója van. Az egyik, hogy nem legális, és akár még gond is lehet belőle. A másik, hogy a tört verziók gyakran vírusosak. Az "informatikus haver ráér és telepít" megoldás hasonló kockázatokkal jár. Gondolom, az informatikus haver is kalózpéldányt rakna fel, mert haverságból nem szokás több 10 ezer forintos programokat adományozni. Legfeljebb ő a vírusokra is gondol, és olyan programot rak fel, ami szerinte nem fertőzött. :o)
Szürkezónás megoldás lehet az, ha virtuális gépre telepítesz legális próbaverziót, amit aztán a próbaidőszak leteltével újra kell telepíteni. Ez mondjuk egy VirtualBox-os guest gépnél, ahol pillanatképet készíthetsz a telepítés előtti állapotról, és oda 10 sec alatt vissza tudsz állni, kb. 10 perc munka kéthavonta.
Tudásban jobb az újabb (akkor már inkább 2010, mint 2007), viszont a kezelőfelülete borzalmas. Annak, aki gyorsan dolgozik billentyűkombinációkkal, és nem előbb nyúl az egérhez, aztán kezd gondolkodni, hogy mit is akar, sokkal kényelmesebb a 2003-as, ezért használjuk még páran itt.
A leírtak alapján mindenképpen a Microsoft felé hajlok, már csak az a kérdés, hogy melyik verziót javasoljátok?
Nekem a 2003-as Ms Office volt az abszolút kedvencem, de mivel az egy 10 éves program, gondolom, ma már elavultnak számít... Vagy nem?
Tudok letölteni bármilyen Ms Office-t netről? (Nem próbaverziót, hanem teljeset.) Vagy várjam meg, amíg egy informatikus haver ráér és telepít nekem? Mennyire drága megvenni egy erdeti programot?
Excelből kell indítani a megnyitást, és amikor a fájlt kiválasztod, a megnyitás gomb jobb szélén van egy lenyíló, abból ki lehet választani a csak olvasásra opciót. Ha így nyitod meg, a következő ember meg tudja nyitni írásra. Legalábbis sajátgépen, két Excel példánnyal így működött, gondolom hálózattal, különböző júzerekkel is így megy...
Úgy látszik, jó vagyok olyan kérdésekben, amikre senki nem tud válaszolni.
Itt a következő: meg tudom-e elsőnek nyitni a táblázatot csak olvasásra, hogy ha az nyitja meg nálam később, aki írni is akar bele, akkor neki simán menjen? Tehát mintha én lennék a második.
Hát, most nem sorolnám fel az összes zsákutcát, amibe belefutottam, de maga az algoritmus nagyon egyszerű:
1. Használd a makrórögzítőt.
2. Keress az interneten segédanyagot. (Ebből van rengeteg, egyik jobb, mint a másik, csak egyik sem tartalmazza pont azt, amire szükséged lenne.)
3. Nézegess fórumokat.
4. Kísérletezz.
A LibOffice-nak remek makrórögzítője van, nagyon szépen rendezett kódot ír, csak éppen gyakran használhatatlan. Nem a konkrét objektumokkal dolgozik, hanem mindent UNO service-eken keresztül old meg, ami szép és jó, csak baromi nehéz visszaszerezni belőle objektumhivatkozásokat, hogy azokkal tovább tudj dolgozni.
Rákerestem arra, hogy LibreOffice basic reference, és találtam egy ilyet:
Megörültemm neki, mert úgy tűnt, hogy ez a LibOffice Basic teljes dokumentációja. Megnéztem, megpróbáltam kiokosodni belőle, és ezennel virtuálisan leborulok a Microsoft VBA súgó készítői előtt. Ég és föld a különbség a kettő között.
Találtam a neten valami kódfordítót is, ami állítólag azt tudja, hogy beadod neki a VBA kódot, és kidobja a Basic kódot. A legegyszerűbb Range műveletekre is befuccsolt.
Az egyik fórumon találtam egy kérdést, ami kb. egybevágott azzal, amit én is kérdeztem volna. Két oldalon keresztül olyan válaszokat kapott, hogy "tanulj fiam, és aztán magad is meg tudod majd oldani". Míg végül a kérdező kifakadt, hogy mit szórakoznak vele, mi a f@cér nem képes senki megmondani, hogy hogy kell megcsinálni. Szóval közel sincs ott olyan jólét, mint itt, ahol készregyártott kódokat kap az ember...
Végül találtam egy fickót, valami bolgár és Andrew Pitonyak a neve, aki egy egészen használható doksit írt, példákkal fűszerezve.
Sub Osszesites2 Dim Doc as object Dim CopyTo As New com.sun.star.table.CellAddress Dim CopyFrom As New com.sun.star.table.CellRangeAddress Dim i As Long
Doc = ThisComponent If Not Doc.Sheets.hasByName("Összesítés") Then Doc.Sheets.insertNewByName("Összesítés", 0) End If For i = 1 to Doc.Sheets.GetCount-1 with CopyFrom .Sheet = i .StartColumn = 0 .StartRow = 0 .EndColumn = GetLastUsedColumn(Doc.Sheets.GetByIndex(i)) .EndRow = GetLastUsedRow(Doc.Sheets.GetByIndex(i)) end with with CopyTo .Sheet = 0 .Column = 0 .Row = GetLastUsedRow(Doc.Sheets.GetByIndex(0))+1 end with Doc.Sheets.GetByIndex(0).copyRange(CopyTo, CopyFrom) Next End Sub
Function GetLastUsedColumn(oSheet) As Integer Dim oCursor oCursor = oSheet.createCursor oCursor.GotoEndOfUsedArea(True) GetLastUsedColumn = oCursor.RangeAddress.EndColumn End Function
Function GetLastUsedRow(oSheet) As Integer Dim oCursor oCursor = oSheet.createCursor oCursor.GotoEndOfUsedArea(True) GetLastUsedRow = oCursor.RangeAddress.EndRow End Function
Remélem, jó lesz, mert 6 órás (kutató)munkával raktam össze (Excelben 10 perc lett volna), ráadásul kezdetleges és nem rugalmas, de az van.
Lényeges, hogy a munkalapok index-szel vannak meghivatkozva, ezért az Összesítés nevű munkalapnak mindig a legelső (nullás) pozícióban kell lennie.
A program úgy is hozza létre, csak később sem szabad elmozgatni.
Bizony, bizony, ahogy SK mondja. A mi istenünk a Microsoft. OpenOffiszos eretnekségnek, bálványimádatnak itten helye nincs :o)
Komolyra fordítva, mérlegelni kell az előnyöket és a hátrányokat. Az OpenOffice vs MS Office pro és kontra érveket sokhelyütt leírták már, és most itt egyet emelnék ki.
Mind az MS Office, mind az OpenOffice (és a LibreOffice is) támogatja a makróprogramozást. Csakhogy az MS Office-t kiegészítő VBA makrónyelvet sokkal többen ismerik, mint az OO Basic-et. Míg MS Office VBA kérdésben 100-an tudnak neked segíteni, OO Basicben maximum 1-en, és ahogy nézem, az az egy nincs itt ezen a fórumon :o)
Retro_Image-nek igaza van. Ha azt akarod, hogy valaki foglalkozzon a kér(d)éseddel, ne pénzt ajánlj fel, hanem pontosan, érhetően határozd meg a megoldandó feladatot és a helyes megoldás kritériumait. Ahhoz senkinek sincs kedve, hogy bogarásszon egy ellentmondásokkal teli hozzászólást.
Egy látszólag egyszerű kérdséem lenne: Microsoft Office 2003, Microsoft Office 2007, vagy új Open Office?
Újratelepíttem az XP-met, és a régi Microsoft helyett új Open Office-t kaptam... (Tudom, illett volna megbeszélnem az informatikusommal).
A neten azt olvasom, hogy az Open Office független, jobb, többet tud, jobb a helyesírás-ellenőrzője, de én évekig dolgoztam a 2003-as Ms Office-ban, így szerkesztettem mindent Wordben és Excelben. Író-újságíró vagyok, ezért nagyon nem mindegy, hogy mi lesz ezzel a külső vinyón lévő, nagy adathalmazzal. A cégek, szerkesztők, kiadók szempontjából sem mindegy, hogy meg tudják-e egyáltalán nyitni, amit küldök nekik, meg persze magam miatt sem - tudom-e normálisan kezelni az eddigi fájlokat, illetve nagy dilemma, hogy milyen formátumban nyissam meg és mentsem el az újakat.
Most fent van a gépemen ugye az új Open Office, ami tényleg nem tűnik rossznak, de például a régi Excel-táblázatokat furcsán kezeli, néhány mező formátumát megváltoztatja, stb. Feltettem a gépre a 2007-es Ms Office tesztverzióját is (mindjárt lejár, és nem találom a 25 számjegyű kódot). Ezzel ugyanaz a problémám, az Excelben mások a színek (és ez nekem fontos a kiemelések miatt), a Wordben teljesen mások a sorközök.
Szóval mit javasoltok? Melyiket éri meg hosszú távon használni? Ha valamelyik újat, akkor szépen sorban érdemes lenne átalakítani a több száz régi fájlt is...?
- a munkalap Worksheet_Change eseményét figyeltetném, és ha az adott cella "szolgáltatás" értéket vesz fel, akkor zárolnám a másik cellát, esetleg a háttérszínét is módosítanám, ha meg egyéb értéket vesz fel, akkor feloldanám a zárolást.
- feloldanám az űrlapmezőnek szánt cellák zárolását, aztán is levédeném a munkalapot
- a munkalap Worksheet_Change eseményét figyeltetném, és ha az adott cella "szolgáltatás" értéket vesz fel, ha egyéb értéket, akkor feloldanám a zárolást.
A második kérdésre "valószínűleg igen" a válasz. Ha beküldöd a kódot, részt vehetsz a sorsol.. megnézzük és teszünk javaslatot a módosításra.
Amúgy miattam nem muszáj tisztáznod fenti bizonytalanságokat, mert leszálltam a témáról. Első blikkre több órás fejtörés lenne az algoritmust összehozni, ha egyáltalán sikerülne, és nem volna arcom annyit kérni érte, hogy megérje :o)
Ezen a fórumon milyen vétségekért moderálnak ki hozzászólásokat? Egy kérdésemre adott válaszra akartam rákeresni, de látom, hogy ki van moderálva. Nem emlékszem, hogy bármi botrányos lett volna benne.
Nem egészen világos elöttem a feladat, de ha netántán az lenne, hogy minden oszlop utolsó értékét listázza ki, akkor a mátrixodban az utolsó oszlop elemeit kell kilistázni. Jelen esetben tehát =index(7.oszlop,i,1), ahol i=1...7.