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.
Bár a másik gépen (most nem tudom megnézni csak holnap) 2014 es office van. Ismernie kéne az IFERROR függvényt. És ott is hibaüzenetet irt ki. A súgóban olvastam, hogy lehetséges ok a hiányzó *.dll file, és pipáljam be a kívánt funkciót. De ott nem tudtam elképzelni sem melyik kellhet neki...
A korábban irt 4 soros is ezen a gépen fut le hibátlanul? Ne hiszem, az alábbiak miatt:
Nagyon úgy néz ki, hogy az IFERROR függvényt az Excel 2010-es verziójában vezették be. Ezért nem szeresse a 2007. Ott sajnos más képlet kell.
Vagy meg kell vizsgálni az iserror függvénnyel az eredményt és ha nem hibás akkor beírni. Nézd meg ezzel:
Sub keresoA()
Dim sor As Long Dim usor As Long usor = Range("A" & Rows.Count).End(xlUp).Row For sor = 1 To usor Range("B" & sor) = Application.VLookup(Range("A" & sor), Worksheets("Adatok").Range("A1:B4"), 2, False) If IsError(Range("B" & sor)) Then Range("B" & sor) = "Nincs adat!!" Next sor End Sub
Bocs, de egy pár napig (2) hírzárlat volt a közelemben, ezért nem tudtam elolvasni a reagálásokat, de Fferi 50 és tbando teljeskörűen kielemezte a problémámat.
Köszönöm!
Valóban elírás volt a keresésnél az oszlop száma, mert egy másik feladatból rövidítettem egy részletet a tanácstalanságom kiemelésére. Én csak egy amatőr programszerkesztő vagyok. Innen-onnan összeszedet, már működő részleteket rakok össze, néhol rögzített makrókat is belefűzök a cél érdekében. Teljeskörű átgondolástól mentesek ezek a kódok, profiknak nem akarom eljuttatni, mert megint leesik egy monitor...
Az, hogy milyen gyorsan és milyen erőforrással dolgozik arról álmodni sem merek, hogy figyelembe vegyem. Bár nagyon elgondolkodtató az okfejtés, és a próba idő mérés az értékadások esetében. Persze gondolom az összes többi művelet esetében is. Hiszen gyakorlat teszi a mestert... És a gyorsan működő programot!
Tartományban_keres: Logikai érték, amellyel az FKERES függvény pontos vagy közelítő keresését adhatjuk meg. Ha értéke IGAZ vagy hiányzik, akkor a visszaadott érték közelítő lehet, azaz ha pontos egyezést nem talált a függvény, akkor a következő legnagyobb, de a keresési_érték argumentumnál kisebb értéket adja vissza. * Ha az argumentum értéke HAMIS, akkor az FKERES pontos egyezést keres, és ha ilyen nincs, akkor a #HIÁNYZIK hibaértéket adja eredményül.
A * jel tőlem származik. Ide jön, hogy rendezett állományban.
A fórumon bejegyzett címedre küldtem. Azért írom ezt meg, mert egyszer azt mondtad, hogy ritkán nézed meg ezt a címet. A régebbi levelezésünk elszállt a gépemről. :(
Akkor vágtam földhöz a monitort, mikor másodjára írta a szerző, hogy a sokak által sűrűn alkalmazott függvény, az FKERES, csak rendezett állományban működik. Nem ismeri a 4. paramétert.
Kösz a válaszod. Mindig tanulok belőle valamit. Most pl. a javasolt with ...end with-ben a .value=.value-t. Majd alkalmasint megnézem, hogy mennyivel gyorsabb mint a copy pastevalue, de erre sajnos egy darabig még várni kell, mert windows7-m total kifingott. Kiírtottam ugyan 3 vírust, de nem segített. Így nincs mese, a gépet a jövő héten be kell vinnem a szervízbe :(((
Bizonyára a makrórögzítőből szerezte be a tudományát. Bár nem tudom, igazi MS kurzuson vajon mit taníthatnak--:)?
Nagyon aranyos vagy, hogy felajánlottad "közkincsnek", de az általad leírtak fényében ettől az "önkinzástól" most eltekintenék. Örök hála, hogy helyettem is szenvedtél és dühöngtél.
Egyébként sajnos úgy látom, hogy igazi Exceles tankönyv talán nincs is a piacon. MS sem nagyon törekszik arra, hogy érthető legyen, amit a Developerek számára leír - az Object modell pedig csak nő-nő mint a kisgömböc. (Lehet ideje lenne már kiszúrni.) Akkora már a dzsungel, hogy néha az erdőtől a fát sem lehet látni (nem véletlenül írtam így), egy objectum objectumának objectuma tulajdonságának az értékét megállapítani - egy tulajdonságra vezető fastruktúrára rálelni, bizony néha maga a gyötrelem.
Az előző hozzászólásom először elszállt a levegőbe (biztos megelégelte a blogmotor a "piszmogásom").
Még annyit tennék hozzá, hogy nem mindegy természetesen, hogy az adott cellába értéket akarsz betenni, vagy képletet, mert a két eset más-más kifejezést kíván.
A számoláshoz a VBA-s forma kell, a képletadáshoz az Exceles forma (azaz számolásnál Sheets("Munka1").range("A2") vagy cells(2,1), képletnél pedig csak Munka1!A2).
Sok igazság van abban amit írsz, néhány gondolatra válaszolnék:
"többet segítek azzal, ha a problémás próbálkozását pofozom helyre, mint ha adok helyette egy ugyan professzionálisabb megoldást, amiből azonban nem derül ki, hogy milyen hibákat vétett"
Ezzel egyet is lehet érteni, de ha egy másik (jobb) megoldást is tudsz mutatni, akkor abból még többet tanulhat.
"Mert amíg az egyik esetben annyiszor kell végrehajtanod az értékadást for-next-tel, ahány sorod van, addig a másik esetben van 1 képleted az első sorban, amit 1 lépésben végigmásolsz az összes soron, majd a lemásolt képleteket megint csak 1 lépésben CopyPasteValue-zol."
Én csak azért tettem szóvá a képlet utána CopyPasteValue megoldást, mert for-next ciklusban mentél végig, akkor pedig teljesen felesleges a képlet, mivel egy-egy celláról volt szó.
Ugyanakkor ciklus nélkül még annál is egyszerűbb a dolog, mint amit írtál, ha összefüggő tartományokról van szó. A példában a következő megoldás:
With Range("B1:B" & usor) .Formula = "=IFERROR(VLookup(A1,Adatok!$A$1:$B$4, 2, False), ""Nincs adat!!"")" .Value = .Value End With
valószínűleg a lehető leggyorsabb. És nem szükséges a CopyPasteValue!!!
IfNa függvényről nem tudok, IsNa van a 2010-ben (gondolom korábban is volt), arra szolgál, hogy megmondja a hba #N/A vagy sem. Egyetlen paramétere van, a vizsgálandó kifejezés/érték.
Úgy tudom az IfError függvény 2007 óta van, és a ha(hibás(kifejezés);igaz;hamis) szerkezetet egyszerűsítette le.
Köszi a hozzászólást. Egyszerűen passzolom, hogy mi lehet a probléma. Nincsenek bonyolult számolások a táblában, de szerencsére nem konzekvens a felépítése, így a képlet végigmásolása nem jó megoldás, 3000 sorba meg belemászni egyenként F2-vel, és enterez-ni kicsit perverz :D Én is azt tudom elképzelni, hogy valami sérülhetett a file-ban, már jó pár éve használjuk... mindenesetre köszi!
Az előző 25216 hsz-m a nyugdíjazott XP-gépem reaktiválásával voltam kénytalen elküldeni, mert a windows 2007-m máról-holnapra total meghülyült és ezt produkálta a válasz közben:
Szia Feri!
Köszönöm, ho gy reagáltál a hozz ászólásomho z . Szeretem ezeke t a viszakérd ezé seket, mert sokat tanul hatunk belőle.
Kérde zed, hogy miért nem e gy lépés ben csiná ltam meg az értékadást mivel szerinte d f elesleges a képletet beírni, csak azért, hogy utána visszaalakítsa m értékké. Nem eg és zen értek vele d egyet. Ez ugy anis csak akkor igaz, ha 1 értékadásr ó l v an szó . D e h a s
Tehát a kurzor állandóan megbokrosodik, hiába állítom vissza újra elindul. Ezt csinálja az excelben is, a Fórum oldalt meg behíva a lap tetejéről leszalad az oldal aljára, és hiába állítom vissza újra levágtat.
Van valami tippetek hogy mi lehet az oka? Vírus? Reparálható?
Köszönöm, hogy reagáltál a hozzászólásomhoz . Szeretem ezeket a visszakérdezéseket, mert sokat tanulhatok/tanulhatunk belőle.
Kérdezed, hogy miért nem egy lépésben csináltam meg az értékadást, mivel szerinted felesleges a képletet beírni, csak azért, hogy utána visszaalakítsuk értékké. Nem egészen értek veled egyet. Amit mondasz ugyanis csak akkor igaz, ha kevés értékadásról van szó . De ha többről akkor már korántsem biztos. Mert amíg az egyik esetben annyiszor kell végrehajtanod az értékadást for-next-tel, ahány sorod van, addig a másik esetben van 1 képleted az első sorban, amit 1 lépésben végigmásolsz az összes soron, majd a lemásolt képleteket megint csak 1 lépésben CopyPasteValue-zol. Ez utóbbi menet pedig aránytalanul gyorsabb lehet mint az első, mivel zömmel az excel beépített metódusait használja és nem a vba-ét. Csináltam is rá egy próbát, ami egészen megdöbbentő eredményt adott. Amíg for-nextes értékadásnál 100 sort 3 mp, 1000 sort meg 33 mp alatt, addig a copyzos 100.000 sort 1 mp alatt, 1.000.000-t meg 5 mp alatt abszolvált.
De valójában mégsem ezért csináltam így, hanem azért mert maciti-nek válaszoltam, és ilyenkor az az elvem, hogy többet segítek azzal, ha a problémás próbálkozását pofozom helyre, mint ha adok helyette egy ugyan professzionálisabb megoldást, amiből azonban nem derül ki, hogy milyen hibákat vétett.
Az hogy a vlookup-jában hibásan a 3-ik oszlopra hívatkozott sima figyelmetlenség lehetett. Nyilván volt egy korábbi forrástáblázata amiben a 3-ik oszlopra kellett hívatkozni, és amikor e tábázatot 2 oszloposra változtatta, elfelejtette aktualizálni a függvényeit. Ilyesmi hibákat én is gyakran elkövetek, és általában igen keserves folyamat míg kiküszöbölöm őket. Általában nem is aznap, hanem másnap, bár akkor promt. Az ő esetében persze az is bezavart, hogy már az IfNa is hibát okozott.
Volt még egy említésre méltó hibája, nevezetesen, hogy a 2-ik vlookup-jában Names(„Anyagok”)-ban kereste az értékeket és nem Range(„Anyagok”)-ban. A munkalaptartományokat ugyanis a vba Range tekinti, akár van nevük, akár nincs.
Végül lenne egy kérdésem: A 2007 fölötti verziókban van ifNa? Ha igen, hogy szól a szintaktikája
Egy egyetemista srác kérte a segítségemet userformos feladatokhoz. Szerinte az előadás egy nulla volt. Kérdezte, milyen könyvet tudnék ajánlani ez ügyben. Kovalcsik Gézáét ajánlottam, mire ő: "...kevéssé információdús, egysíkú, tanár szerint se a legjobb."
A tanára (akinek az előadása egy nulla) Bártfai Barnabástól a Makróhasználat Excelben c. könyvet javasolta. Érdekelt a dolog, beszereztem pdf-ben.
Ilyenek vannak benne: "Minden változónak van egy neve és egy értéke. (Más programnyelvekben típusa is, amely meghatározza, hogy milyen jellegű adat tárolható a változóban. Itt a típust többnyire nem szükséges definiálni, azt az első értékadás határozza meg.)"
"...az FKERES függvény csak ábécébe rendezett listában működik..."
Favorizálja az ActiveCell és a Select használatát.
Ha akad köztetek mazohista, szívesen elküldöm a fájlt, mindössze 118 oldal, egy délután alatt kidühöngheti bárki magát. :)
Igen én is ezzel próbálkoztam. Egyébként is használok rejtett oszlopban számolási értéket, csak arra nem jöttem rá, hogy a példánál maradva hogyan lesz a B6 és C6 zöld hátterű, ha mondjuk a D6 értéke 2, vagy3; illetve B10-C10 piros/sárga, ha a D10 értéke 5.