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.
Jó VBA könyv:
Kovalcsik Géza: Excel 97 programozása.
A múltkor írtam, hogy a magyar és az angol Excel kompatibilis.
Az 5-ösnél előfordult az alábbi eset:
Angol Excelben területet "Database"-nak elenvezve a magyar Excel automatikusan átnevezi "Adatbázis"-nak.
Ez eddig OK volna, azonban ha valaki kimutatást csinált az angol Excelben (Database-ra hivatkozva), akkor a magyarban is Database-ra keresi az adatokat (ami ugye nincs).
A későbbi verzióknál nem próbáltam, de nem kizárt, hogy megvan még a hiba!
sajnos én nem tudok ajánlani VB könyvet, nekem mikor először volt rá szükségem, akkor segítőkész kollégák kéznél voltak és elmagyarázták az alapokat ez többet ért bármilyen könyvnél, azóta pedig nagyjából a help-ből élek, jelenlegi munkáimhoz ez elég. De vannak itt nagy spillerek, akik biztos tudnak segíteni.
köszi az okítást, megy a dolog.
nem tudtam, hogy így lehet egy mezőhöz több feltételt rendelni, én azzal próbálkoztam, hogy valami függény segítségével "között"-et csináljak egy cellában.
tudsz ajánlani nekem egy jó visualbasic könyvet, ami nem csak az utasítások szintaktikáját írja le?
a francba ! ez a genya kiszedte a sok space-t, amivel olyan nagy műgonddal próbáltam egy excel sheetet megformázni... így most egy csak szép space delimited táblát kaptál :)))
a megoldás egyszerű ! csak nehéz lesz leírni, de megpróbálom:
mondjuk ez a táblád:
A B C D
1 dátum értékek
2 2001.01.30 600
3 2001.01.20 300
4 2001.01.25 400
5 2001.01.22 500
gondolom ebből csináltál egy adabázist,
- azaz jelöljük ki a táblázatot A1:B5
- nevezzük el mondjuk database-nek
és akkor a feleadat: átlagoljuk az értékek mezőben lévő számokat, amik mellett a dátum 2001.01.20 és 2001.01.22 közé esik
ehhez először egészítsük ki a táblázatot a feltételekkel:
A B C D
1 dátum értékek dátum dátum
2 2001.01.30 600 >=2001.01.20 <=2001.01.22
3 2001.01.20 300
4 2001.01.25 400
5 2001.01.22 500
majd kérjük a feladat eredményét pl. a C5 cellába, azaz írjuk be oda a következő függvényt:
=DAVERAGE(database,"értékek",C1:D2)
de működik így is:
=DAVERAGE(A1:B5,"értékek",C1:D2)
Mindent pontosan így írj be, ne felejtsd le az idézőjeleket,
ha magyar exceled van használd az ABÁTLAG függvényt a DAVERAGE helyett,
esetleg használj pontosvesszőt a vessző helyett, ha a nemzetközi beállításaid így kívánják meg.
Na jó, tényleg nem szép megoldás, készséggel elismerem, de következetesen használva nem túl veszélyes. De nem is akarok erről meggyőzni senkit, akkor szoktam rá, amikor még alig tudtam néhány függvényt, és ezt minden esetre rá tudtam húzni. Csak arra kell figyelni, hogy mindig kapcsold ki, mert különben tényleg megkavar. Volt nekem több ezer soros kódom is ezzel a megoldással, működött is. De az biztos, hogy nem tankönyvi (jó) példa. Ha az ember maga tanul programozni, akkor előfordulnak ilyenek. Engem senki sem tanított soha, ezt néha hiányolom is.
Sziasztok!
Egy kis segítségre lenne szükségem egy gurutól.
Adva van egy adatbázis és én az AB.Átlag fg-t úgy szeretném használni, hogy az egyik érték mezőből csak azokat az adatokat átlagolja, amelyek beviteli dátuma (ezt én megadom) két meghatározott dátum közé esik. A szűrés funkciót most hagyjuk, más megoldás kéne.
előre is köszi
kaszi
"És tényleg javaslom mindenkinek, hogy a fárasztó ellenőrzések helyett egyszerűen kényszerítse az Excelt egy hibára. Sokkal rövidebb a kód, és az ellenőrzések már valahol úgyis le vannak programozva."
Sőt függvényként is elérhetők, amik használatával nemcsak átláthatóbb, hanem egyszerűbb is lesz a programod: "if not IsNumeric" szerintem sokkal egyszerűbb, mint egy on error goto, ahonnan nem is tudsz visszatérni (hiszen nem tudod honnan ugrott oda a program). Szóval a fenti "megoldás" egy 8 soros függvényben elmegy, de egy-kétezer sornyi kódot nagyon megbonyolít...
Én nem azonosítottam a kivételkezelést a GOTO használatával, csak mint egy megfelelő eszközt említettem, de amint látszik, más sem feltétlenül gondolja, hogy ez hülyeség. Ez csak azt mutatja, hogy egy feladatra többféle megoldás létezik, de ez a szép. Én sem sokszor használom, de néha pont azért, mert TUDOM, hogy nem akarok oda visszalépni. Az én megoldásom az Excel példánál egyébként éppen nem az Excel hibájára épít, mivel a hibát én generálom, a függvény nem hibát ad vissza, hanem 0-t, ha nem találja a keresett értéket, de egy tömb nulladik cellájára hivatkozás már hibát ad, mivel az Excel 1-től számozza azokat. Ezt a trükköt szoktam használni, ha lusta vagyok mindenféle ellenőrzést végezni. Például ha nem akarom ellenőrizni, hogy egy cellába számot írtak-e be, akkor egyszerűen szorzom kettővel, és ha hibaüzenetet kapok, akkor nem szám van a cellában. Nem feltétlenül elegáns megoldás, de baromi praktikus minden bevitelellenőrzésnél.
És már harmadszor is le kell írnom, hogy a VBA NEM ad választási lehetőséget a hibakezelésnél, mert csak az On Error Goto utasítást fogadja el. Szóval ha soha nem használnám a GOTO-t, itt akkor is azt kellene használnom, még ha le is köpném utána magamat érte. Ez van, ezt kell szeretni. Ezt, úgy tűnik, senki nem veszi figyelembe, amikor megró a használatáért.
És tényleg javaslom mindenkinek, hogy a fárasztó ellenőrzések helyett egyszerűen kényszerítse az Excelt egy hibára. Sokkal rövidebb a kód, és az ellenőrzések már valahol úgyis le vannak programozva.
Csodálkozva olvastam a GOTO vitát.Reszemröl csak egy megjegyzés:a VBA-ban, tehát mind az Excelben, Accesben a GOTO általánosan használva van. A hibakezelésnek szinte a leggyakrabban használt formája. Ha profi hibakezelést akarsz a procedúrádban, akkor nem tudod kikerülni a GOTO-t. Persze elég kötött a formai használata, és egyáltalán nem teszi átttekinthetetlenné a programot.
Természetesen a programozásban általában kerülni kell a GOTO használatát, de speciális esetekben, mint pl. a hibakezelés, a legjobb megoldás.
Ezen már túl vagyok, az volt az igazi probléma, hogy az A oszlopban szövegek vannak és igazándiból csak szövegrészletre kellett volna keresni, de ezt nem tudtam elővarázsolni belőle. Úgyhogy kicsit megbontottam az excelt. Alapvetően a kitöltést kell megváltoztatni - ha hegy nem megy Mohamedhez...
Most újabb problémával szembesültem de ezt egyelőre még megfogalmazni is csak nehezen tudom, annyira durva (nekem).
Mindenesetre köszönöm a segítséget, most ilyen függvény dógozik, de ezt még ezerszeresen bonyolítani kell - hiába a kapitalisták mindent tudni akarnak :(
Tegyük fel, hogy az A1 cellában van a szöveg, amit keresel és, ha az megfelel a feltételnek, akkor a B1 cella az, amit ki kéne íratni:
=IF(A1="szöveg";B1;"")
ha az A1 cellában a "szöveg" van, akkor a B1 cella tartalmát írja ki, ha nem a "szöveg" van az A1-ben akkor pedig semmit: ""
szintaktikailag lehet, hogy a " jelek helyett ' jeleket a pontosvesszők helyett pedig sima vesszőket kell használnod. Ez a nemzetközi beállításoktól függ asszem.
szbandi,
szerintem valamit félreértettél: a goto használata és a kivétel kezelés nem azonos dolgok. Az ugró ugrások ciklus és elágazás helyetti használata nagyon megnehezíti egy programkód átláthatóságát (és így bővíthetőségét, javíthatóságát). A kivételek kezelése egy egészen más ügy: egy extra eset kezelését extra módon kell megoldani. (Egyébként a goto-t nem használó kivételkezelés is goto-ra épül, pl. C/C++-ban setjmp, longjump párosra.) Sajnos az Excel túl gyakran generál hibát, így a kód túl sok on error-t fog tartalmazni, de ez nem a kódoló hibája, hanem a nyelvé. (Nem értem miért kell egy sikertelen keresésnek egyből hibát adnia, beállíthatna egy globális notfound változót, vagy eljárás helyett függvényként visszaadhatná a sikerességet.)
Na jó, én részemről lezárom ezt a vitát, nem akartam meggyőzni senkit, csak az álláspontomat mondtam el. Azért megnyugtat, hogy nem csak én gondolkodom így, de tényleg semmi előítélet nincs bennem sem a goto-t használókkal sem a nem használókkal szemben. De azért egy dolgot még egyszer kiemelnék. A VBA nyelvben az általam használt
On Error Goto
utasítás működik, mert ennek EZ ÉS CSAK EZ a szintaktikája, teljesen függetlenül a Goto használatának helyességétől. Ha nem akarsz Goto-t használni, akor vagy leellenőrzöl minden egyes hibalehetőséget előre (van néhány), vagy letörlöd az Excelt a gépedről. Vagy fogadod a hibaüzeneteket, ami szintén fárasztó lehet. Mondom, ez független attól, hogy a Goto használata általában helyes vagy helytelen.
picike segítségre lenne szükségem, remélem itt megtalálom majd:
azt pontosan hogy is kell csinálni, hogy kiadjon nekem egy bizonyos cellában levő értéket akkor ha egy másik cellában egy előre meghatározott szöveg áll?
remélem érthető vagyok, márcsak azért is, mert ebből az következne, hogy én értem ;))
Az iskolák Goto-ellenes propagandája annyira sikeres volt, nekem mára sikerült teljesen elfelejtenem a használatát, de emléxem, pályafutásom hajnalán még előfordult, hogy Pascal-ban elejtettem egy-egy goto-t, ha hirtelen kellett megoldani valamit.
Szerintem belénknevelték, hogy aki goto-t használ az nem tud programozni, ezért mindenki fél, na nem a goto-tól közvetlenül, hanem, hogy pancsernak tartják miatta, stb.
Ma már én is furcsán néznék a kódra, ha egy goto-ba botlanék, de nem feltételezném az elkövetőről, hogy egy balfék.
pontosan en sem tudom miert nem szabad hasznalni, egyszeruen csak nem! Iskolaban mindenhol ezt tanitjak!
Ááááááááááááááááááááá........
A goto-val az a baj ? hogy nem struktúrált.
Namost akik nem a pascalon nőttek fel, pl. IBM mainfame, azok tesznek a tanitóbácsik struktúráltprogramozás előadásaira.
"1. Az igazi programozó nem fél a GOTO-tól.
4. Az igazi programozó önmódosító kódot ír - különösen akkor, ha meg bír vele spórolni 20 nanoszekundumot egy kis ciklus közepén."
A gond az, hogy igazi programozó nagyon kevés van és extrém esetektől eltekintve (nemzetközi űrállomás 386-os központi procival...) senkit nem érdekel a progi sebessége.
Fontosabb, hogy egy átlagos képességű kóder gyorsan feltalálja magát a kódban.
"A legtökösebb igazi programozók közül néhány a Jet Propulsion laborban dolgozik Kaliforniában. Sokan közülük fejbõl tudják a Voyager és a Pioneer ûrszondák operációs rendszerét."
éppen ezért írják a goto használatánál, hogy fokozott figyelmet kíván, és ha van jobb, akkor kerüljük el. Ezt így például a Borland helpje is írja, tehát elfogadják, hogy egyes esetekben szükséges lehet.
Nem tudok ilyenre peldat. A programozas, legalabbis szamomra ugy kezdoik, hogy atgondolom mit varok a programtol, _megtervezem_, majd elkezdek kodolni, tesztelek, javitok, goto: tesztelek :))) mig jo nem lesz. Szoval eleve ugy kell felepiteni a programot, hogy ne legyen benne goto. Ha valamiert bennehagytak, annak ezekutan szerintem csak olyan okai lehetnek, hogy azok, akik a hatarido utani pillanatban meg sehol sem tartanak, es rajottek hogy elhibaztak a program felepiteset, legyen egy ilyen eszkoz a kezukbe mint a goto, hogy legalabb annyira mukodokepes legyen a program, hogy lehessen mutatni belole valamit, anelkul, hogy az egesz program strukturajat ujratervezne, es lekodolna. Kivancsi lennek, hany profi programban van goto. Egyebkent hozza kell tennem, pontosan en sem tudom miert nem szabad hasznalni, egyszeruen csak nem! Iskolaban mindenhol ezt tanitjak! Meg fogom tudni.
Aki ezt a hibát még nem követte el. az nem mond igazat.
lolka_bolka
Teljesen igazad van (bár a példád és a goto használata között van némi különbség szerintem, de miért pont ez a hasonlat ne sántítana), éppen ezért írják a goto használatánál, hogy fokozott figyelmet kíván, és ha van jobb, akkor kerüljük el. Ezt így például a Borland helpje is írja, tehát elfogadják, hogy egyes esetekben szükséges lehet. Előfordulhat, hogy ott is hozzá nem értők ülnek? Ezt már sokan megállapították a különböző programozó cégekről, csoda, hogy fennmaradtak.
Mellékesen felhívnám arra a figyelmet, hogy a VBA ismeri az
On Error Goto
utasítást, míg az
On Error Call utasítás
beírása esetén sikítva tiltakozik. Lehet, hogy kimaradtak az első osztályból, ezzel sokan vádolják a MS programozóit, bár az Excel önmagában minden hibájukat elfeledteti velem néha.
Szóval nehéz olyan utasítást végrehajtatni egy programnyelvvel, amit nem ismer.
Direkt nem írtam le, de hát legalább égek egy kicsit.
Mivel az én gépemen volt már tart_keres függvény, automatikusan kijavítottam tart_keres2 függvényre, amit aztán nem vezettem következetesen végig a függvényben.
Meg lehet ugy is, hogy
for ($i=1;$i++) {print("Hello $i\n")}
Az egyik szaz sor, a masik 1, mind a ketto mukodik. Az elsot nem hasznaljuk, a masodikat igen. Pl elkezdes futtatni egy procedurat, ahol mindenfele memoriakat foglalsz le, kulonbozo processeknek, kigoto -zol belole, oszt nem ter vissza... A memoriak meg ott maradnak lefoglalva, mert ugyan te megirtad, hogy a felszabadito rutinokat, de sosem jutott el odaig, mert a goto utan olyan feltetelek teljesultek, ami miatt leallt a program.
Termeszetesen ez akkor is igaz lehet, ha nem hasznalsz goto -t, de szerintem erted mire akarok celozni...
A MS példáprogramokból sok ötletet ki lehet szedni, de sosem a programozási szépségükről voltak híresek, legyenek Basic, VBA vagy C/C++ kódok. Valószínűleg nem programozóknak írják őket (és valószínűleg nem programozók írják őket, bár szerintem a MS programokat sem programozók készítik :-).
Ebben van valami, bár én öregebb lehetek, mert nekem még a goto-t is alaposan megtanították. Hibakezelésnél szoktam használni, mert már nem akarok ahhoz a sorhoz visszamenni, egyébként ezt a megoldást a VBA help-ből szedtem ki még annak idején, én mosom kezeimet mint Pilátus, eddig mindig működött így. Azt nem tanítják egyébként, hogy akkor miért hagyják benne minden programnyelvben? A kérdés komoly, mert tényleg nem értem, olyan, mint ha a szakadékba vezető utat nem lezárnák, csak azt kiírnák, hogy ejnye-bejnye. Vagy nem is szakadék? Egyébként lényegtelen, de azért kösz. Én csak a problémák megoldására koncentrálok, a finomítást meghagyom a tanultaknak hahaha