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.
Azt szeretném elérni, hogy A D1 - D5 cellák tartalma egy másik cellában, egymás alatt jelenjenek meg.
Ha az ÖSSZEFŰZ fgv-t használom, akkor egy cellába kerülnek ugyan, de egymás után. Az egyes részek közé kellene egy sortörést (chr(10) vagy n) beszúrni. Sehogy sem boldogulok vele.
Kimutatással egy oszlop értékeit? Azt hogyan lehet? Az a baj, hogy egymás után több különböző fájban lévő értékeket kellene feldolgozni úgy, hogy az éppen menyitott fálj "Munka1" munkaüzet "A" oszlopának adatait (a különböző adatok és ezek darabszáma) beírni a "Munka2" munkafüzet "A" és "B" oszlopába...majd bezár, új fájl nyitás... Szóval, erre (a különböző értékek számolására) keresek valami frappáns, gyors megoldást.
A másodikra: szum(c5:c65536) (az a maximum) vagy pedig szum(c:c)-szum(c1:c4).
Az elsőre meg leszek lepve, ha lesz valami nem pilótavizsgás megoldás. Ha csak kevés oszlopot kell szummázni, akkor kigyűjtheted ezeket a bal oldali oszlopokba, és rögzítheted vízszintes görgetés ellen is, de fél képernyőszélesség felett ez már nem igazán barátságos megoldás...
Sziasztok! Van egy kimutatás (1 km széles), tele adatokkal. Ráadásul rengeteg sort tartalmaz, ahol bizonyos oszlopokat szummázni kell. Két kérdésem lenne ezzel kapcsolatban:
- arra gondoltam, hogy a szumma sort nem a tábla aljára raknám, hanem a táblázat tetejére (a fejlécek felé). Ekkor, ha rögzítem a fejléc sorát, akkor görgetés esetén (le-fel) mindig látszana az összeg sor. Meg lehet-e oldani azt, hogy ez a szummákat tartalmazó terület akkor is a képernyő közepén maradjon, mikor jobbra-balra görgetem a táblázatot. Kvázi olyan legyen, mint egy lebegő kis terület, ami mindig egy helyen marad, bárhogy mozgok a táblázatban.
- szummázást hogyan lehet úgy beállítani, hogy nem az egész oszlopot jelölöm ki (SZUM(C:C)), hanem csak a fejléc alatti terület szerepeljen pl SZUM(C5:C). Konkrét méretet nem tudok, mivel dinamikus a sorok száma. Csak azt tudom, hogy melyik sortól kell kezdeni a szummázást.
=HA(HIBÁS(ide jön a képleted);"n.a";idejön a képleted ismét)
Azt, hogy hibajelzés helyett nulla jelenjen meg én nem támogatnám, mert összekeverhető azzal az esettel, amikor az osztás eredménye ténylegesen nulla (nulla a számláló értéke, de a nevező nem nulla) Üdv József
A kérdésem az lenne, hogy egy közel 7000 soros adatállományból makróval hogyan lehet lekérdezni a különböző értékeket, ill. azt, hogy ezekből összesen hány darab van?
Valójában folytonosak az intervallumok [0 - 49,9][50-100], de a jobb áttekinthetőség miatt kerekítettem (hogy az oszlopok egymás alatt legyenek). De teljesen igazatok van, így zavaró és a megoldás szempontjából sem egyértelmű.
Sajnos nem értem a feladatot. De az hogy egy dinamikus % is szerepel a kritériumok között, az szvsz legföljebb bonyolítja az összefűzés lehetőségét, de nem szünteti meg.
Hát, ha programból le tudsz hívni egy weblapot, akkor nem lehet olyan nagy gond kicserélni a hivatkozási sztringben a dátumot jelentő részt... Mi a probléma tulajdonképpen?
Hajjjh de megoldhatatlan problémám van! :( Egy weblapról kellene az excelnek külső adatokat átvenni... ez még menne is, de a hivatkozás egy része mindig változik. Pl. www.ittazadat.hu/lekerdezes.cgi?idoszak=2007-03-17 00:00:00 és az időszak helyén mindig a tegnapi dátumot szeretném látni. Szerintetek?
Úgy látszik levágta az index a sorok végét: K2=KÖZÉP(I1;SZÖVEG.KERES("/";I1)+1;SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)-(SZÖVEG.KERES("/";I1)+1)) L2:=ÖSSZEFŰZ("<=";KÖZÉP(I1;SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)+1;HOSSZ(I1)-SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1))) M2:=ÖSSZEFŰZ(">=";KÖZÉP(I1;SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)+1;HOSSZ(I1)-SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)))
Megoldható a dolog, de egy kicsit macerás Itt egy kép:
1. A módosítás az előbbi állományomhoz képest: I1:=ÖSSZEFŰZ(F1;"/";G1;"/";H1) J2:=BAL(I1;SZÖVEG.KERES("/";I1)-1) K2:=KÖZÉP(I1;SZÖVEG.KERES("/";I1)+1;SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)-(SZÖVEG.KERES("/";I1)+1)) L2:=ÖSSZEFŰZ("<=";KÖZÉP(I1;SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)+1;HOSSZ(I1)-SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1))) M2:=ÖSSZEFŰZ(">=";KÖZÉP(I1;SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)+1;HOSSZ(I1)-SZÖVEG.KERES("/";I1;SZÖVEG.KERES("/";I1)+1)))
A H3 cella ugyanaz, mit az előző megoldásban H3:=HA(HIBÁS(AB.MEZŐ(A:E;E1;J1:M2));"nincs ilyen";AB.MEZŐ(A:E;E1;J1:M2))
2. F18:H21 felvettem a kikeresendő értékeket.
I18:=ÖSSZEFŰZ(F18;"/";G18;"/";H18) és ezt lemásolni a végéig(I21).
J17:=H3 (ez egy trükk, ugyanaz a hatása, mintha még egyszer beírnád ide a H3-ban lévő képletet)
3. Ezután kijelölöd a I17:J21 tartományt. Adatok/ Adattábla menüpont Oszlopértékek bemeneti cellája: I1
Ha bővítened kell a kikeresendő értékeket, akkor már csak az I oszlopban lévő képlet másolását és a 3. pontot kell megismételned a kibővített tartománnyal. Hogy szebb legyen a táblázat, ezért az I oszlopot el is rejtheted, amikor nincs szükséged rá. Üdv József
Igazad van! Összefűzéssel lehet egyediséget garantálni (használom is), de sajnos ebben az esetben nem alkalmazható, mert az egyik keresendő érték egy százalékos szám, amit meg kell vizsgálni, hogy melyik intervallumba esik és attól függően visszaadni egy értéket pl.: A 1 0,0 0,5 I A 1 0,5 1,0 J A 2 0,0 0,5 K A 2 0,5 1,0 L B 1 0,0 0,5 M B 1 0,5 1,0 N B 2 0,0 0,5 O B 2 0,5 1,0 P
Egy másik munkalapon pedig vannak az adatok egymás alatt: ... A 2 0,34 X ... ... B 1 0,51 X ... ... A 1 0,72 X ...
Az X-ek helyére kellene kikeresni a felső mátrixból rendre a K N J értékeket.
Szerintem nem tudod több sorra kiterjeszteni a kritériumtartományt. Ahány AB.MEZŐ függvényt csinálsz, mindegyikhez külön kritériumtartomány szükséges. Vagy egyenként szedegeted ki az outputokat. Elég babrásnak tűnik. Ezért azt hiszem mégis az FKERES-sel lenne érdemes próbálkoznod. Az is kicsit babrás, de nagy adattömegnél már rentábilis lehet. Ehhez az adatbázisod elé be kell szúrnod egy oszlopot amiben összefűzöd a kritériumokat. Ha tehát a 3-ik és a 7-ik oszlop adataival keresel, akkor ezen oszlopok celláit fűzöd össze. És ezt az Fkeres már megtalálja. Az elsőt közülük. Tehát ha több van belőlük, esetleg célszerű lehet lesorszámozni az azonos kritériumokat és a sorszámot is hozzáfűzni a kritériumhoz.
Az AB.MEZO() kritérium paraméterének kell egy tartomány. Ez ugye a fejlécből áll és legalább egy sorból. Ez jól is működik az első soromra, de a másodikra már "nincs ilyen" üzenet jön, mert a fejléc alatt már van egy sor, ami már bele tartozik a tartományba. Tehát úgy kellene megadnom a tartományt, hogy az a fejlécet és az adott sort tartalmazza csak.
Pl:. AB.MEZO(A:E; E1; (L1:O1)*(L3:O3) ) vagy a Te példádnál: AB.MEZO(A:E; E1; (J1:M1)*(J3:M3) ) Tehát kimaradna a második sor. Csak nem tudom, hogy hogyan lehet ilyen tartomány megadni!
nem vagyok egy nagy excel használó, de ezt tényleg nem tudom megoldani, segítsetek légyszi, ha tudtok. Az 1. munkafüzet lapon van egy sorszámozott listám (1, 2, 3, 4, 5, 6, 7), a 2.-on szintén megvan ugyanez a lista, csak kicsit másképp (1, 2, 3, 3, 4, 5, 6, 6, 7), a lényeg, hogy nem ugyanaz a sorrend, lehet akár fordított is. A 2.-ból akarom átvenni az adatokat az adott sorszámhoz (1-1, 2-2, 3-3, 4-4 stb), de ugye a 2.-ban eltolódik a lista, teljesen rendszertelenül. Az AB.MENÜ-vel próbálkoztam, de semmi eredmény.
Lenne ezzel kapcsolatban még egy kérdésem: Most már értem a működését, de arra nem találom a választ, hogy hogyan tudom ezt több egymás alatti sorra kiterjeszteni. Ez csak akkor működik tökéletesen, ha a mezőnevek alatt csak egy sor található. AB.MEZO($A:$E; $E$1; $L$1:$O2) Ha alkalmazni szeretném a következő sorra, akkor ezt kelle írnom: AB.MEZO($A:$E; $E$1; $L$1:$O3) De így már nem jó, mert a 2. sor közbeszól (mivel így több találat van), nem lesz eredmény. Létezik erre megoldás, hogy csak a fejlécet és az érintett sort vizsgálja?
Sziasztok! Egy FKERES() függvényt szeretnék megvalósítani, de egy kicsit bonyolultabb formában.
Egy hasonló felépítésű adathalmazom van:
A 1 0 4 X A 1 5 9 Y A 2 0 4 Z A 2 5 9 I B 1 0 4 J B 1 5 9 K B 2 0 4 L B 2 5 9 N
A hövetkező keresésre lenne szükségem PL.: legyenek az első sorban a következő értékek: F1="A", G1=1, H1=63. Ha egy munkalap egy sorának celláira ez teljesül: F1=A és G1=1 és a H1 50 és 99 között van, akkor adja vissza az Y-t. Tehát az FKERES() fgv metodikája alapján keresek három oszlopban és ha mind a három feltétel teljesül egy sorban, akkor visszaadom egy bizonyos oszlop megfelelő sorában található értéket.
Sziasztok! Egy FKERES() függvényt szeretnék megvalósítani, de egy kicsit bonyolultabb formában.
Egy hasonló felépítésű adathalmazom van:
A 1 0 49 X A 1 50 99 Y A 2 0 49 Z A 2 50 99 I B 1 0 49 J B 1 50 99 K B 2 0 49 L B 2 50 99 N
A hövetkező keresésre lenne szükségem PL.: legyenek az első sorban a következő értékek: F1="A", G1=1, H1=63. Ha egy munkalap egy sorának celláira ez teljesül: F1=A és G1=1 és a H1 50 és 99 között van, akkor adja vissza az Y-t. Tehát az FKERES() fgv metodikája alapján keresek három oszlopban és ha mind a három feltétel teljesül egy sorban, akkor visszaadom egy bizonyos oszlop megfelelő sorában található értéket.
Úgy értem, használható (nem felvehető). Tehát a táblázat első 1000 különböző eleme megjelenik a szűrő legördülő menüjében, de ha 1000-nél több eltérő elem van, akkor a többi kimarad ebből a listából, ennek ellenére mégis szűrhető marad, mert ott van, csak nem látszik.
Pl. van egy nagy könyvlistánk, ahol az ISBN-szám szerint keresünk. Leszűrjük és megnézzük, van-e 9789639301191 számú. Nincs a legördülő menüben, tehát nincs ilyen. De vajon tényleg nincs? Most írjuk be a megjelenítési feltételek közé, hogy tartalmaz: 9639. Ekkor leszűri azokat, amelyek tartalmazzák ezt a számot, attól függetlenül, hogy ezek egy része talán nem is látszik a legördülő menüben.
Tehát az AutoSzűrő jól működik, de ne csak a legördülő menüt nézzük, mert a lista csak 1000 elemet mutat!
Nem válik megbízhatatlanná, de a legördülő menü csak 1000 tételt tud listázni. Ettől nagyobb táblázatban marad a szűrés, mert ott vannak a hiányzó elemek is, csak nem látszanak a legördülő menüben, ám a megjelenítési feltételek közé felvehetőek.
Nem biztos, hogy jól értem. Ha azokat a tételeket akarod kilistázni, amik előfordulnak az oszlopodban, Adatok/Szűrő/Irányított szűrő/Más helyre másolja, és Csak az egyedi rekordok megjelenítése.
Jelöld ki a B oszlopot. Szerkesztés/Ugrás/Irányított/Üres cellák. Ez kijelöli az üreseket az oszlopban, és az aktuális az első üres cella lesz. Ide beírod: "=" (idézőjel nem kell) és balra nyíl, Ctrl+Enter az összes kijelöltbe egyszerre beírja. Ezután érdemes újra kijelölni az oszlopot, másolás, ugyanoda irányított beillesztés, értéket. Ha ezt kihagyod, a legközelebbi rendezésnél összekuszálódnak az adataid.
Mégsem megy így. Arra lenne szükségem, hogy ha az 'A' oszlopom első 100 sorában van adat, viszont a 'B' oszlopom első 100 sorában itt-ott van néhány üres cella, akkor a függvény a 'B' oszlop üres celláit, helyettesítse, töltse ki az 'A' oszlop megfelelő cellájával (azaz, hogy a különbségük nulla legyen) de csak ott ahol eredetileg üres cella volt... Esetleg erre valami tipp?
Plusz ami még érdekelne, hogy ha van egy oszlopom amiben van X db rekord (sor), de ez az X darab csak Y eltérőből fajta rekordból tevődik össze (Y<X), akkor van-e olyan függvény ami kilistázza az Y db eltérőt az X db közül. Azaz minden típusból csak egy db legyen, egy másik oszlopban.
Köszönöm előre is a segítséget, és bocs az amatőr kérdésekért...
A legegyszerűbb megoldás a Szerkesztés/Csere (Ctrl+H)
Jelöld ki a táblázatodat, majd Ctrl+H . Itt a keresett szöveg mezőt üresen hagyod, a csere erre mezőt kitöltöd, arra amit meg szeretnél jeleníteni az üres cellákban. Az Összes cseréje gombbal "kitöltődik" az összes üres cella.
Még egy kérdés. Ha van egy oszlopom amelyben vannak értékekek, de egy-két cella üres, akkor van-e olyan függvény amely segítségével minden üres cellába be tudok írni egy előre megadott karaktersort? Azaz ki tudom tölteni az üres helyeket (cellákat).
Köszönöm szépen, sikerült. Már próbálkoztam ezzel a függvénnyel, csak a cellaformázást sikerült elrontani, ezért gyorsan fel is adtam. De most működik! Szóval köszönet mégegyszer!
Üdv mindenki! Nem vagyok nagy Excel guru, csak néhány egyszerűbb dolgot tudok kivitelezni. Sajnos most belefutottam egy bonyolultabb problémába.
Az alábbi linken látható a probléma .jpg formátumban, illetve feltettem .xls-ben is, ha valaki letöltené (naponta frissül a NOD-om, de vírus ellenőrzést azért csináljatok).
Szóval egy olyan függvény kéne, amivel ki lehetne számolni, hogy melyik dolgozó hány órát dolgozott összesen az adott hónapban (a táblázatban csak pár nap szerepel...). A gond csak az, hogy ha egyik dolgozó valamelyik nap nem dolgozik, aznap a listára nem kerül fel. Szóval egy olyan függvény kellene ami a névvel egy sorban található ledolgozott óra értékeket összegezné és rendelné névhez.
Huhh, lehet, hogy nem túl érthető, de remélem igen. Előre is óriási köszönet a segítségért!!
Üdv mindenki! Nem vagyok nagy Excel guru, csak néhány egyszerűbb dolgot tudok kivitelezni. Sajnos most belefutottam egy bonyolultabb problémába.
Az alábbi linken látható a probléma .jpg formátumban, illetve feltettem .xls-ben is, ha valaki letöltené (naponta frissül a NOD-om, de vírus ellenőrzést azért csináljatok).
Szóval egy olyan függvény kéne, amivel ki lehetne számolni, hogy melyik dolgozó hány órát dolgozott összesen az adott hónapban (a táblázatban csak pár nap szerepel...). A gond csak az, hogy ha egyik dolgozó valamelyik nap nem dolgozik, aznap a listára nem kerül fel. Szóval egy olyan függvény kellene ami a névvel egy sorban található ledolgozott óra értékeket összegezné és rendelné névhez.
Huhh, lehet, hogy nem túl érthető, de remélem igen. Előre is óriási köszönet a segítségért!
Majdnem megoldódott a Pivot-táblákkal kapcsolatos problémám. Ha nem akarom látni a már nem is létező értékeket a szűrésben, akkor: Excel 2007-ben: Kimutatás beállításai > Adatok > Adatforrásból törölt elemek megőrzése > Semennyi
Azonban ilyen lehetőséget nem találok az Excel 2002 (SP3) menüiben. Mi a megoldás? Mert valami csak van...
Azt szeretném megtudni, hogy Excelben lehet-e olyat csinálni, hogy mondjuk egy cellát, legyen pl:B2 ,és mondjuk egy másik cella, pl: G7, ezeket egy vonallal összekötni, azaz, mikor ha kinyomtatom, látszódjék, hogy ez a két cellának valami köze van egymáshoz.
Hogy tudom lekezelni, makróban, hogy a szürő hozott e eredményt. Azt szeretném, hogy egy adott müveletsor akkor hajtodjon végre ha a szürés nem talált egy rekordot sem
Ha a Label objektum Caption tulajdonsága tartalmazza a hyperlinket, akkor az alábbi kód Label-re kattintás esetén megjeleníti (v. legalábbis megpróbálja megjeleníteni) a link által hivatkozott oldalt v. fájlt, az alapértelmezett alkalmazásban. Pl. kép vagy URL esetén Internet Explorer, .xls esetén Excel, stb.
Private Sub Label1_Click() ThisWorkbook.FollowHyperlink Address:=Label1.Caption, NewWindow:=True End Sub
Az általános és teljes járatlanságom miatt. Először készítek UserFormot, és rögtön táblázatos kiírással és hyperlinkkel kezdem.
A bevitelnél
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:=k, TextToDisplay:=k sor viszi be egy cellába a fotót, ahol a k az útvonalat, kép címét és kiterjesztését tartalmazza. A cellában kattintásra elő is jön a fotó.
A lekérdezésben az aktuális TextBoxba ennek a cellának a tartalmát íratom, itt akadtam el.
Most tettem fel egy Labelt. Oda be tudom íratni a cella tartalmát, de megint megállt a tudományom.
Azért nem értem, mert ha a Textboxot programból feltöltöd adatokkal, akkor (tudomásom szerint) csak a Change esemény váltódik ki. Míg ha egérrel kattintasz rá, akkor az Enter, MouseDown, MouseUp (majd később az Exit) események.
Szóval szerintem nem kellene ütközésnek lennie. Hogy néz ki az eseménykezelő rutinod?
Amúgy adatok megjelenítésére miért textboxot használsz? Én inkább címkéket (Label) használnék. Egyrészt a Labelnek van Click eseménye míg a Textboxnak nincs. Másrészt a Labelre kattintva a felhasználó nem esik abba a tévképzetbe, hogy neki ott szövegszerkesztenie kell valamit. Ha csak a kinézet miatt, nos hát címke is tud úgy kinézni, mint egy szövegdoboz. Hm?
A legördülőből kiválasztom az utcát, ennek hatására az alatta lévő táblázatba beíródnak az adatok, többek között az utcához tartozó fotók hyperlinkje is. Ha eseménykezelést teszek a fotó TextBoxához, az adat beírására is eseményt akar kezelni. Holott én azt szeretném, hogy a betöltött és mutatott hyperlinkre kattintva megjelenne a fotó.
"Hamvábaholt ötlet volt az esemény kezelés a TextBoxhoz. Lekérdezésben jelennek meg a hyperlinkek. Mikor a TextBox-ba betöltődnek a hyperlinkek, azt is eseményként érzékeli, nemcsak ha rákkattintok a linkre."
Nem teljesen értem a problémát, illetve azt, hogy mi a kérdés.
"A TabIndexet könnyebb kezelni a form-on jobbra kattintva megjelenő Tab Orderrel. Felsorolja a formon lévő objektumokat, és könnyen, fel-le léptetve lehet módosítani a bejárási útvonalat."
Ennek örülök :) Nem egy alkalommal vesződtem már vele nagyon sokat, míg rendesen sorbaraktam az objektumaimat gyalog-módszerrel. Kösz a tippet!
Hamvábaholt ötlet volt az esemény kezelés a TextBoxhoz. Lekérdezésben jelennek meg a hyperlinkek. Mikor a TextBox-ba betöltődnek a hyperlinkek, azt is eseményként érzékeli, nemcsak ha rákkattintok a linkre.
A TabIndexet könnyebb kezelni a form-on jobbra kattintva megjelenő Tab Orderrel. Felsorolja a formon lévő objektumokat, és könnyen, fel-le léptetve lehet módosítani a bejárási útvonalat.
Kösz szépen, most vettem észre a válaszodat. Erre még a régi, Accesses (gyenge) ismereteimből emlékeztem, meg is csináltam.
Már csak egyetlen gondom van. Az adatok közé egy előző útmutatásod szerint bevittem a csatolandó jpg-k hyperlinkjét, de a lekérdezésben csak az útvonal jelenik meg, nem tudom előcsalni magát a fotót. Most, miközben pötyögtetek, eszembe jutott, hogy a kérdéses TextBoxokhoz kellene makrót csatolni. Megbróbálom.
"(és nem is 80, hanem 160 db van belőlük), mert táblázatosan, 20 sorban helyeztem el őket,"
Hajjaj, ezt ismerem... Egy tanács: érdemes a Textboxok felpakolása után ellenőrizni és szükség esetén javítani a bejárási sorrendet, vagyis azt, hogy a TAB lenyomásakor a kurzor melyik szövegdobozba ugrik át. Egy jól megtervezett sorrend nagyon meg tudja könnyíteni az adatbevitelt (már a felhasználói oldalon).
A bejárási sorrendet a Textbox objektum TabIndex tulajdonságával lehet beállítani. Nullával kezdődik a sorszámozás. Ha valamelyik vezérlőelem tabindexét módosítod, nyilván másoké is változni fog, számomra nem teljesen világos logika szerint. Ezért, ha azt akarod, hogy az egyszer már jól beállított tabindexek megmaradjanak, érdemes a nullával kezdeni, és egyesével felfelé menni a számokkal. Ilyen esetben az aktuális sorszám alatti számok (tehát amiket eddig beállítottál) nem változnak már meg, csak ami fölötte van, de azok meg úgyis sorra kerülnek még, és megkapják a végleges értéküket.
Sub Összefésülés() Dim S1 As Worksheet, S2 As Worksheet Dim R1 As Range, R2 As Range, c As Range, Hit As Range
Set S1 = Workbooks("cimlista.xls").Sheets("részletes") Set S2 = Workbooks("sm.xls").Sheets("Munka1") Set R1 = S1.Range("B:B") Set R2 = S2.Range("B3"): Set R2 = Range(R2, R2.End(xlDown))
For Each c In R2 If c = "" Then Exit For Set Hit = R1.Find(what:=c, LookIn:=xlValues, LookAt:=xlWhole) If Hit Is Nothing Then c.EntireRow.Copy S1.Range("B" & S1.Rows.Count).End(xlUp).Offset(1, -1) Else c.EntireRow.Copy Hit.Offset(, -1) End If Next End Sub
A vastagbetűs sor a 3000 soros adatbázis B3 cellájától kezdődően lefelé, az első üres celláig tartó cellatartományt definiál. Az 1004-es run-time errort az okozta, hogy egy teljes sort másoltam ki, majd a cél munkalapon a B oszloptól kezdődően akartam beilleszteni. Így a sor utolsó cellája kilógott (volna) a munkalapról.
A feladat csak annyival bonyolultabb, hogy nem simán T1, T2...Tn a textboxok neve(és nem is 80, hanem 160 db van belőlük), mert táblázatosan, 20 sorban helyeztem el őket, és a megnevezésük utal a táblázatban elfoglalt pozíciójukra. Ugyanúgy a jelölőké is.
A válaszoddal nagyon sok munkát sikerült megspórolni.
Bocs nem figyeltem, az 1-2 sorom egyesített cella,(fejléc). B osszlop első sorában nincs semmi. Azt meg lehetne-e csinálni hogy a 3.sortól kezdje az egyesítést? Köszönöm
Lefut hiba nélkül,csak az a gond, hogy a régi adatbázist nem frissíti az új adatokkal. Viszont annyit csinál hogy az sm.xls első sortát átmásolja a cimlista.xls utolsó sorbába.
Egy MultiPage egyik lapján 80 db szövegdoboz és 40 jelölőnégyzet adatait kell feltöltenem, ill. törölnöm a tartalmukat. Úgy adtam nevet nekik (T1, T2, C1, C2), hogy ciklusból hajthassam végre a műveleteket, de nem találom, hogyan hivatkozzak rájuk.
Van több régi Excel file-om, amelyekben a pivot-táblák forrásadatait rendszeresen cserélgetem, aztán a kimutatást frissítem. Ennek mára az lett az eredménye, hogy a kimutatásban a szűrések állítgatásakor megjelenik minden olyan lehetőség, ami valaha is kiválasztható volt, holott a legfrissebb forrásban már nem is szerepel. pl. 2004 decembere simán kiválasztható, pedig most csak 2008-as adatokkal dolgozom. Hogy lehet ezt aktualizálni?
Nincs mit. Ha jól raktam össze, akkor ez lesz a megfeleló makró. Javaslom, futtatás előtt készíts biztonsági másolatot mindkettőről, és persze mindkettőnek megnyitva kell lenni a futás idején. Ha valami még mindig nem stimmel, akkor légyszi jegyezd fel a hibaüzenetet, és legközelebb írd meg.
Sub Összefésülés() Dim S1 As Range, S2 As Range, c As Range, Hit As Range
Set S1 = Workbooks("cimlista.xls").Sheets("részletes").Range("B:B") 'ez a régi adatbázis, a 20000 sor Set S2 = Workbooks("sm.xls").Sheets("Munka1").Range("B:B") 'ez a frissítés, a 3000 sor
For Each c In S2 If c = "" Then Exit For Set Hit = S1.Find(what:=c, LookIn:=xlValues, LookAt:=xlWhole) If Hit Is Nothing Then c.EntireRow.Copy S1.Parent.Range("A" & Rows.Count).End(xlUp).Offset(1) Else c.EntireRow.Copy Hit End If Next End Sub
PS: Az írásjelekkel lehetnél kicsit bőkezűbb, mert percekbe telt, mire megértettem a 2. mondatodat ;)
Köszönöm a makrót de valamit elszúrok mert nem akar lefutni. Ha megkérlek behelyettesíted az adatokat a 20000-es adatbázisnál cimlista.xls lapfül neve pedig részletes B oszlop egyezik a 300-as adatbázissal ami pedig sm.xls munka1 Köszönöm
A tartomány teljes definíciójához hozzátartozik a munkafüzet és a munkalap megadása is. Ezek híján (pl. a fenti esetben) a kifejezés az aktív munkafüzet aktív munkalapjára vonatkozik. Tisztességes így lenne:
Dim WB As Workbook, WS As Worksheet, Tartomany As Range Set WB = Workbooks("valami.xls") Set WS = WB.Sheets("Munka1") Set Tartomany = WS.Range("A2:A" & WS.Rows.Count)
Köszi! Szuperül működik! Azért egy fél napot megspóroltál nekem!
Még egy kérdésem lenne: A táblázatban van fejlécem. Hogyan tudok úgy létrehozni Range-t, hogy ne a teljes oszlop legyen benne. Szóval a fejléc (első cella) kivételével az egész oszlop legyen a része. Valami ilyesmire gondoltam:
Az összefésülés számomra könnyebbnek tűnik (mivel a másikra nincs ötletem :))
Sub Összefésülés() Dim S1 As Range, S2 As Range, c As Range, Hit As Range
Set S1 = Sheets("Adat1").Range("A:A") 'ez a régi adatbázis, a 20000 sor Set S2 = Sheets("Adat2").Range("A:A") 'ez a frissítés, a 3000 sor
For Each c In S2 If c = "" Then Exit For Set Hit = S1.Find(what:=c, LookIn:=xlValues, LookAt:=xlWhole) If Hit Is Nothing Then c.EntireRow.Copy S1.Parent.Range("A" & Rows.Count).End(xlUp).Offset(1) Else c.EntireRow.Copy Hit End If Next End Sub
A makró soronként végigmegy a 3000 adatos táblázat első oszlopán, és megnézi, hogy az ott talált azonosító megvan-e a 20000 soros táblázat első oszlopában. Ha igen, akkor a teljes sort felülírja. Ha nem, akkor hozzácsapja a 20000 sor után.
A vastag betűs sor azt teszi, hogy ha a 3000 soros adatbázisban olyan sorhoz ér, amelynek az első cellájában nincs semmi, akkor kilép a ciklusból. (Ezzel tesztelem, hogy van-e még mit át másolni.) Tehát az adatbázis legyen összefüggő, kezdődjön a táblázat első sorában, és az A oszlop legyen rendesen feltöltve. Természetesen, ha az azonosító nem az A oszlopban van, módosítani lehet a kódot.
Köszi, szerintem teljesen jó lesz így. Külön oszlop lesz egy tartomány, amit rendezni kell -mintegy törzsadat- úgyhogy nem tud bekavarni a többi oszlopba. Majd tesztelem. A paraméterezést meg átvariálom, ha kell. Mégegyszer köszi!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Tartomany As Range Set Tartomany = Range("A:A") If Not Intersect(Target, Tartomany) Is Nothing Then Target.CurrentRegion.Sort Key1:=Range("A1"), _ Order1:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _ Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
End Sub
Ezt a makrót a kérdéses munkalap kódlapjára kell betenni. A makró (szinte) mindig lefut, amikor egy (azaz bármely) cella tartalma módosul. Ha a megadott tartomány (A oszlop) és a változó cella metszete nem üres halmaz, (tehát a cella az A oszlopban van,) akkor történik egy sorbarendezés az A oszlop alapján.
De ez csak egy tök általános valami, önmagában csak nagyon korlátozottan használható. Sok nyitott kérdés van amelyek megválaszolásával testre kell szabni. 1) Nyilvánvaló, hogy a Tartomany nevű változót deiniálni kell, én most csak hasból megadtam az A oszlopot. 2) Az is nyilvánvaló, hogy a Sort utasítást megfelelően paraméterezni kell (rendezés alapja, emelkedő v. csökkenő rendezés, stb.) 3) Nem biztos, hogy a CurrentRegion jól találja el, hogy mi az a cellatartomány, amit rendezni akarsz. (Ez ugyanaz, mint amikor egy cellán állva menüből sorbarendezést kérsz, és az excel automatikusan kiegészíti a rendezendő tartományt. Nem mindig úgy, ahogy kellene.) 4) Tegyük fel, hogy a teljes adatbevitel azt jelenti, hogy az A, B, F és G oszlopokba is beírsz értékeket. Ebben az esetben az A oszlopot kell utoljára hagynod, mert ha ott megváltozik egy érték, a sorbarendezés rögtön lejátszódik, és aztán keresheted, hogy melyik sorba került, hogy a hiányzó adatokat is beírd. 5) Egyéb problémák, amelyekre most nem gondolunk.
Még telepítenem kell a ms query-t, de nemsokára megcsinálom. Ígéretes! Mégha nem is a konkrét feladathoz. Arra gondoltam, hogy ezzel szépen ki lehet szedegetni ismétléseket egy táblázatból. Illetve összesíteni rájuk. De még tesztelni kell:)
Makroval hogyan oldható meg, hogy figyeljen egy tartományt és ha változik, csináljon egy sorbarendezést?
Hát van itt egy érdekes makró nélküli lehetőség, most találtam, de nem tudom, jó lesz-e Neked.
Szóval, tegyük fel, hogy van egy munkafüzeted, abban a Munka1-en egy táblázatod (ez az, amit bővítgetsz). Az oszlopoknak van fejlécük (ez fontos), és munkafüzet el van mentve (tehát a merevlemezen megtalálható).
Megnyitod a mf-et, és kiválasztod a Munka2 lapot. Menü: Adatok -> Külső adatok importálása -> Új adatbázis lekérdezés Az Adatforrás kiválasztása ablakban Excel Files*, majd OK gomb. A Munkafüzet választása ablakban megkeresed ezt a munkafüzetet, amely éppen nyitva van, és amelyben dolgozol. A Lekérdezés varázsló ablak bal paneljében a Munka1$ melletti kis plusz jellel lenyitod, hogy milyen oszlopok vannak a táblázatban, és egyenként mindegyiket átteszed a Lekérdezés oszlopai panelba. Tovább gomb. A következő ablakban szűrheted a rekordokat, az azutáni ablakban pedig sorbarendezheted őket a kívánt mező (oszlop) alapján. A következő ablakban Adatok átadása a MS Office Excel programnak, majd beillesztés a létező munkalap A1 cellájába. Ezzel létrehozod a Munka1 oldal szűrt, rendezett másolatát. Jobb gombbal belekattintasz a frissen létrehozott táblázatba, és kiválasztod az Adattartomány tulajdonságait. Itt pedig bekattintod a Frissítés 1 percenként kapcsolót, és ezzel kapsz egy olyan lekérdezést, amely max 1 perces késéssel követi azt, amit a Munka1-en művelsz. Ha oda új sorokat írsz be, az hamarosan a Munka2-n is megjelenik, még el sem kell menteni hozzá a munkafüzetet. A lekérdezés celláit aztán felhasználhatod képletek bemenő paramétereként is.
Szóval ez a munkafüzet önmagát használja adatbázisként, és az egyik lapjából készült lekérdezést jeleníti meg a másik lapján! Jó nem? :) Még nem látom át, hogy mi mindenre lehet ezt használni, de ígéretesnek tűnik :)
Az hogy oldható meg, hogyha van egy listám és a végére beírok valamit (bővítem), akkor amint bekerült egy elem, rendezze sorba automatikusan abc szerint?
Sziasztok Az lenne a kérdésem,hogyan lehet megoldani azt, hogy külső adat importálásakor, a meglévő cellákat felülírja új adatokkal a nem használt cellákat viszont ne törölje. pl:20000-es adatbázisban esetleg csak 3000 adatnál /sorban/ van változás a változtatott 3000 adatot /sort/tartalmazó adatbázist importálja (felülírja a régit) de a maradék 17000 adat /sor/ ahol nincs változás az törlődik. Vagy esetleg valamilyen módon összefésülni a két adatbázist. Van minden sornak azonosítója.
Egy megoldás lehet, ha a munkalap Change eseményét használod fel:
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("G:G")) Is Nothing Then Target.Offset(, 1).FormulaR1C1 = "=IF( RC[-1] <> """", VLOOKUP(RC[-1], xarfolyam, 4, FALSE), """")" End If End Sub
Ez azt csinálja, hogy ha a G oszlopban megváltozik egy cellaérték, akkor a változó cella mellé, a H oszlopba beírja a megfelelő képletet. Sajnos a dolog nem valami rugalmas. Amikor egy cellát odébb teszel, amikor egy sort v. oszlopot beszúrzs, illetve törölsz, a cellákban lévő képleteket az Excel frissíti. Ezt a kódot nem fogja frissíteni. Tehát ha egyszer átrendezed a munkalapot, pl. nem a G oszlop változása alapján, és nem a H oszlopba kell tenni a képletet, akkor ez a kód hülyeségeket fog a táblázatodba írkálni.
Szóval csak akkor javaslom a használatát, ha már fix elrendezésű táblázatod van.
A kód testreszabása:
Rögzíts egy makrót, amelyben a megfelelő cellába beírod a megfelelő képletet. Ha pl. a G9 cella módosítása után a H9-ben kell megjelennie a kikeresett árfolyamnak, akkor állj a H9 cellára, és írd be oda a képletet. (A rögzítés itt véget ér.) Keresd meg a friss makród kódját, és a benne található FormulaR1C1 = ... (valami képlet) részt helyettesítsd be a fenti program vastag betűs részébe.
1. Sok dátumot kell bevinni. Egy ciklusban változtatom majd a TextBox nevét az ellenőrzéshez. Hangzatos T1, T2 ... Tsok névre hallgatnak majd a beszédesebb nevek helyett.
Na ezt már nem eszi meg. Hiába írok be a következő "G10"-es cellába értéket, csak les lám vissza üres "szemekkel" Az xarfolyam cimke, ráadásul egy másik munkalapon van.
Amiket mondtatok, azokat bepipáltam (be is voltak).
"TextBoxnál hogy adhatom meg, hogy a bekért adat éé.hh.nn formátumú legyen?"
Tudtommal sehogy. Azonban lehet a beírt értéket utólagosan ellenőrizni, és hiba esetén megfelelő lépéseket tenni. Az alapelv az, hogy a Textbox objektum OnExit eseményéhez írsz egy kódot, ami a Textboxba írt értéket ellenőrzi, és ha nem jó, akkor a Cancel változót True-ra állítja. Cancel = True esetén az Excel nem engedi, hogy a fókusz elhagyja a Textbox-ot.
Maga az ellenőrző rutin már rajtad múlik, hogy mennyire akarod tökéletesre csinálni. Lehet például regular expressions használatával:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim RegExpObject As RegExp, ExpMatch As Boolean
Set RegExpObject = New RegExp
With RegExpObject .Pattern = "^d{2}.d{2}.d{2}$" .IgnoreCase = True .Global = True End With ExpMatch = RegExpObject.test(TextBox1.Text) Set RegExpObject = Nothing If ExpMatch = False Then MsgBox "éé.hh.nn fomátumot használj" Cancel = True End If End Sub
A fenti program éé.hh.nn formátumot követel meg, de nem ellenőrzi a dátum érvényességét, tehát 99.99.99 is átmegy. Ha ebben gondolkodsz, ajánlom figyelmedbe, amit összehoztunk a 6008-as hsz-tól kedződően, illetve google keresést a "regular expressions" kifejezésre.
Írhatsz egyedi ellenőrzést is, saját logikád alapján.
"Hova írjam azt a szubrutint, amelyiket mindkét űrlapomról el szeretnék érni, avagy mi a szintaktikája az elérésnek második űrlapról, ha az első űrlap kódlapjára írom?"
Szerintem általában nem szerencsés az űrlapok kódját keverni, legalábbis akkor nem, ha egy űrlapot úgy akarsz megtervezni, hogy máskor, másik programban is használható legyen. De egyébként a válasz ez:
1) Ha standard kód modulra teszel egy Sub-ot, az alapértelmezésben Public Sub, és minden űrlapról meghívható.
2) Ha a Userform1 kódlapjára teszel egy Sub-ot, az alapértelmezésben szintén Public Sub, de más űrlapról, ill. standard kódmodulról úgy kell rá hivatkozni, hogy Userform1.Szubrutinnév
Hova írjam azt a szubrutint, amelyiket mindkét űrlapomról el szeretnék érni, avagy mi a szintaktikája az elérésnek második űrlapról, ha az első űrlap kódlapjára írom?
A Usedrange kifejezés a cellaformátumot is figyeli. Ha pl. csak az első két oszlopban van adatod, ugyanakkor az egyébként üres C3 cella betűtípusa félkövér, akkor a UsedRange kifejezés a C oszlopba teszi az utolsó cellát.
Ez jó is lehet, meg nem is, attól függően, hogy mire van szüséged.
A SpecialCells(xlCellTypeLastCell) szvsz használhatatlan, mert nagyon gyakran eltéved. Olyan, intha valami "memória-effektusban" szenvedne, és olyan helyre teszi az utolsó cellát, ahol már rég nincs semmi.
A LC = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column egy nagyon ötletes találmány, ennél viszont az lehet a gond, hogy üres munkalap esetén futási hibát generál, amit vagy On Error Goto kifejezéssel kezelni kell, vagy előzőleg ellenőrizni kell valamilyen módon, hogy a munkalap üres-e, és csak akkor szabad ráengedni, ha nem üres.
Egy szó, mint száz: több módszer is van, és mindegyiknek van előnye és hátránya. Neked kell eldöntened, a lehetséges helyzeteket figyelembe véve, hogy melyik a legalkalmasabb az adott esetben.
a) Cells(1, Columns.Count) -> az első sor és a legutolsó oszlop metszőpontjában lévő cella. b) .End(xlToLeft) -> a pont előtti kifejezéssel megadott (esetünkben az a) alatt meghatározott) cellához képest egy ctrl + ← kombinációval utánozható ugrás. c) .Column a pont előtti kifejezéssel megadott cella oszlopának száma.
Ez a kifejezés akkor ad 1-et eredményül, ha az első sorban 1) egyáltalán nincs érték 2) csak az utolsó oszlopában (IV1 cella) van érték 3) csak az első oszlopában (A1 cella) van érték.
A kifejezés egy adott sor utolsó eleme oszlopszámának meghatározására való. Mint ahogy az utolsó sor meghatározására használt sor=Range("A" & Rows.Count).End(xlUp).Row képlet is csak az A oszlopra vonatkozik. Ha más oszlopra keresel, a képletet módosítani kell.
Egyetlen dolog jutott eszembe, ami miatt a kísérleted meghiúsulhat: ha túl nagy a fájlméret. (Bár, ha ez a probléma, a fórumszoftver megmondja.) Én a screenshot-ról mindig levágom a fölösleges részt, a maradékot pedig jpg formátumban mentem el, és nem szokott gondom lenni a feltöltéssel.
4-5 sor után automatikusan kiegészít. Ha olyan adatot írsz be az A oszlopba, amelyre a képlet nem értelmezhető, (pl. szám helyett betűt,) akkor leáll a kiegészítés. Ha kitörlöd a betűt, aztán - ezúttal helyesen - számot írsz a cellába, akkor újraindul.
Az Eszközök/Beállítások Számolás lapján jelöld be a Külső hivatkozásokat felfrissít jelölő négyzetet. Ez elméletileg, ha már legalább 5 képlet volt fölötte, amint megkapja a hatodikhoz az értékeket, beírja a 6. képletet.
Példa (mert érzem, hogy sántít a leírásom):
A1:A5 tartományban számok vannak, B1:B5-ig képlet, ami az A oszlop adatával számol, mondjuk =A1*2. Ha A6-ba adsz adatot, a B6 lemásolja a fölötte lévő képletet.
Nem mindig jön össze, még nem tudtam rájönni, miért.
Egy folyamatosan bővülő táblázatot szeretnék készíteni. Végül is egy nyitó-záró egyenleg nyilvántartó kis táblázatot. Mondjuk, az A oszlopba felviszek egy értéket, és a Boszlopban elvégzek vele valamilyen műveletet. Hogyan tudom a B oszlopban lévő képletet érvényesíteni, az egész B oszlopra? Szóval, ha új sort kezd a felhasználó, akkor ne azzal keljen kezdenie a bevitelt, hogy az előző sort lemásolja, hanem automatikusan kiértékelődjön a B oszlop adott sora?
Azt próbáltam, hogy kijelöltem a B oszlopot és a képletet bemásoltam, de akkor egy 10 MB-os üres fájlom keletkezett alapból. Ráadásul nem valami elegáns megoldás, mert egyből 65535 sora lett :(
Hát nem mondom, hogy minden világos abból, amit írtál :-), de azért néhány dolgot megértettem. Azt hiszem kell majd egy kis időt szánnom a kielemzésére :-).
Nagyon köszönöm, hogy ilyen sok energiát szántál a problémámra :-)!!!
...ha lefuttattam egy macrot és csak teszteltem, akkor nekem nem kötelező elmentenem a dokumentumot és a macro megmarad, igaz? Vagy, ha ilyenkor nem mentem el a dolumentumot, akkor a "lefuttatott" macro is elveszik?
Ha a rögzítéskor a makró helyének az "Ebben a munkafüzetben"-t választod, csak akkor marad meg, ha ezt a füzetet elmented.
Ha az "Egyéni makró-füzetben"-re esik a választásod, akkor a personal.xls nevűbe menti el (ezt önállóan végzi az Excel, nem kell külön mondani neki), és akkor bármelyik füzetedben alkalmazhatod. Általános érvényű makrókat érdemes ide tenni, amiket csak egy-egy füzetben használsz majd, azt a saját füzetébe mentsd.
Nekem pl. a personalban ilyenek vannak:
A kijelölt területre véletlenszámot ír be
A cellák méreteit mm-ben adhatom meg
Kiírja a kijelölt cella háttérszín-kódját, a font színének kódját, stb.
Érdemes még beállítani az automatikus mentést x percre – "Csak az aktív munkafüzetet" és "Mentés előtt rákérdez" paraméterekkel –, mert munka közben könnyű elveszíteni az időérzékünket, és megfeledkezünk a Ctrl+S-ről.
Azt hiszem, tisztáznunk kellene néhány alapfogalmat. Segítségül mellékelek egy képet.
Zölddel bekarikáztam a Project Explorer nevű ablakot. (Ha nincs ilyened, akkor Menü -> View -> Project Explorer.) Ebben megtalálod az összes megnyitott munkafüzetet. A munkafüzeteken belül az alábbi objektumcsoportok lehetnek: 1) Microsoft Excel Objects -> lényegében az Excel munkalapok 2) Forms -> űrlapok 3) Modules -> standard kódmodulok 4) Class Modules -> osztálymodulok
Az objektumok közül a normál Excel ablakban csak az Excel munkalapokat látod. A többiek csak a Visual Basic Editor ablakban, a Project Explorerben láthatók.
Mindegyik objektumcsoportban több adott típusú objektum lehet, tehát több munkalap, több űrlap, stb
A fenti objektumok mindegyike (tehát minden munkalap, űrlap, standard kódmodul és osztálymodul) rendelkezik egy olyan lappal, amelyre programkódot lehet írni. Ha az objektumokat füzetlapokhoz hasonlítjuk, akkor az Excel munkalap egy olyan füzetlap, amelynek az elülső oldalán táblázat van, a hátsó oldalára viszont kódot ír(hat)unk. Hasonlóképpen, az űrlap olyan füzetlap, amelynek az elülső oldalán az űrlap maga, a hátsó oldalára pedig kódot írhatunk. A standard kódmodul olyan füzetlap, amelynek csak egy odala van, és erre kizárólag programkód kerülhet. (Az osztálymodul egy speciális fajtája a standard modulnak, de erre most nem térnék ki. Hosszú lenne.)
A Projekt Explorerben egy objektum nevére duplán kattintva a jobb oldalon (a pirossal karikázott részben) megnyílik az objektumhoz tartozó kódlap, ahol a különféle írt vagy makróként rögzített programok találhatók.
Makróprogramozás szempontjából a standard kódmodulok a legalapvetőbbek a 4 típus közül (lásd kék karika az ábrán). Amikor a munkafüzetben rögzítesz egy makrót, az Excel automatikusan létrehoz egy standard kódmodult (vagy felhasznál egy már meglévőt), és arra pakolja a rögzítéssel párhuzamosan a kódsorokat. Természetesen manuálisan is írhatsz itt programot, a makrórögzítő segítsége nélkül.
A munkalap és az űrlap kódmodulja annyiban speciális, hogy oda a munkalap ill. űrlap ún. eseményeihez köthető kódokat kell tenni. Pl. ha az űrlapon van egy gomb, annak van egy "kattintásra" nevű eseménye. Amikor a felhasználó az űrlapon lévő gombra kattint, az Excel megnézi, hogy az űrlap kódlapján (tehát a füzetlap hátoldalán) létezik-e ehhez az eseményhez tartozó programrész, és ha van, azt lefuttatja.
A kód (általában) szubrutinokból és függvényekből áll. A szubrutin határai Sub szubrutin_neve ... End Sub
A függvény határai: Function függvény_neve ... End Function
Egy kódlapon belül több szubrutin és/vagy függvény is lehet, (lásd az ábra pirossal karikázott részét,) de olyan nincs, hogy egy szubrutinon belül lenne másik is: Sub szubrutin1 ... Sub szubrutin2 ... End Sub ... End Sub
Tehát a szubrutinok egymásba ágyazása ilyen formában nem lehetséges.
Namost, a "makró" szó jelentése nem egyértelmű. Tágabb értelemben minden szubrutin makró, szűkebb értelemben csak azok, amelyeket a makrórögzítővel hoztál létre.
A makrórögzítéssel kapcsolatban egy jótanács: rögzítés közben nem ajánlott a Visual Basic Editorban mászkálni, mert ha az Editorban a kurzor helye megváltozik, előfordulhat, hogy a makró további lépéseihez tartozó kód a megváltozott kurzorpozícióba íródik. Így valóban megtörténhet, hogy egy már meglévő makróba új programsorok kerülnek. (Ezt nem tudom pontosan, hogy hogyan működik. Többször láttam már ilyet, de nem sikerül megbízhatóan reprodukálni.)
A munkafüzet elmentésekor mentésre kerül annak összes objektuma, tehát minden munkalap, űrlap, a "hátoldalukon" található kódlapokkal együtt, továbbá minden kódmodul és osztálymodul mentődik. Minden kódrészek, amely ezen obejktumok kódlapjain lakik, mentésre kerül, és elvileg nem veszhet el, csak szándékos törlés esetén. (Illetve lásd még korábbi hsz-omat a verzió- és formátum-konfliktusokkal kapscolatban.)
Az Excelben lehetőség van arra is, hogy egy kódmodul tartalmát programból módosítsuk. Más szóval új kódsorokat, akár egész szubrutinokat lehet munkafüzetekhez adni, illetve törölni is lehet őket. Ilyen programot makrórögzítővel nem lehet készíteni, kézzel megírni sem annyira egyszerű. Ha ilyet írtál volna, arról biztosan tudnál. Tudtod nélkül pedig legfeljebb valami makróvírus csinálhat ilyesmit. Ha biztos vagy abban, hogy egy adott munkafüzet adott kódmodulján ott volt egy makró, és most nincs ott, és nem tudsz rá semmi más magyarázatot, esetleg érdemes egy alapos víruskeresést végezni.
Remélem, a többiek segítségével együtt ezzel kicsit világosabbá válik számodra a kép.
Igen, már elkezdtem elmentegetni őket TXT-be okulva hülyeségemből.
Elmondom, hogy mi az én naiv képem a macro működésével kapcsolatban.
Felveszem a macrot (tehát az összes átalakítást), elmentem egy önálló munkafüzetbe. Elmentem miután "felvettem a lépéseket". Minden szuper eddig.
Én ez alatt az önálló munkafüzet alatt azt értem, hogy lényegében mintha egy kis txt documentumban elmenteném a "parancssorokat".
Ha csinálok egy új macrot más néven és szintén elmentem, akkor az egy másik kis TXT documentum fájlban lesz.
Szóval én a macrot úgy képzelem, mint egy rögzített parancssort, amit "lefuttatok" egy akármilyen excelen.
Tehát pl, ha lefuttattam egy macrot és csak teszteltem, akkor nekem nem kötelező elmentenem a dokumentumot és a macro megmarad, igaz? Vagy, ha ilyenkor nem mentem el a dolumentumot, akkor a "lefuttatott" macro is elveszik?
Most lehet, hogy totál hülyeségeket kérdezek a saját logikám szerint...nem tudom mennyi érthető a kérdésem.
Ami számomra még furcsa, hogy Visual Basicben nézegettem egy-két macrot és azt vettem észre, hogy egy macron belül mintha két macromat is elmentette volna. Ez lehetséges? Lehet, hoyg egy másik macro mögé elment egy másikat?
Na, legyünk optimisták valamikor majdcsak átlátom hogy is működik ez az egész...
"Miért tűnik el egy XY nevű macro, mikor én ZX-en dolgoztam?"
Nem tudom. Furcsa.
Figyelni kell rá, hogy melyik munkafüzetbe vannak rögzítve, tudod, meg szokta kérdezni az excel, hogy melyikbe tegye. Meg arra is figyelni kell, hogy az a munkafüzet bezárás előtt el legyen mentve.
Ha speciel a Te makróid valami érthetetlen okból ilyen öngyilkos hajlamúak, szerintem készíts róluk biztonsági másolatot. A kód csak szöveg, simán letárolható egy .TXT fájlban. (Egy szövegfájlban akárhány makró elfér, de lehet, hogy érdemes valahogy csoportosítani őket.) Ez ugyan nem akadályozza meg, hogy a makrók eltűnjenek, de könnyebb újra elővenni őket.
Ja, még valami: a verzió- és formátum-konfliktusok. Nem mindegy, hogy a mentés formátuma micsoda. Tudod, egy táblázatot lehet menteni Microsoft Excel dokumentumk, Excel 5.0/95 dokumentum, .csv , stb. formátumban. Van ezek között olyan, amely makrók tárolására nem alkalmas. Pl. ha csv-ként mented, akkor búcsút mondhatsz a makróknak. A 95-ös verzióban (ha jól emlékszem) az osztálymodulok, meg talán az űrlapok nincsenek támogatva. Az is lehet, hogy ha (egy másik gépen) 95-ös Excelben nyitod meg a munkafüzetet, akkor a 2003-as Excelben felvett makrókat nem tölti be, s amikor újra elmented, elvesznek. Javaslom, figyelj rá, hogy mindig a kurrens Excel verziónak megfelelő formátumban mentsd a táblázataidat.
A Select utasítás kijelölést jelent. Az, amikor az egérgombot vagy a ctrl gombot nyomva tartva kijelölsz egy cellatartományt, oszlopokat, munkalapokat, stb.
Általában a makrórögzítő úgy dolgozik, hogy kijelöl egy tartományt, aztán a kijelölésen hajtja végre a műveletet. Pl:
Range("A1:A3").Select Selection.ClearContents
Ez teljesen logikus és jogos, hiszen a felhasználó is kijelöli a tartományt, és aztán hajt végre rajta műveletet. De a Select ezekben az esetekben nem szükséges, általában kihagyható, és a két sor összevonható így:
Range("A1:A3").ClearContents
Szvsz a Select haszna akkor van, amikor teszteled a programodat, és gyorsan meg akarod tudni, hogy egy futási hibát eredményező művelet melyik cellán történt. Vagy ha futtatás közben akarsz egy megnyugtató visszajelzést arról, hogy történik valami. Egyéb esetben a Select csak lassítja a makró futását.
Hát igen, pont nézegettem és próbáltam kitalálni mi mit jelenthet a macro-ban és arra jöttem rá, hogy tele van hulladékkal...scrollolgatásokkap pl :-)...
Csak most tanulgatom :-)...
Töröltem is ezeket a sorokat és most fogom kipróbálni működik-e úgy...
Ez akkor működik, ha az U oszlop folyamatosan fel van töltve, tehát nincsenek közben üres cellák.
Valószínűleg a Range("U3:U1514").Select sor felesleges, de szükség esetén (vagy biztos, ami biztos alapon) helyettesíthető ezzel: Range("U3", Range("U3").End(xlDown)).Select
A macro-ban szeretném kijavítani, hogy valamit ne csak pl. U1 től U1500-ig csináljon, hanem az utolsó nem üres celláig...(mert, hogy hol fejeződik be az oszlopom az minden hónapban változni fog)
Hogyan lehet ezt neki megmondani?
Azt hiszem ezekben a sorokban kellene valamit megmanupulálni...
Remélem érti valaki, amit itt leírni próbáltam...:-)
Volna egy problémám, remélem tudtok segíteni, megpróbálom érthetően leírni.
van egy file, aminek a neve pl.: M21_1.CSV
Ha ezt megnyitom excellel, akkor ugye a SHEET neve nem SHEET1, lesz, hanem M21_1.
Futtatok rajta egy makrot, ami rendezget egy kicsit. Amit nem tudok megoldani, hogy a Sheet neve, tehát az M21_1 valahogy megjelenjen cellatartalomként, tehát tudjak vele dolgozni.
Másik, hogy a makro utolsó lépésként mentse le a sheet-et .CSV-be, úgy, hogy a file neve, az A1 cella tartalma legyen, és nem kérdezgessen rá hogy komolyan gondolom e....
a Sheet neve, és az A1 tartalma természetesen változó, mindíg az éppen megnyitott file-tól füg, végtelen a variációk száma. nnnnna :)
A neten több helyen is azt mondják, hogy Excel95 óta nem támogatott a hangok lejátszása közvetlenül Excel VBA-ból. Helyette kerülő megoldásként ajánlják, hogy hangfájlban rögzítsd, amit hallani akarsz, és azokat játszasd le. Bár írtad, hogy nem erre van szükséged, azért egy link:
Szerintem semmi nem kell hozzá, és ez nem is Excel kérdés, hanem op. rendszeri. Ha van hangkártya a gépben, akkor a Windows oda küldi a hangot, ha nincs, akkor a kicsi hangszótróra. (Legalábbis a nálam a Beep nevű VBA uatsítás így működik.)
Ha nem hallod a beep-et, ami korábban jól szólt, akkor alighanem a hangkártyád körül kell keresni az okot. Hibás hardver, vagy rossz driver, ilyesmi. Vagy talán csak kicsit feljebb kellene tekerni a hangerőt (a kicsi hangszóró sokkal élesebb, hangosabb beep-et nyom, mint a hangkártya a sztereó hangfalon).
Ez beírja a függvényt a cellába, de csak akkor aktiválható, ha előbb a szerkesztőlécen (nem a cellában) elfogadtatom. 20 képet kell hasonló módon csatolnom. Tud valaki olyan módszert, amivel nem kell külön elfogadtatni?
A következő kérdésem lenne, hátha van rá megoldás. Hogyan lehet egy workbook-on belül a sheet-ekre (a nevükre) függvénnyel hivatkozni.
Pl. van egy összesítő oldalam, ahova a többi oldalról (pl. SheetA, SheetB ... SheetE) szeretnék hivatkozni. Mondjuk az A, B ... E betűk országok rövidítését jelentik, amit az összesítő oldalon egy legördülő listából kiválasztok.
Az összesítő oldalon kiválasztva D országot SheetD!B10 mező értéke kellene. Ez egyszerűen megvan, de hogyan lehet a hivatkozást megbuherálni, hogy ha E országot választom, akkor az összesítő oldal ugyanazon cellájában - a hivatkozás átírása nélkül - SheetD!B10 helyett automatikusan SheetE!B10 értékét hozza be.
Most próbálgatnám ezt az F9-es grafikon frissítést de eszembe jutott, hogy megkérdezzem...F9-el minden fog frissülni? Úgy érteve, hogy az összes létező grafikon stb, ami egy dokumentumom belül van, vagy csak egy munkalapon belül?
Az előbbi lehet, hogy elég rizikós lenne nekem :-)...végig kell gondoljam.
Huh, nagyon kösz, ez tök jópofa megoldás. Nem írtam, de nekem további dolgom is lenne a megtalált 400 településsel, szóval valami olyan megoldásra lenne szükségem, amivel ki tudom szedni a hosszabb listában nem szereplő települések nevét. Olyan is jó, amivel valahogy sorbarendezhetem, és a lista elejáre/végére került 400 települést kikopizhatom, de olyan is, amelyik mondjuk külön lapra, vagy oszlopba kilistázza azt a 400 települést.
Ilyen ötletetek nincs?
Ez a zöldháttér egyébként ötletes, tetszett (csak sajnos kimenteni nem tudom a fehéren maradó településneveket)
Tegyük fel, hogy az A és a B oszlopban vannak a helységnevek. Az A1 cellának csinálj feltételes formázást: - jelöld ki az A1 cellát - Menüből válaszd ki a Formátum -> Feltételes formázás opciót, és írd be a =HOL.VAN(A1;B:B;0)>0 képletet, ahogy a mellékelt ábra mutatja, és adj meg valami formátumot (esetemben zöld háttérszín a formátum).
Ezután másold az A1 cella tartalmát (ctrl+c), jelöld ki az A oszlopot, és menüből válaszd a Szerkesztés -> Irányított beillesztés -> Formátum opciót.
Elvileg így a feltételes formázás zöldre festi az A oszlop azon celláit, amelyeknek a tartalma a B oszlopban is szerepel, és fehéren hagyja azokat, amelyek nem szerepelnek a B oszlopban.
Természetesen, a helyes működéshez pontos egyezés szükséges. Tehát pl. Körösladány és Körösladáyn különböző értékek, még akkor is, ha csak elírás miatt különböznek, és én tudom hogy ezek ugyanazt a helységet takarják.
A helyedben megcsinálnám ugyanezt az eljárást a B oszlopra is, hacsak nem vagy biztos benne, hogy a B oszlop minden eleme megtalálható az A oszlopban.
Van két településeket tartalmazó listám (egy-egy oszlop). Az egyikben 3200, a másikban 2800 telekpülés neve van. Arra lennék kiváncsi, hogy melyik 400 hiányzik. Excelben meg lehet ezt oldani? Vagy ehhez már Access kell?
Azt szeretném megkérdezni, hogy ha én készítettem egy grafikont, majd utólag belekontárkodtam a grafikonba (pl...átírtam a számot stb.), hogy lehet frissíteni az adatokat, hogy megint az a szám legyen a grafikonon, ami a táblázatban is?
Megadtam neki egy forrást és nem azt mutatja, nem tudom miért, pedig nekem úgy tűnik minden jól van beírva...a régi számot mutatja...
Felső ábrán a Felső sorban megcsináltam az oda irányt, reggeltől estig. Az alsó sorban a vissza irány látható. Namost az ALSÓ ÁBRÁN pl: egy új járat berakásakor ha beszúrok egy oszlopot akkor az alsó visszafelé jövő időadatában is megjelenik az üres oszlop, ami nem kéne oda, mert így hézagos lesz.
Nem lehet úgy beadni neki, hogy külön kezelje a felső és az alsó részt? tehát ha kérek egy oszlopot nem tudodm valahogy meghatározni hogy Ettől a sortól addig a sorig kell egy plusz oszlopot.
Ha pl. a C2:C6 cellák elé akarsz beszúrni cellákat, kijelölöd ezt a területet, Ctrl és + jelre előjön egy gyorsmenü, ahol megadod, hogy jobbra tolja a kijelölt részt. Néhány cella megszüntetésére a Ctrl és mínusz jel szolgál.
Másik módszer: kijelölöd a tartományt, jobb klikk, és vagy a beszúrást, vagy a törlést választod a gyorsmenüből. Ugyanaz a párbeszéd panel jön elő, mint az előző módszerrel.
A2:A6-ban vannak a megállók, B2:B6-ig az indulási idők, C2:C6-ig a menetidők.
B3–> =$B$2+C3
Ezt kell lemásolni. A B és C oszlopok formátuma óó:pp legyen.
felül az oda irány, időadatokkal, csatlakozással, alul a vissza irány (egy lapon)
Pl:
Moszkva tér
Batthyány tér
Kossuth tér
Deák tér
--------------------------------------------- - itt kéne szétválasztani őket
Deák tér
kossuth tér
Batthyány tér
Moszkva tér
Namost a két irány között hogy lehet megoldani azt hogy ne egységes hosszanti cellaként kezelje az ablakot az Excell?
Szóval pl: ha a felső "hasábba" be akarok szúrni egy új cellaoszlopot időadattal, de az alsóba nem akarok plusz üres cellaoszlopot betenni, akkor hogy tudom őket szétválasztatni hogy külön kezelje a két irány cellaoszlopait?
Továbbá hogy kell szakszerűen megadni az időadatokat hogy mondjuk a Moszkva térről indul
06:00 -kor és megállónként +1 +2 +3 + 5 percekkel nőjön az időadata?
Mert én beállítottam időformátumra és a cellaértéket:
=G10+0,003 - ennél 4 percet nő az idő nem 3-at, és sokszor ilyen hibákat jelez.
csak azért kéne szétválasztani az oda és a vissza irányt, mert akkor ha felülre valmiért beszúrok sorokat akkor az alul is megjelenik szóval nagyon hézagos lesz. Nem lehet külön kezeltetni?
Ha oszlopot szúrsz be, az az oszlop teljes hosszában érvényes, ezzel nincs mit tenni. Esetleg próbálkozz cellák beszúrásával, az rugalmasabb.
Az idő pedig napokban értendő, tehát 1 = 1 nap. Ha percet akarsz egy időértékhez hozzáadni, akkor 1/24/60 -at kell hozzáadnod, mivel 24 óra van egy napban, és 60 perc egy órában. Tehát + 3 perc = +1/24/60*3
felül az oda irány, időadatokkal, csatlakozással, alul a vissza irány (egy lapon)
Pl:
Moszkva tér
Batthyány tér
Kossuth tér
Deák tér
--------------------------------------------- - itt kéne szétválasztani őket
Deák tér
kossuth tér
Batthyány tér
Moszkva tér
Namost a két irány között hogy lehet megoldani azt hogy ne egységes hosszanti cellaként kezelje az ablakot az Excell?
Szóval pl: ha a felső "hasábba" be akarok szúrni egy új cellaoszlopot időadattal, de az alsóba nem akarok plusz üres cellaoszlopot betenni, akkor hogy tudom őket szétválasztatni hogy külön kezelje a két irány cellaoszlopait?
Továbbá hogy kell szakszerűen megadni az időadatokat hogy mondjuk a Moszkva térről indul
06:00 -kor és megállónként +1 +2 +3 + 5 percekkel nőjön az időadata?
Mert én beállítottam időformátumra és a cellaértéket:
=G10+0,003 - ennél 4 percet nő az idő nem 3-at, és sokszor ilyen hibákat jelez.
légyszives segítsetek nekem ebben: egy grafikon címét szeretném külső változó alapján változtatni. vagyis ha egy cella értéke "1", akkor a grafikon címe legyen "aa", ha az érték "2", akkor a grafikon címe változzon "bb"-re.
A legegyszerűbb, ha nem akarsz mit kezdeni a számokkal, hogy jelöld ki azt az oszlopot, és a formátum/cellák/szám fülön állítsd szövegre. Ha csinálni is akarsz valamit vele, akkor ne másold be, hanem nyisd meg a txt-t, és tedd azt, amit Delila mondott.
A txt behívásakor megjelenő párbeszédablakban a tagoltat jelöld be, a következő ablakban a Határolójel kategóriában a Más választóba írd be a kötőjelet.
Ennek eredménye az egyik oszlopban 41, a másikban 8 lesz. Ha szükséged van a kötőjelre is, beszúrsz egy oszlopot, és beírod.
Jónapot kívánok, txt fájlból copy-pésztelek szöveget s azt látom hogy pl ebböl:
41 - 8
ezt csinálja:
Aug.41
Kérdés, hol lehet beállitani, hogy ne legyen már annyira okos és ne akarja kitalálni hogy mi lehet az a 41 - 8, a 41 - 8 legyen szépen csak 41 - 8, és ne csináljon belöle Augusztust meg mittomén :)))
Tudnátok nekem segíteni, hogy hogyan lehet egy adatsorból a duplikációkat könnyedén eltűntetni? (Van egy címlista és sok cím többször is szerepel, azt szeretnénk, hogy mindegyik csak egyszer szerepeljen.)
Nem sikerült egyelőre megtalálnom a megfelelő képletet...
De tényleg tök fura, hogy xy-ra is újracsináltam egy csomó makrót és mikor az egyik excel munkafüzetet megnyitom és futtatnám rajta a makrót...minden összeomlik..olyan, mintha vírusos lenne a fájl, vagy minth aösszeférhetetlen lenne a makró futtatása.
Na midegy, majd csak működik. Megcsinálom századszorra is.
Egyébként be van állítva automatikus mentés :-), de időnkánt agyamra megy.
Na, szóval köszi még egyszer a segítséget!!!!!!!!!!!!!!!!!!!!!!!!!
Az egyéni makrófüzetet personal.xls-nek hívják. A helye:
C:Documents and SettingsFelhasználóApplication DataMicrosoftExcelXLSTART
A Windows újratelepítése eltüntetheti, ezért én másolatot (többet) készítek róla, amit más meghajtóra teszek.
Az Excelben beállítottam az automatikus mentést, így nem feledkezem meg róla.
Ha még nem használtad, az Eszközök/Bővítmények listájában jelöld be az Automatikus mentést, ezután az Eszközök menüben már szerepelni fog, ott beállíthatod a gyakoriságát, és hogy rákérdezzen-e, vagy ész nélkül mentsen.
Elvileg minden ment úgy ahogy írtátok. Visual Basicben letöröltem öket. Többé nem is jelentek meg ,ha kinyitottam excelben a makrókat.
Legyártottam egy rahedli új makrót...majd egyszer csak "elnézését kérjük bezárjuk az excelt...", újraindította magát az excel és onnantól kezdve nem találom azokat a makrókat sem, amikor korábban 10-15 perce mentette (előtte még megvoltak).
Miért történik ilyen?
Valahogy úgy érzem, hogy a makrók véletlen megsemmisülése elég gyakori jelenség...
Ti mit csináltok ez ellen?
Elmentitek a parancsokat txt-fájlba a biztonság kedvéért...
Szóval elmentettem egyéni munkafüzeltbe kb 10 makrót...el is mentődött, mert mindig megjelentek később...aztán most az egész visszacsinálódott, a régi letörölt makrók újból előkerültek pl...a mentetteknek híre hamva...pedig előtte megvoltak...olyan mintha visszaállított volna egy órával ezelőtti makró felállást...
Kezdek megőrülni :-D...
Mit csináljak, hogy ne tűnögessenek ilyen egyszerűen időnként el a makrók?
Alt+F11-gyel eljutsz a makró szerkesztőbe (Eszközök/Makró/Visual Basic gyorsbillentyűs megfelelője).
Bal oldalon kiválasztod a füzetedet, ott a Modules címszó alatt megtalálod a moduljaidat. A törölni kívánt modulon jobb kattintás, Remove. Rákérdez, hogy a törlés előtt akarod-e máshova menteni.
Az elveszett makrót ugyanitt, a füzeted lapjaira kattintva megtalálod (reméljük), mert lehet, hogy nem külön modulba, hanem valamelyik laphoz rendelted.
Ja és még annyit, hogy makrórögzítéskor megkérdezi az excel, hogy melyik munkafüzetben legyen a makró kód tárolva. Erre azért nem árt tekintettel lenni, mert ha egy próbálkozós munkafüzetbe rögzíted, amit mentés nélkül bezársz, akkor oda a rögzítés.
Excelben nyomsz egy Alt+F11-et, erre előjön a Visual basic Editor. A bal felső sarokban látod a Project Explorert. (Ha nem látod, akkor menüből: View/Project Explorer) A Project Explorer ablak kb. így néz ki (megpróbálok belinkelni egy képet)
Bármelyik objektum tartalmazhat VBA kódot. Ha pl. a Munka1 objektumra kettőt kattintasz, akkor feljön a munkalapnak a kódmodulja, amelyen a munkalap eseményeihez, illetve a munkalapon elhelyezett vezérlőelemekhez kapcsolódó kódok tárolódnak. A Forms, Modules és Class Modules kategóriák csak akkor jelennek meg, ha van ilyen típusú objektum a munkafüzetben. A makrórögzítés automatikusan hozzáad egy Module típusú objektumot, (jellemzően Module1, Module2, stb. névvel,) és a rögzített makró ezen a lapon található meg. (Manuális modul, form, ill. class modul hozzáadás az Insert menüpont alatt.) Ha a munkafüzetet frissen megnyitod, a makrórögzítő akkor is új modult ad hozzá, ha már vannak benne modulok korábbi rögzítésekből.
Ha tehát egy makrót törölni akarsz, akkor meg kell keresned a hozzá tartozó kódot valamelyik kódmodulon. Modulok egy az egyben is törölhetők. Ehhez a Project Explorer ablakban jobb kattintás a modulra, aztán Remove.
Nem, a Courier betűkkel nem próbálkoztam, mert a makró több különböző gépen is fut, ezt nem akarom állítgatni. Még egy kicsit próbálgatom a vbMsgBoxRight kapcsolót, hátha sikerül valamit összetákolni... Még egyszer köszönöm a segítséget.
Próbálkoztam én is egy kis függvénnyel, amely a két szám hosszának különbsége alapján space-eket szúr be, de az sem jó - ahogy írtad - a karakterek különbsége miatt. Azt gondoltam, létezik valami egyszerű pozicionálási lehetőség mint pl. a pascalban vagy a delphiben...
Egyébként, lehet, hogy én csinálok valamit rosszul, de a format függvénnyel is a két szám egymás alatt balra zárt lesz.
Bocsi, a "vbMsgBoxRight" nem kell, csak bennemaradt. Tehát:
Sub Beállít() Dim Osszes As Long, Megfelelo As Long Osszes = 54321 Megfelelt = 123 MsgBox "Levizsgálva: " & Format(Osszes, "@@@@@@") & vbNewLine & "Megfelelő : " & Format(Megfelelt, "@@@@@@") End Sub
Ez elég nehéz ügy, szerintem. Ha okosabb válasz nem érkezik, akkor ezt tudom mondani:
A Format függvény alkalmazható (lenne), pl. az alábbi formában (mivel mindkét sor azonos darabszámú karakterből áll).
Sub Beállít() Dim Osszes As Long, Megfelelo As Long Osszes = 54321 Megfelelt = 123 MsgBox "Levizsgálva: " & Format(Osszes, "@@@@@@") & vbNewLine & "Megfelelő : " & Format(Megfelelt, "@@@@@@"), vbMsgBoxRight End Sub
A gond az, hogy a karakterek szélessége alapértelmezésben nem ugyanaz. Ha pl. leírod egymás alá, hogy "123456" és " 456", a szóközök keskenysége miatt a 456 elcsúszik balra. Ha azt akarod, hogy ne csússzon el, akkor a MsgBox alapértelmezését kell megváltoztatni egy helytartó karakterkészletre (pl. courier). Ezt a képernyő tulajdonságaiban tudod megtenni, (Asztal, jobb klikk, tulajdonságok, megjelenés, speciális, Elem: üzenetpanel) hátránya viszont, hogy nem csak ezt az egy MsgBox-ot, mégcsak nem is csak az Excelt, hanem az egész rendszert érinti.
Alternatívaként esetleg az MsgBox kiváltására létrehozhatsz egy űrlapot, amelyen bármit szabadon formázhatsz és pozicionálhatsz.
Kicsit más: a változók deklarálásakor miden egyes változóra külön kell típust megadni. A Te verziódban az "Osszes" nevű változó Variant típusú volt, nem Long.
Szeretném megkérdezni, hogy lehet megoldani egy MsgBox-on belül egymás alatti számok pozicionálását, vagyis azt, hogy az egymás alatti számokat jobbra zárással lehessen megjeleníteni. Létezik erre valami frappáns beállítási lehetőség?
Ha a makrókat te írtad akkor ezt is fogod tudni módosítani.
Én úgy oldottam meg a hasonló problémámat, hogy a personal.xls-ben indításkor automatikusan elindul a makró menüt létrehozó rutin, a használni kívánt makrók is értelemszerűen ugyanabban a fájlban vannak.
Sajnos office 2007-ben nem működik, és még nem találtam rá automatizált megoldást. Ez úton is szeretném 'megköszönni' a mikroszoft szakembereinek a szalagokat.
Sziasztok! A következőt kellene SOS-ben megoldanom, és cserben hagyott az eszem, pedig emlékem szerint korábban már taglaltuk itt (is) ezt a kérdést. Szóval: Van a, b, c, d, e választási lehetőségem, ezek közül a felhasználónak legördülő menüből kellene választania. Az a, b, c, d, e lehetőségekhez tartozik egy-egy hosszabb szöveges magyarázat. No, fogtam az a, b, c... tartományt és elneveztem... most fel kellene raknom a lapra a legördülőt, de elakadtam. A továbbiakban azt tervezem, hogy amit kiválaszt az user, fkeressel megkeresem a hozzá tartozó magyarázatot és kiíratom a lapra. Segítségeteket előre is köszönöm!
Van néhány megírt makróm, amit úgy szeretnék futtatni, hogy ne az Eszközök>Makró>Makrók... ból kelljen elindítanom, hanem legyenek gombok az első sorban, amire ha rákattintok lefut az adott makró.
Hogy hozom létre a munkalapon a gombot és hogy hivatkozok az adott makróra?
Előre is köszi a segítséget!
u.i.:Az Excel probléma-ban is jeleztem, de megírtam ide is, mert itt nagyobb az aktivitás
Van néhány megírt makróm, amit úgy szeretnék futtatni, hogy ne az Eszközök>Makró>Makrók... ból kelljen elindítanom, hanem legyenek gombok az első sorban, amire ha rákattintok lefut az adott makró.
Hogy hozom létre a munkalapon a gombot és hogy hivatkozok az adott makróra?
Ha lefuttatod az alábbi makrót a nyomtatandó oldalon, a lapdobások utáni cellákat feltölti a megelőző rekord számával. (A makró használata után szerintem nem érdemes elmenteni a fájlt, mert benne maradnak az új számok.)
Sub Kiegeszit() Dim PB As HPageBreak, WS As Worksheet Dim c As Range Set WS = ActiveSheet For Each PB In WS.HPageBreaks Set c = PB.Location If c = "" Then c = c.End(xlUp) Next End Sub
Sziasztok! Azt szeretném kérdezni, hogy lekérdezhető-e egy munkalap adott cellájáról, hogy nyomtatáskor hányadik lapra fog esni?
Konkrétan, olyan táblázatot szerkesztek, ahol az első oszlopban az adatrekord sorszáma van, ám az adatrekord több sorból áll, és ha egy ilyen több soros rekordot a lapdobás kétfelé vág, akkor a sorszámot az új oldalon is szeretném megjeleníteni. Azaz az első oszlopban van sorszám, ha ő egy adatrekord első sora, vagy ha a sor a lap tetejére eső első sor.
Működhet-e ez úgy, hogy más-más gépen más-más helyen lesz a lapdobás? (Hiába az oldalbeállítás, másik gépen nem ugyanúgy jelenik meg a táblázat.)
Ha készítek egy Excel táblázatot, és azon belül több napi táblázatot ( 01.01, 01.02,01.03,stb) A lapok a tartalma egy készletnyilvántartás. Anyagokat használok, és A1,B1,C1,...cellákban a rendelt mennyiségük (m2)szerepel. Az alattuk lévő cellákban (A2,B2,C2...stb)az anyag típusa ( pl. szövet, vászon, bársony,plüss..stb) És az anyag típus cellák alatt (A3,B3,C3...stb)a felhasznált mennyiség(m2-ben). Mindezeket szeretném egy lapon összesíteni, de anyag típusok alapján,pl arra lennék kiváncsi hogy az eddigi napok alatt mennyi menyiég lett rendelve vászonból és ezt szeretném az új lapon összesíteni akkor milyen képlettel tudom ezt megtenni? Nem mindig ugyanott, és nem mindig ugyanannyi típusú anyag van akkor ha jól gondolom cella tömbökben kell keresnem. Milyen képlettel tudok keresni ha az a célom hogy mennyi vászon lett rendelve összesen az elmúlt napokban, (ennek a mennyisége mindig az anyagtipus feletti cellákba van), és ezt kellene összesíteni.
pl. SZUM(A1:C4) megfelel ennek: Application.WorksheetFunction.Sum(Range("A1:C4"))
Ehhez természetesen ismerni kell a függvény angol nevét, ami nem mindig triviális. Legjobb, ha makróként rögzíted azt, amikor beírod a képletet egy cellába, aztán megnézed a rögzített makró kódját.
Pl. ha ezt a képletet írom be az aktív cellába, ami esetemben C15: =HOL.VAN(D15;A1:A24;0) akkor a makrórögzítő ezt eredményezi: ActiveCell.FormulaR1C1 = "=MATCH(RC[1],R[-14]C[-2]:R[9]C[-2],0)"
Ebből látszik, hogy a HOL.VAN függyvény angol neve MATCH. (A többi kriksz-kraksz nem érdekes.)
Megszületett a nekem teljességgel megfelelő makró, amely minden mentés előtt aktivizálódik:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim shtCurrent As Worksheet
For Each shtCurrent In ActiveWorkbook.Worksheets shtCurrent.Protect Password:="jelszo", Contents:=True, _ DrawingObjects:=False, Scenarios:=True, _ AllowFormattingCells:=True, AllowFiltering:=True Next shtCurrent
End Sub
Működik az autoszűrés, lehet megjegyzés írni és a cellák formátumát megváltoztatni.
A Public Function-ban az s az útvonal, a keresendő a fájlnév? Nem, a lényeg ListPDF() sub. Ez csak egy segédfüggvény, amit az csinálja, hogy a keresendő sztringet az s sztringben hátulról indulva kezdi megkeresni. Valamilyen VBA verziótól van ilyen beépített függvény, de hogy mindenhol menjen, inkább ez szoktam használni. Itt arra használtam, hogy a teljes fájlnévben (elérési úttal együtt) az utolsó backslasht pozícióját kerestem meg, mert innen kezdődik a tényleges fájlnév.
Köszönöm szépen. Lehet, hogy rosszul fogalmaztam, de nekem éppen az kellene, hogy csak a számok maradjanak (pl. ha a cella érteke ilyen: " 3.200", ebből 3200 legyen). Egy nagyon elemi kérdésem is lenne, hogyan tudok hivatkozni egy egy cikluson belül egy string (egy szöveg) i. karakterére?
Ez meg itt egy felhasználói függvény, amit cellaképletekben is felhasználhatsz. (A tizedespontot vagy -vesszőt is eltávolítja, szóval nem tökéletes.)
Function CsakSzámMaradhat(Cella As Range) Dim i As Long, S As String S = Cella.Value For i = 0 To 255 If i < 48 Or i > 59 Then S = Replace(S, Chr(i), " ") Next CsakSzámMaradhat = Replace(S, " ", "") End Function
Ha egy cellára vonatkozik, ez kitisztítja. Az A1 cella adatát a számok nélkül beírja B1-be.
Sub tisztit() adat = Cells(1, 1).Value L = Len(adat): i = 1 For i = L To 1 Step -1 If Mid(adat, i, 1) > Chr(47) And Mid(adat, i, 1) < Chr(58) Then adat = Left(adat, i - 1) & Right(adat, L - i) L = L - 1 End If Next Cells(1, 2) = adat End Sub
Tiszteletben tartva József másféle megközelítését, én ezt a megoldást javaslom:
Sub PDF() Const MyPath = "C:\" 'ezt cseréld ki a megfelelő könyvtár elérési útjára Dim FN As String, WB As Workbook
ChDir MyPath FN = Dir(MyPath & "*.pdf", vbNormal) Do If FN <> "." And FN <> ".." Then Set WB = Workbooks.Add WB.Sheets(1).OLEObjects.Add Filename:=MyPath & FN, Link:=False, DisplayAsIcon:=False ' 'mi egyebet csinálsz még a pdf mellé ' WB.SaveAs Replace(LCase(FN), "pdf", "xls") WB.Close False End If FN = Dir() Loop Until FN = "" End Sub
Szeretném megkérdezni, hogy van-e olyan függvény, amely a számok kivételével mindent kitisztít a megadott forrásból? Vagy esetleg van-e valakinek kéznél egy ilyen?
Valami ilyen dolgot szeretnél? A ".LookIn" sorban azért rakd ki a backslash-t. :) A For ciklusban berakhatod a PDF fálj feldolgozást, vagy hozzáadhatod pl. egy form ListBox-hoz. A másik lehetőség a Windows API open dialógus ablak meghívása, ha ez kell, van hozzá kódom.
Public Function InStrReverse(s As String, keresendo As String) As Integer Dim j As Integer j = Len(s) Do While j > 1 And Mid(s, j, 1) <> keresendo j = j - 1 Loop InStrReverse = j End Function
Sub ListPDF()
With Application.FileSearch .NewSearch
.LookIn = "D:Downloads" .FileType = msoFileTypeAllFiles .SearchSubFolders = False .Filename = "*.pdf" If .Execute > 0 Then For lCount = 1 To .FoundFiles.Count MsgBox .FoundFiles(lCount), , "Teljes filenév elérési úttal" adatnev = Right(.FoundFiles(lCount), Len(.FoundFiles(lCount)) - InStrReverse(.FoundFiles(lCount), "")) MsgBox adatnev, , "Teljes filenév elérési út nélkül"
1. Egy könyvárban lévő összes pdf fájlt ugyanabba a munkafüzetbe, csak más lapra? Vagy külön munkafüzetekbe? 2. A könvtár előre rögzített, vagy tallózással keresendő? 3. Az említett "módosítás" manuális, vagy erre már van programod?
Hello! Egy könyvtárból egymás után egyenként be kellene szúrni excel munkalapra pdf file-okat, valamit csinálni velük - ez nem gond - majd az xls fájlt a beolvasott pdf nevén menteni. Úgy is jó lenne, ha a beolvasáshoz mutatná a könytár tartalmát, onnan lehetne kiválasztani, de az még jobb lenne, ha a módosítás-mentés után automatikusan behívná a következőt. A módisítás az objektum mellé írt adatokból áll. Köszönöm előre is a segítségeteket.
Hosszas tökölés után arra jutottam, hogy a munkalap levédésekor
DrawingObjects:=False
lehetővé teszi a megjegyzések beszúrását.
Kérdés, hogy milyen mellékhatásai vannak. A Help szerint ez a Shape objektumok védelmét állítja be. Gondolom, ha a megjegyzések szerkeszthetők, akkor a grafikonok, képek, mag hasonlók is szerkeszthetők lesznek.
Azt találtam a neten, hogy nem lehet csak a nemvédett cellákra engedélyezni a megjegyzés beszúrását. Vagy engedélyezed, vagy nem de akkor az minden cellára vonatkozik, akár védett, akár nem. Engedéylezni úgy lehet, hogy a munkalap levédésekor teszel pipát az "Objektumok szerkesztése" opció elé is (Edit Objects:=True)
Lehet, hogy elnéztem valamit, de nem hiszem. Rengeteget tököltem már vele. Amikor manuálisan kapcsolom be a védelmet, akkor is kipipálom a cellák formáhatóságát, de akkor csak azok a cellák formázhatóak, amelyen nem védettek. A védettek nem. A makró esetében pedig minden cella formázható. Akár védett, akár nem.
De ez lenne kisebbik bajom a nagyobb az, hogy megjegyzést nem lehet a makrózott védelem esetén hozzáírni sem a védett, sem a védtelen cellákhoz.
Én a védelem kézi beállítása mellett sem tudok a nem védett cellákba megjegyzést beszúrni, ellenben tudom formázni a védett cellákat. (Ez utóbbin mellesleg nem csodálkozom, tekintettel arra, hogy AllowFormattingCells:=True.)
Amikor egy oszlopra több függvény kell (db, átlag, szórás). Akkor a szumha függvény analógiájára a többi AB jellemző is meghatározható a tömbképletekkel. Természetesen csak az egyszempontú csoportosításoknál alkalmazhatók könnyedén.
Sub Várj() UserForm1.Caption = "Számolás" UserForm1.Show UserForm1.Repaint For i = 1 To 10000 Cells(i, 1).Select Cells(i, 1) = "valami" Next i UserForm1.Hide End Sub
Még mindig a múltkori problémámmal küzdök. Mentéskor lefut az alábbi makró és bekapcsolja minden munkalapon a védelmet. Eddig oké is. Működik az auto szűrés. A gondom még mindig az, hogy bekapcsolt védelem esetén a nem védett cellákhoz továbbra se tudok megjegyzéseket írni, illetve a védett cellák tulajdonságai (háttérszín, tintaszín) viszont megváltoztathatóak. Holott csak a nem védett cellákat lenne szabad módosítani. Ha manuálisan kapcsolom be a védelmet, akkor minden renben van.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Dim shtCurrent As Worksheet
For Each shtCurrent In ActiveWorkbook.Worksheets shtCurrent.Protect Password:="pass", Contents:=True, _ DrawingObjects:=True, Scenarios:=True, _ AllowFormattingCells:=True, AllowFiltering:=True Next shtCurrent
Azt szeretném megkérdezni, hogyan lehet azt megcsinálni, hogy egy makró futása közben egy kis tájékoztató tábla jelenjen meg ("Kérem várjon..."), majd a makró végén ez tünjön el. A konkrét kérdesem az lenne, hogy meg lehet-e csinálni azt, hogy pl. egy UserForm1.Show után a fókusz a makró következő utasításaira kerüljön és így továbblépjen?
Ezek valóban marha praktikusak tudnak lenni. Mivel dinamikusan vezérelhetők. Az AB függvényekkel müködnek. Én az összetett pivottáblákra szeretem használni őket, mert barátságosabb a layoutjuk mint a Kimutatásnak. Mivel az azonos osztályhoz tartozó eredményeket egymás melletti és nem egymás alatti cellákban hozzák. További nagy előnyük, hogy mindig az aktuális állapotot mutaják, tehát nem kell klikkelgetve frissiteni. De sajnos vannak korlátaik. Pl. hogy az összetett kritériumot nem értik (tehát az ÉS-t és a VAGY-ot). Ha ilyet akarsz, akkor az összetett kritériumra csinálnod kell egy plusz eredményoszlopot.
A fórumok másik vidékéről kerültem ide, ha kérhetném segítsetek (ha csillagász kérdésetek van, akkor én is tudok talán).
A problémám az lenne, hogyan tudok egy cellának olyan értéket adni, ami aztán más cellák l
értékének kiszámításában konstansként szerepel.
Szóval legyen a C2 cella értéke A3*B3*A1. Ha ezt a képletet leviszem egy sorral lejjeb, akkor A4*B4*A2 lesz, de én azt szeretném, ha itt is maradna az A1 konstansként.
Gondolom ez nektek egyszerű, de képtelen vagyok rájönni, hogyan kell csinálni, holott emlékeim szerint pár éve már csináltam ilyet.
Hát csak annyit jelent, hogy az Darabteli nem alkalmas nem egybefüggő tartományokban való keresésre. Tehát ahány tartományaban akar, annyi darabtelit kell kreálni. Aztán ezek eredményei már összeadhatók.
Az AB.DARAB persze praktikusabb. Persze sok függ attól, hogy mi a feladat. Amit ugye nem ismerünk.
Ha egy időértéket beszorzol 24*60-val, akkor megkapod számként, hogy hány percről van szó. Pl. ha beírod A1 cellába, hogy 3:32:30 és a mellette lévő cellába =24*60*A1, megformázod számra, akkor 212,5 kapsz. Az osztásra a végén azért van szükség, hogy a kerekítés után megint időérték legyen belőle.
Kerekíteni szeretnék egy idő formátumú számot felfelé, egészre, tehát ha 0:15:40 az eredmény ezt szeretném ha felfelé kerekítené.Pontosan az lenne a jó ha 0:16 lenne Jelenleg ez a cella képletem:
=SZUM(A1;B1)*115%
Tehát összeadja a két cellát, és 115%-al szorozza, de ezt kellene még kombinálni hogy felfelé kerekítse egész percre.
Én erre a képletre gondoltam, de nem az lesz amire én gondolok.:
Ismét segítséget szeretnék kérni. Adott két munkalap (Munkalap1; Munkalap2). Egy cikluson belül a "Munkalap1"-en egy szummázást készítek, amelyet (a cikluson belül) sehogy sem tudok áttenni a "Munkalap2"-re, úgy, hogy ha a makró futása után a használatkor, a "Munkalap1"-en változik a szumma értéke, változzon a "Munka2"-n is.
Az okot illetően csak találgatni tudok. Ez az elméletem: A program a műveleteket mindig egy láthatatlan, háttérben tárolt értéken végzi el, és csak ez után adja át a felületnek, hogy az formázza kedvére. De a program angolul gondolkodik. Angolul a vessző (",") karakter az ezres helyiértékek elválasztására szolgál. Az eredeti adatod szöveg formátumú, de amikor a pontot programból kicseréled vesszőre, akkor számmá konvertálódik, amelyben a vessző egy ezerszeres szorzást jelent. Ezután a felület megkapja az immár 1000-szer akkora számot, és megformázza magyar területi beállítások szerint.
Szerintem az Excel magyarítása során cseszhettek el valamit. Mindenesetre a problémának nevetségesen egyszerű a megoldása, csak hát épeszű ember nem nagyon gondolna rá. És mégis működik.
Sub Formatum() Columns("F:K").Select 'itt vannak az értékek With Selection .ColumnWidth = 10 .HorizontalAlignment = xlCenter .NumberFormat = "0.00" .Replace What:=".", Replacement:=".", _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False End With End Sub
Segítséget szeretnék kérni! Mikor szövegfile-ból beszúrt lebegőpontos számnál a tizedespontot "."-ról ","-re cseréltetem makróval, akkor az eredmények 1000-szerese jelenik meg. A Szerkesztés/Csere... művelettel jól megy, de ezzel nem:
Eredetileg így gondoltam én is, de direkt nem kapcsoltam ki a figyelmeztetést a biztonság miatt, mert a programnak csak a második igenre kell törölnie az adott munkalapot. Ezért kerestem ennek a lekezelhetőségét....
Z = MsgBox("Szeretné törölni a Sheet1 munkalapot?", vbYesNo)
' Yes = 6 no = 7 If Z = 6 Then Application.DisplayAlerts = False Worksheets("Sheet1").Delete Application.DisplayAlerts = True Else ' ha a nemet választotta...
Az lenne a kérdésem, hogy van-e olyan lehetőség az Excelben, hogy kialakítok egy űrlapszerű táblázatot és rögzítem a formátumot. Azt szeretném hogy ne engedje pl az oszlopok sorok átméretezését, egyedül a mezők kitöltését és a mentést engedje.
Eccer volt Wordben egy oly olyan filem, ami ha hozzáírtam egy karaktert elszállt. Azták kisakkoztam, egy láthatatlan karakter okozta a zürt. Miután azt kitörültem, megszünt a hiba. Mivel az excelbe gyakran copyzok táblákat a netről, azt hittem, most is valami ilyesmi lehet. De úgy tűnik nem.
Sziasztok!
Szeretném megkérdezni, hogy makró futása közben hogyan lehet az alábbi beépített választás eredményét lekérdezni, vagyis pl. azt, hogy a mégsem gombot választotta.
Vannak olyan Excel munkafüzeteim, amelyekben több munkalapon is kimutatások vannak (régen ezeket Pivot tábláknak hívták). Ha ráállok az egyikre, és frissítem az adatokat, akkor az összes többi mukalap kimutatása is frissül. Hol/hogy lehet ezt beállítani? Én is szeretnék ilyen munkafüzeteket csinálni, mert praktikus.
1. Nézz utána, nincs-e vírusod. Én ezt úgy tenném, hogy egy vélhetően vírusmentes gépbe átteszem a vinyót, mert van olyan vírus, ami, ha aktív, kijátssza a víruskergetőt. Az én gépemen lévő vírus nem aktiválódik, ha a másik gép operációs rendszerét indítom, tehát esélyesebb a megtalálása.
2. Próbálkozz az Excel újratelepítésével.
3. Csak az Excel hülyéskedik, vagy más programokkal is vannak gondok? Lefagyások, kékhalál, ilyesmi? Ha általános érvényű a jelenség, akkor lehet hardver-, pl. memória- vagy tápegységproblémára gyanakodni. Esetleg merevlemez is lehet.
Az E15-ben tegyél $ jelet a 15 elé: E$15 A $ jel rögzíti az oszlop- illetve sorindexeket. Pl. $E$15-ben az E oszlop is fix, tehát jobbra-balra húzgálva a képletet sem változik.
Az Excel 2000-m mostanában elkezdett produkálni néhány bosszantó jelenséget. Komolyabb probléma még nem származott belőlük, de valahogy balsejtelmeim vannak, hogy ezek valami keményebb probléma előszelei lehetnek. Abban bizom, hogy tudtok valami magyarázattal és/vagy tanáccsal szolgálni.
1. Kb. 2 hónap óta, amikor kilépek az Excelből, rendesen lement, majd megjelenik az obligát hibaüzenet: "A Windows hibát észlelt, elnézést kérnek az adatvesztésért, küldjem el a hibát stb," majd jön a semmitmondó hibamagyarázat, hogy frissitsek. Frissitenék de nem talál semmi frissiteni valót. Csinálja mindezt a hibátlan lementések után. Ja és még valami. Nem minden táblázatnál, de egyre gyakrabban.
2. Néhány nap óta ha megnyitom a Beszúrás-Megjegyzést, akkor utána nem akar becsukódni. Ki kell törölni a cellát. Tehát pratikusan megszünt a cellamegjegyzés lehetősége. Ami elég bosszantó az esetemben.
3. Ma meg azt kezdte el játszani, hogy az üres területek oszlopszélességét átállítja. A duplájára. Aztán ha visszaállítom akkor utána normális marad. Legalábbis egyelőre.
Koszonom a segitseget, a telepuleslista helyes 2. vh-s járásokat tartalmazza, telivan olyan telepulessel ami azota nevet valtoztatott / megszunt. De rajottem, hogy a fobb varosokat veletlen egy ovatlan pillanatban landoltattam a kukaban, most keszitem az ujat. Koszonom meg egyszer, ha ha sikerul ha nem jelzem :)
Megnéztem. Pár dolgot kipróbáltam magyarországi településekre. Íme egy javaslat, ami teljesen nem oldja meg a problémát, de 90-95% automatizálni tudsz. 0. Irányított szűrővel gyűjtsd ki a különböző országokat külön munkalapra. Az üres cellák se kerüljenek bele. A továbbiak csak magyar településről beszélünk. 1. A helyes településnevek listája közel sem teljes pl. hiányoznak belőle a nagyobb városok, Budapest, Szolnok, Miskolc stb. Ezért az javaslom, hogy a www.posta.hu-ról töltsd le Excel formátumba az település-irányítószám listát és csinálj belőle egy tényleg helyes településlistát (Budapest, Miskolc stb elég ha csak egy szerepel). Legyen ez mondjuk a Helyes munkalap B oszlopában 2. A Helyes munkalap A oszlopában állítsd elő a településnév ékezetelen változatát a következő VBA függvénnyel: Function EkezetTorol(szoveg As String) As String Dim ekezetes, ekezetnelkul, seged As String Dim i As Integer seged = UCase(szoveg) ekezetes = "ÁÉÍÓÖŐÚÜŰ" ekezetnelkul = "AEIOOOUUU" For i = 1 To Len(ekezetes) seged = Replace(seged, Mid(ekezetes, i, 1), Mid(ekezetnelkul, i, 1)) Next i EkezetTorol = seged End Function
(egyébként ez még nagybetűssé is teszi) Tehát a Helyes munkalap A1: =EkezetTorol(B1)
és végéig másolni 3. A javítást most már FKERES-sel megcsinálhatodí pl. D2: =HA(NEM(HIBÁS(FKERES(B2;Helyes!$A:$B;2;HAMIS)));FKERES(B2;Helyes!$A:$B;2;HAMIS);"") és végéig másolni. 4. A fennmaradó településeket legvégső soron kézzel javítod. Üdv József
Megcsinaltam csak erre a problemara az excelt. Lehet neked/nektek csak egy klikk lenne en meg mar napok ota ugyetlenkedek. A javitando reszt kene kicserelni ha talal hasonlot a helyesben, ha nincs/vagy nem magyar akkor hagyja uresen, a cellat.
http://www.dreamworld.hu/lakhely.xls
Koszonom szepen ha valaki fordit idot a belenezesbe.
Koszonom a valaszt, a Kecskemét csak egy pelda az erthetoseg kedveert, sajnos iranyitoszam nincs hozzakotve. A hasonlosagbol kene nekem kivalasztani a jo tablabol egy legjobban passzolot, ezt nem tudom hogyan lehetne megirni. A milliomos osszeg szepen hangzana, de sajnos picivel tobb mint minimalberezett adatrogzitoi munkarol van szo :)
Ki kell vonni a két időpontot egymásból. Az eredmény egy szám, ami napban mérve ábrázolja az időt. Ha ezt megszorzod 24-gyel, akkor az eredmény egész része az eltelt órák száma. Ha a kivonás után az eredmény cella formátumát "idő"-re módosítod, akkor egyből az időkülönbséget kapod.
kb 30ezer kulonbozo telepules van elgepelve :) vagy ekezet lemaradva.
Nézd, ha jellemzőenvan benne szisztéma, pl. Kecskemét mindig KECZKEMET, akkor csinálsz egy táblát pl. Posta írányítószám állománya alapján és FKERES fv. kigyűjtöd a jó verziót. A többire marad a manuális megoldás. Egyes betűelírásokat CZ CS helyett Szerkesztés/Csere menüponttal megoldhatsz. Szóba jöhet meg az Eszközök/Automatikus javítás, de ilyen mennyiségnél az FKERES-es jobban kezelhető. Ha ettől rosszabb a helyzet, tehát össze-vissza vannak elírva, akkor lehet írni rá hasonlóság vizsgáló függvényeket, amik pl. pontozzák a rossz neveket mennyire hasonlít a valamilyen jó településnévre és egy bizonyos pontszám felett cserélsz automatikusan. A többi itt is manuális. De azért ne várd, hogy itt majd valaki egy jellemzően milliós összegbe kerülő adattisztítási munkára komplett megoldást ad neked:) Üdv József
Ha a lapjaidon a különböző termékek azonos cellában vannak a lapokon (termék_1 darabszáma minden lapodon a B1 cellában van), akkor az összesítő lap B1 cellája:
=szum('01.02:01.31'!b1)
Ha nem azonos a helyük, akkor Adatok/Kimutatás/Több tartomány.
hogy erre pont nem gondoltam :) kb 30ezer kulonbozo telepules van elgepelve :) vagy ekezet lemaradva. szerencsetlen kis office a kisfaluk megyeit sem ismeri nemhogy sajat magat.
Köszönöm, és még egyet kérdeznék, ha naponta készitek egy termék előállitási listát excelbe, ami különböző darabok mennyiségét tartalmazza. 01.02 a lap neve,(január másodika,)...és igy tovább, jelenleg a 01.10 nél tartok. lehet arra valami általános képletet késziteni hogy az utolsó (Havi nevü lapon) szeretném összesiteni a J6-os excel táblák tartalmát akkor milyen képletre van szükségem? Nyilván szombat, vasárnap nem készitek napi listát. Erre létezik megoldás?
Úgy tudom, Wordben nincs olyan mező, amivel direkben felhasználi függvényt tudnál meghívni. Makróval lehet trükközni, vagy megcsinálhatod a csekket wordben és körlevél ként nyomtatod, úgy hogy az adatforrás Excelben legyen. Üdv József
Ha esetleg nem akarsz bonyolult képletekkel foglalkozni (bár szerintem ezek sokkal átláthatóbbak), akkor lehet trükközni. Az Excel a dátumot és időt számként kezeli, a szám egészrésze a 1900 jan. 1-től eltelt napok száma(egyként Ms bugtól eltekintve :) ), a törtrésze napon belüli időpontot jelenti. Ha csak annyi van egy cellába, hogy 8:15:00, akkor ez igazából 1900.01.01 8:15:00, és számként 0,34375 jelent. Ha ezt megszorzod 24-gyel akkor órában kapod meg az időt: 8,25. Tehát pl. a túlórás képletet jól lehet így is fel lehet írni: =HA((b2-a2)*24>8,5;(b2-a2)-8/24;b2-a2) Természetes a cellaformátum idő legyen. A túlórákat gondolom összegezni is szeretnéd. Erre cellaformátum [ó]:pp:mm legyen! Egyébként ezt a 24-való szorzásos dolgot jól lehet felhasználni, ha időt kerekíteni kell (órára, negyedórára, félórára, 10percre stb.) Üdv József
hogy a helyesírási szabálynak megfelelően nagy kezdőbetűvel írja szövegesen az összeget. Különböző okok miatt (pl. ez nekem sem így kellett :) ), ezt én opcionálisan raknám bele.
Function szam2szoveg(szam As Long, capitalize As Boolean) As String ....
If capitalize Then betu = UCase(Left(betu, 1)) & Right(betu, Len(betu) - 1) ...
Nagyon köszönöm, sokat segítettél, és megspóroltál nekem jó néhány álmatlan éjszakát.
Még azt meg kérdezném, ezen te mit értesz: "D2-be rafináltabb képlet kell (vagy a 8 óránál kevesebb időt, vagy 8-tól 8:30-ig 8 órát ad, vagy 8:30 fölött a teljes bent töltött időt adja):
A harmadik vagy alatt azt érted, hogy a teljes bent töltött idő ( max. 8óra ) vagy az egész, ha pl. 10 órát dolgozol akkor a 10 órát irja ki? mert ezt az utobbit nem teszi meg, hanem ha eléred a 8:31 felettit akkor is a 8:00 irja . És csak a következő sorba irja ki a a másik általad kapott képlettel a túlórát.
Van mód rá hogy leird vagy bemutasd hogy tudok ilyen bonyolultabb képletet létrehozni? Függvénytündérrel megy ez is?
A. görgesd lejjebb a listát az Információ után kell lennie a Felhasználói kategóriának. B, rossz helyre vagy nem teljesen (Function sortól az End Function-ig) másoltad át.
Sziasztok, a segitsegeteket szeretnem kerni az alabbi ugyben.
Kene nekem irni egy olyan fuggvenyt vagy barmit, ami egy tablazatban levo hibasan beirt/elgepelt/ekezetet lehagyott szoveget kicserel egy olyan tablazattal amiben helyesen van. pl: KECZKEMET -et lecsereli Kecskemét -re.
Sziasztok, a segitsegeteket szeretnem kerni az alabbi ugyben.
Kene nekem irni egy olyan fuggvenyt vagy barmit, ami egy tablazatban levo hibasan beirt/elgepelt/ekezetet lehagyott szoveget kicserel egy olyan tablazattal amiben helyesen van. pl: KECZKEMET -et lecsereli Kecskemét -re.
Sajnos nem 20-30 bejegyzesrol van szo hanem 92ezret kene atnezni :)
1. Alt+F11 vagy Eszközök/ Makró/ Visual Basic Editor 2. Insert/Module menüpont 3. bemásolod a kódot és már használhatod is (pl. a függvény beillesztésnél a Felhasználó kategóriában megtalálhatod) Üdv József
Adott 1 excel jelentés amit minden féle céges infokat tartalmaz. Ezt a jelentést havonta küldjük a külföldi partnerünknek. A jelentés sok-sok különálló excel táblázatok adataira támaszkodik ezért jó volna ha ezeket is láthatnák a jelentés mellet.
Mailban csatolmányként nem szeretnénk küldözgetni minden alkalommal a sok sok táblát, csak a jelentést.
Ebbe a fájlba, jelentésbe kéne beágyaznom a többi táblázatot.
Ezt meg is oldottam Objektumok beszúrásával, sőt csináltam egy egyszerű VB menü rendszert amivel könnyen lehet nyitogatni a mellékleteket.
A nagy probléma az, hogy ha a táblázat a megnyitáskor nem látja a különálló fájlokat akkor nem tudja behívni az adatokat.
A saját hálónkon tökéletesen működik a dolog, de amint kiküldöm nem megy.
Belehet úgy szúrni valahogy egy táblázatba egy másik táblázatot (sok munkalapos) hogy az megőrizze öket, úgy hogy "beépüljön" és frissítési lehetőség nélkül az előző frissítés állapotát mutassa?
Innen töltsd le az Excel.xlb-t, tedd be a C:Documents and SettingsSajátApplication DataMicrosoftExcel könyvtárba.
A függvény alkalmazása:
f*, a kategóriák közül a Felhasználóiban megtalálod a Váltó nevűt.
Első paramétere a cella (A1), másodikba csak akkor írj valamit, ha a normál elválasztó kötőjel (Egyezer-háromszáz) helyett valami más karaktert szeretnél alkalmazni.
Sajnos, nem én írtam a függvényt, csak ollóztam. A szerző Krizsák László.
"A" oszlopban a belépés, "B"-ben a kilépés.
C2-be: =ha(b2-a2>idő(8;30;0);idő(8;0;0);b2-a2) D2-be: =ha(b2-a2>idő(8;30;0);b2-a2-idő(8;0;0);"")
Mindegyik oszlop cellaformátuma idő.
Valószínű, hogy az ebédidőt is le kell vonni a teljes időből.
Tudna segíteni valaki? Munkaidő számítás. Nálunk csak azt számolják túlórának ha 30 percet meghaladja a túlórád. Magyarul ha 8:30 felett van a munkaidőd akkor van fél órád túlóra.Ha nem éred el a 31 percet, akkor nincs (15 percet nem számolnak). Addig eljutottam hogy az első oszlop az érkezés idejét tartalmazza (pl. 7:00 ). A második oszlop a távozás idejét (pl: 16:00) És a harmadik oszlop a ledolgozott órák számát ( pl. 8:40 )erre meg is van a képlet. A harmadik oszlopba kellene nekem az hogy van-e túlórám , ha igen akkor mennyi az összes munkaidő,tehát ha 8:30 alatt dolgoztam akkor 8:00 legyen vagy az adott óra, ha felette akkor a túlórával összesitett idő. A negyedik oszlopba kellene csak a túlóra ideje.
Ezeket a képletek nem tudom sehogy összehozni.Segítenétek?
Most azt próbálnám kitalálni hogyan lehetne az Exceltábla nyitásakor automatikusan frissíteni. Gondolom makrot kellene csinálni, de még nem csináltam. :-))))
Ha nem akarsz makrózni: Amikor eljutsz eddig lépéshez. kattints a Tulajdonságok gombra
A Frissítési szabályoknál pedig beállíthatod, hogy hány percenként ill. fájl megnyitáskor frissüljön az eredmény
Most azt próbálnám kitalálni hogyan lehetne az Exceltábla nyitásakor automatikusan frissíteni. Gondolom makrot kellene csinálni, de még nem csináltam. :-))))
Hú de jó, működik! Hálásan fogok rád gondolni, ha ezután nem kell lemásznom a 6100. sorba, ahol eddig a listák kezdődtek, helyette csak egy katt a másik munkalapra. ;-) Kösz!
Ahol a másik munkalapon az adatok vannak amik a legördülőben legyenek azokat a celláket kijelölöd és nevet adsz nekik: A bal fölső sarokban az fx -től ballra lévő ablakba beírod pl: "legordulo" . Ezután átmész arra a munkalapra ahol a legördülőből akarod venni a cellatartalmat, és úgy jársz el mint eddig, és azt írod be "=legordulo" aposztróf nélkül. Meg fogja találni.
>Tudok legördülőmenüt csinálni az Excel celláiból. Akkor is ha másik munkafüzeten van.
De jó neked! Én már akkor is megfekszem, ha a lista másik munkalapon van: az Érvényesítés ablak Forrás mezejében nem enged a másik munkalapra kattogni. Megpróbáltam meghamisítani, és kézzel beírni elé, hogy =+Munka2!, de nem tetszett neki, azt mondta, hibás a képlet.
Azt szeretném ha a mondjuk a "pince" egy adatbázis(pl SQL) egy mezője lenne melynek tartalmai a (kazánház,mosókonyha,garázs, műhely,stb.) vagyis ne legyen bedrótozva az Excel táblába valahol, s ílymódon ne kelljen követnem a változásait.
Ha (viszonylag) keveset akarsz makrózni, akkor a legegyszerűbb dolog, hogy csinálsz egy adatbázis lekérdezést a szükséges mezőkre (Adatok/ Külső Adatok importálása/ Új adatbázis lekérdezés vagy Adatok beolvasása). Aztán a lekérdezés eredménytartományát adod meg a érvényesítési lista tartalmának, vagy a vezérlő forrásának. Kérdés még, hogy milyen gyakran kell a lekérdezést újra lefuttatni, de ez már be tudod makróba építeni. Üdv József
Igen, modjuk. És ez rendben is van. Meg tudom csinálni bedrótozva egy munkafüzetbe.
Azt szeretném ha a mondjuk a "pince" egy adatbázis(pl SQL) egy mezője lenne melynek tartalmai a (kazánház,mosókonyha,garázs, műhely,stb.) vagyis ne legyen bedrótozva az Excel táblába valahol, s ílymódon ne kelljen követnem a változásait.
El tudok képzelni két megoldást, de lehet hogy az Excel nem engedi és egy 3. létezik.
Az egyik lenne hogy valahogyan megadhatom az adatbázist ODBC-n keresztül az Excelnek és közvetlen az adatbázismező tartalom jelenik meg a legördülő menüben. Elképzelhető hogy ez lassú, különösen ha túl sok rekordja van a táblának(adatbázisnak).
A másik az lehetne hogy az Excel tábla kinyitásakor eltölt egy kis időt azzal hogy bemásolja egy munkalapra ezeket az adatokat az adatbázisból, egy lekérdezés lefutna, nem tudom hogyan(ez a problémám), és onnan sima lenne, bár le kellene valahogy programozni a legördülő menü beállításait is, minden alkalommal.
Esetleg erre való a makrokészítés? Bocsánat de nem volt eddig szükségem az Excel ilyen mélységű megismerésére
Nem tudom mit tud az Excel sajnos, de ragaszkodnom kell hozzá. VFP-ben pl. már megcsináltam volna.
Amint leírtam ez megy. Tudok legördülőmenüt csinálni az Excel celláiból. Akkor is ha másik munkafüzeten van. Azt nem tudom hogyan lehet ott megadni hogy egy adatbázis egyik mezőjének a tartalmai adják a legördülő menüt.
Most már csak annyi a probléma, hogy bekapcsolt védelem esetén is kellene tudni kommentet írni (Edit objects) a cellákhoz és az AutoFilternek is működnie kellene.
Próbálgattam módosítani az alábbi sort: ThisWorkbook.Sheets(lap).Protect pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
Köszi mindkettőtöknek. Rendben működik. A gondom csak annyi, hogy nem külön kellene lefuttatni, hanem minden mentés alkalmaával (amikor a felhasználó vagy a mentés ikonra kattint, vagy bezáráskor választja a mentés opciót).
Sub auto_close() ucso = ThisWorkbook.Sheets.Count Sheets("Munka1").Select For lap = 1 To ucso ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True If lap <> ucso Then ActiveSheet.Next.Select End If Next Sheets("Munka1").Select ActiveWorkbook.Save ActiveWorkbook.Close End Sub
Az alábbi makrót vidd be. Két helyen a Sheets("Munka1").Select -ben javítsd át a lap nevét a füzetedben lévő első lap nevére.
Sub auto_close() ucso = ThisWorkbook.Sheets.Count Sheets("Munka1").Select For lap = 1 To ucso ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True If lap = ucso Then Exit Sub Else ActiveSheet.Next.Select End If Next Sheets("Munka1").Select ActiveWorkbook.Save End Sub
Aztán egy kérés. Szükségem lenne egy makróra, ami minden mentés előtt lefut és bekapcsolja minden munkalapon a védelmet.
Ugyanis kedves kollégák időnként kikapcsolják (már akik ismerik a jelszót és kell nekik), aztán meg elfelejtik visszakapcsolni. Így viszont más kollégák tudnak olyan elkutyulásokat végrehajtani, amit utána győzök kibogozni.
Nem excel probléma. Ez egy figyelmeztetés, hogy nem "aláírt" vezérlőt próbálok megnyitni. Kerestem Google-ban is, de reg-et kellene hozzá módosítani (hát annyit azért nem ér). De találtam egy másik komponenst ami Microsoft aláírással rendelkezik, így nem kérdez semmit. Szerintem így egyszerübb volt :). Azért köszönöm a segítséget.
Köszönöm szépen müxik. Időközben újjab problémába ütköztem, ami nem is probléma csak... Tehát felraktam egy Date TimePick-et (dátumválasztó), de sajna így a fájl indulásakor a következő üzenetet kapom: "This application is about to initialize ActiveX controls that might be unsafe. If you trust the source of this file, select OK and the controls will be initialized using your current workspace settings". Ezt a figyelmeztetést valahogy ki lehet kapcsolni?
Dim munkaF As Workbook On Error Resume Next Set munkaF = Workbooks("start.xls") If munkaF Is Nothing Then 'nincs nyitve Workbooks.Open Filename:="C:\start.xls" Set munkaF = Nothing On Error GoTo 0 Else 'ha nyitva van Cells(1, 1) = 0 Set munkaF = Nothing On Error GoTo 0
A start.xls-ben kell lennie egy auto_open nevű makrónak, ez indul a fájl betöltésekor automatikusan. Ebbe kell beírni az inputot, mégpedig a megy.xls indítása elé.
Ez jó is lenne, de az a baj, hogy a start az automatikusan dolgozik és nyitja meg a megy-et. Nem csak én fogom ezt használni és ugye mivel ott lehet igenre és nemre kattintani, így tuti hogy valaki a másikra kattint és nem a kellő műveletet csinálja, akkor meg minden összekavarodik.
Ezt olvastam ezen témával kapcsolatban (még nem volt alkalmam kipróbálni, hogy működik-e): Átnevezed .zip -re majd kicsomagolod és kész az .xls és mindegyik Office 2007 formátummal. Mellékesen különben ha már itt vagyok kérdeznék is. Van egy munkafüzet megnyitásakor automatikusan induló makró. Néha viszont ennek nem kéne lefutnia, vagyis megoldható ennek megállítása? Kis magyarázat hogy érthetőbb legyen: adott egy start.xls és egy megy.xls. Elindítom a start.xls-t ami megnyitja a megy.xls-t majd bezárja magát, de elötte beírja az A1-be hogy 1. Amikor bezárom a megy.xls-t akkor megnyitja a start.xls-t (itt a hiba mert megpróbálja megint megnyitni a már megnyitott fájlt) az A1-be pedig beír 0-t majd mindent bezár. Remélem érthető.
Szeretnék segítséget kérni. Kaptam nem régen egy .xlsx formátumú fáljt amit sajnos nem Excel 2007 formátuma. Itt találsz további infót, hogyan tudod megnézni: http://support.microsoft.com/kb/925180/hu Innen pedig mindent letölthetsz: http://www.microsoft.com/downloads/details.aspx?familyid=c8378bf4-996c-4569-b547-75edbd03aaf0&displaylang=en Üdv József
Annyit értek, hogy ez a MS új, most bevezetés alatt álló formátuma, XML és ZIP keveréke, és a MS ígérgeti, hogy majd el tudod olvasni. :-) Ha jól értem a második táblázatot, talán Office 2007-tel készülhetett, tehát keress ilyet vagy várj egy évet, vagy kérd újra rendes formátumban. Valaki villogni akart, hogy neki a legújabb kütyüje van...
Szeretnék segítséget kérni. Kaptam nem régen egy .xlsx formátumú fáljt amit sajnos nem bírok megnyitni, még a 2003-as Excel.-el sem. Kérdésem. Ezt a kiterjesztésű fáljt mivel tudom megnyitni? (Ha lehet, jó lenne ha olyan lenne ami, ingyenes, és egyszerű felrakni, de ha nem nagyon van olyan. jöhet bármilyen progi neve amivel megtudom nyitni) Köszönöm!
Meg tudná mondani valaki, hogy hogyan tudnék ÖSSZEFŰZ függvénnyel összerakni olyan számokat tartalmazó cellákat, amikben egyéni számformátum is van? Úgy néz ki, hogy össze kellene fűznöm három oszlopot: 11 22 01 -> ebből 112201-nek kellene lenni, de 11221 lesz belőle, mert a harmadik oszlopba 1-et írtak és 00 egyéni számformátumot adtak neki.
Üdv Mindenki! A problémám amivel segítséget szeretnék kérni a következő: Office 2007 Pro-t használunk a cégnél és most következett el a pillanat amikor mindenkinél le kell majd cserélni a 2003 SBS-t erre. Na most a szerveren található egy 2003-ban létrehozott *.xls fájl, amit egy ember kezel/módosít és a többiek pedig ezt a fájlt olvasásra megnyitva tekinthettek bele a tartalmába, majd a fájlfrissítés gombra kattintva frissítették az aktuális változatra. Egészen eddig. Elkezdtem ugyanis feltörpölni eddig 3 gépre a 2007-et, de a fájlfrissítés gomb itt nem csinál semmit.Kipróbáltam már azt is, hogy egy 2007-ben hoztam létre egy xls-t és ugyanúgy csak olvasásra engedtem megnyitni egy másik 2007-es excellel, de ebben az esetben sem frissít.Kipróbáltam már az xlsx (ami ugye a 2007 sajátja)vagy mi a franc kiterjesztéssel is, de semmi. Van valakinek ötlete mi lehet e probléma megoldása? Az idegen kezelőfelület miatt is elég nehéz hozzászoktatni a népet a 2007-hez, viszont ez végleg betenné a kaput! Előre is köszi!
nekem tényleg nem ment simán a telepítés, ki kellett csomizni az exe-t és csak utána volt hajlandó rámenni 2003 officera az elindított .msi Amúgy nem tudom mire lehet használni (gondolom vba helyett volt anno) de érdekes - tetszik.
Én is 2003-ast használok, és simán telepítettem... Létrehozott egy Office10 mappát, és abba tette a Xlmacr8.hlp fájlt.
Amikor a FUNC.XLS-ben duplakattintasz egy függvényre, és nem találja a vonatkozó súgót, mondd neki, hogy majd magad megkeresed. Aztán tallózz ebbe a mappába, és nyisd meg a Xlmacr8.hlp fájlt. Maximum annyi hiba lehet, hogy a 2002-es kiadás óta kicsit változott a függvények listája, és ezért a help nem teljesen oké.
Ez egy .exe file, de a winrar kicsomagolja belőle az .msi telepítőfile-t, és ezt elindítva már nem reklamál, hogy nincs Office2000 a gépen. Csak makrólapon lehet használni ezeket. Jó dolog, de ma már ott van a VBA erre - és legalább tudom hogy ilyen is van. Köszönöm!
2003-as Office-t használok, így nem tudom feltelepíteni. Ellenben köszönöm a linkeket, jól ki tudok indulni ezekből. Úgy tűnik, ma már nem nagyon használják ezeket engem viszont érdekel. Köszi szépen tényleg.
Ja, és egyébként ha a súgót telepíteni tudtad, keresd a FUNCS.XLS nevű fájlt a C:Program FilesMicrosoft OfficeOffice101038 (vagy hasonló) könyvtárban, és nyisd meg. Ott vannak a makrófüggvények, és dupla kattra jön a súgó. (Elvileg. Nem tudtam kipróbálni még.)
A Micro$oft honlapról letölthető egy súgó, amiben egész részletesen benne van a GET.CELL (magyarul: CELLÁT.VESZ) függvény leírása. Meg a többi Excel4 makrófüggvényé is.
Bocs, mellénéztem. -- Más: Írtam egy nagyon egyszerű saját függvényt, aminek az a lényege, hogy megadott értékre kerekít. Nekem pl. arra kellett, hogy időket 15 mp-es egységekre kerekítsen. Pl. 0:22:03 -> 0:22:00, 0:27:12 -> 0:27:15; 0:33:41 -> 0:33:45 legyen és így tovább.
A függvény a kerekítendő értéket és a kerekítés egységét kéri be. Frankón működik akkor is ha számokat tartalamzó vagy időt tartalmazú cellát adok neki bementként. Viszont nem tud mit kezdeni azzal, ha nem cellehivatkozást, hanem azt írom be neki, hogy "0:00:15"
Így szoktam csinálni, amíg nem volt saját függvényem (A1-ben van a kerekítendő érték): =KEREK(A1/"0:00:15";0)*"0:00:15")
És így néz ki a fgv, ami nem egészen működik: Public Function KEREK2(mit, mire) KEREK2 = Round((mit / mire), 0) * mire End Function
Pl. A1 = 0:22:03 és B1 = 0:00:15 esetén =KEREK2(A1;B1) jól működik, viszont pl. =KEREK2(A1;"0:00:15") már nem, #ÉRTÉKET ad vissza.
Próbálkoztam a változók típusával (eredménytelenül, *1-gyel, hátha, még azzal is, hogy IsDate-tel külön lekezelem (felismerte, hogy Date, de nem jutottam tovább). Egyébként is az lenne a szép, ha nem kéne a fgv.-t minden típusra külön megírni.
Tehát, mi ez a Get.Cell. Azt olvasom hogy a VBA elődje, egy makrónyelv meg ilyenek, de hog yis kell ezt használni. Nem találtam erről magyar leírást sehol egyelőre :( angolt még nem kerestem, de az se nagyon van ahogy elnézem...
Can I use Excel’s built-in worksheet functions in my VBA code?
In most cases, yes. Excel's worksheet functions are accessed via the WorksheetFunction method of the Application object. For example, you could access the POWER worksheet functions with a statement such as the following:
Ans = Application.WorksheetFunction.Power(5, 3) This example raises 5 to the third power.
Generally, if VBA includes an equivalent function, you cannot use Excel’s worksheet version. For example, because VBA has a function to compute square roots (Sqr) you cannot use the SQRT worksheet function in your VBA code.
Megtetszett a függvényírás. Ezzel kapcsolatban az a kérdésem, hogy egy saját függvényben hogyan tudom a beépítetteket használni.
Mondjuk egy példa (nyilván itt sok értelme nincs, csak valami egyszerüt akartam kitalálni): Gyakran kell egy szám négyzetgyöke kerekítve. És mondjuk ezt a függvényt szoktam használni =KEREK(GYÖK(A1);1), de szeretnék egy saját függvényt, ami ue.-t csinálja, úgy hogy csak ennyit kell hozzá megadni: =KEREKITETTGYÖK(A1;1)
Köszi az előzőt! Új kérdés: Van-e olyan fgv. amivel azt kérdezhetem le egy celláról, hogy képlet van-e benne, vagy sem. Azaz meg akarom különbözetni pl. azt a két cellát, hogy 2 és =2.
Egyébként nincs olyan fügvény, amivel egy halmaz valahanyadik legkisebb (legnagyobb) elemét tudom megkapni? Tehát nem a legkisebbet, hanem mondjuk az 5. legkisebbet.
Köszi! Sajnos egész mást csinál, mint szeretném. Ezt kéne csinálnia: Ha van ez első képen lévő munkalap, akkor a második munkalapnak a második képen lévővé kell változnia:
Sub Worksheet_Change(ByVal Target As Excel.Range) If (Target.Column = 1) Then nev = Target.Value End If Rendez (nev) End Sub
A Munka2 lapon a B1-be írj valami címet. Ha nem a B-be akarod tenni az új adatot, csak aszerint akarsz rendezni, akkor annak az oszlopnak az 1. sorába adj címet.
Munka2-höz, de már nem a lapfülön, hanem Eszököz/Makró/Visual Basic (vagy ehelyett Alt+F11), bal oldalon kiválasztod a füzetedet. Beszúrás(Insert)/Modul.
Jobb oldalon kapsz egy üres oldalt, oda bemásolod ezt:
Sub Rendez(nev) Sheets("Munka2").Select usor = ActiveSheet.UsedRange.Rows.Count + 1 Cells(usor, 2) = nev Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom Sheets("Munka1").Select End Sub
Ha másik (nem B) oszlopba íratsz, a 4. sorban a 2-t írd át az oszlop sorszámára.
Ha a művelet után nem a Munka1-en akarsz kikötni, hagyd el a Sheets("Munka1").Select sort.
Ha vannak olyan képleteid, amiknek az értékét már nem akarod változtatni, érdemes másolni, majd ugyanoda irányított beillesztéssel az értéküket beilleszteni.
Más:
Az szám alakú, de számolásra nem használt adatok cellaformátumát – mint irányítószám, telefon – érdemes szöveg tip-ra állítani már az adatok bevitele előtt. A szöveg kevesebb helyet igényel.
Ha már fel van töltve a táblázat, a FIX függvénnyel és az irányított beillesztés értékkel-lel végezd el az átállításukat.
"Mindegyik lapfülhöz hozzá kell rendelni a makrót, mert csak az adott lapra vonatkozik."
Sajnos még soha nem használtam makrót, ezért ezt nem értem. Jelen pillanatban ott állok, hogy meg van nyitva a VB-ablak és be van másolva a kód. Hogyan tovább?
Természetesen nem gondolom, hogy szépen egyesével mindenkinek el kell magyarázni a dolgot, így nekem sem. Egy jó leírás valahol, hogy hogyan kell a makrókat alkalmazni?
Akkor sorban mondom: 1. Nagyon köszönöm, pontosan erre volt szükségem! Nagy segítség volt!
2. Esetleg ismert valami trükk, amivel csökkenthetném a fájlméretet?
3. Na, ez nem sikerült. Mondom lépésről lépésre, mit csináltam:
Van egy munkalapom (neve M1), ezen van ez: 1; b 2; c 3; a
Van egy másik munkalapom, ami üres (neve M2). Rákattintok jobb gombbal az M2-re, kiválasztom azt, hogy Kód megjelenítése. Erre megjelenik a Visual Basic ablak. Bemásolom az általad írt kódot.
Nagy öröm, hogy rátaláltam erre topikra, mert nagyon szeretem az excelt, sok hülyeséget csináltam már magam örömére, vagy munka, segítség miatt benne. (Nem vagyok guru, főleg, mert makrók nélkül dolgozok, de ezen majd lassan már kell változtatnom.) Három kérdés:
1. kérdés
Van 4 munkalapom, amelyek neve mondjuk Munka, Alma, Körte, Narancs. A Munka nevű lap A sora úgy néz ki, hogy Alma; Körte; Narancs
Azt szeretném, hogy a B sor így nézzen ki: =Alma!$A$1; =Körte!$A$1; =Narancs!$A$1
De úgy, hogy ha az Almár Körtére cserélem, akkor a hivatkozás is cserélődjön. Mondjuk, ha az A1 változik Alma helyett Körte lesz, akkor a B1-ben legyen =Alma!$A$1 helyett =Körte!$A$1
Vagy általánosabban hogyan lehet egy cellahivatkozást függvénnyel összerakni. Az is segítene, ha csak a munkalapon belül menne ez: A sor: 4; 6; 9; B sor: =D4; =D6; =D9
De, ha változatatom az A1-et 7-re, akkor B1 legyen =D7.
2. kérdés
Van egy viszonylag egyszerű munkafüzet. A mérete mégis jó nagy. Érdekelne, hogy milyen dolgok befolyásolják a méretet. Tudtok erről valamit? Az is megfelelne, hogy ha az alapértelmezett 65e sort tudnám szűkíteni pl. 1000-re.
3. kérdés
Itt az a kérdés, hogy megy-e makró nélkül, vagy most kezdjek tanulni (itt elég csak rögzíteni).
Az egyik lap így néz ki:
1; Barack
2; Körte
3; Alma
Azt szeretném, hogy egy másik munkalapon megjelenjenek ue. a párok, de a 2. oszlop szerint abc-sorrendben. Persze lehet menüből rendezni, de nekem az kellene, hogy ha átírok valamit az első munkalapon, akkor a sorrend is update-elődjön.
Készítettem egy 305 soros táblát próbából, mert nyomtatásnál a mezőneveket minden oldal tetejére ki kellene nyomtatni és ezt képtelenség beállítani (nálam). A beállításra szolgáló lapon (Oldalbeállítás / Lap fül) az ide vonatkozó mezők valami folytán le vannak tiltva (szürke és kiválasztahatlan!!) még akkor is, ha az eredetiben, ill. kézzel beállított x számú (pl. 20 oldal magas) oldalra szeretném kinyomtatni.
Fel lehet oldani a "Fennt ismétlődő sorok" tiltását valahogy??
Sub Gepkocsi() Sheets("Összes").Select Range("A1").Select Selection.CurrentRegion.Select Tomb = Selection.CurrentRegion For sor = 2 To UBound(Tomb) lapnev$ = Cells(sor, 1).Value Sheets(lapnev$).Select: Range("A2").Select Tomb_lapnev = Selection.CurrentRegion Range(Cells(2, 1), Cells(UBound(Tomb_lapnev), 5)).Select Selection.ClearContents Sheets("Összes").Select Next
For sor = 2 To UBound(Tomb) lapnev$ = Cells(sor, 1) Sheets(lapnev$).Select: Range("A1").Select Tomb_lapnev = Selection.CurrentRegion For oszl = 1 To 5 Cells(UBound(Tomb_lapnev) + 1, oszl) = Sheets("Összes").Cells(sor, oszl) Next Sheets("Összes").Select Next End Sub
A számot tartalmazó soroknak egy üres oszlopába írd: =fix(An;0), ahol az n a sorszám. Kijelölöd ezt a cellát, Ctrl+C-vel másolod, majd az A oszlopba irányítottan, értékként beilleszted. Ezután a függvényt tartalmazó cella tartalmát kitörölheted.
A javítások után érdemes kijelölni az A oszlopot, és cellaformátumnak a szöveget beállítani. Ezután már minden új "számos" gyártódat szövegként értelmezi.
Köszönöm, működik! Nem viszi át az összes oszlopot, de majd módosítom a makrót, talán az már menni fog;)
Viszont egy dolog feltűnt: ha a lapnév szám és a szétdobási paraméter is szám, akkor hibával leáll. Milyen függvény alakítja át az excelben lévő számot szöveggé vb-ben? Úgy lenne bolondbiztos;)
Az alábbi makrót másold be. Azt a lapot, ahol az összes adatod van, nevezd Összes-nek (vagy írd át a makróban mind a két helyen), a többi lap neve egyezzen meg a gépkocsi nevével.
A makró futtatása előtt mindegyik lapon készítsd el a fejsort.
Sub Gepkocsi() Sheets("Összes").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom Range("A1").Select Selection.CurrentRegion.Select Tomb = Selection.CurrentRegion For sor = 2 To UBound(Tomb) lapnev = Cells(sor, 1).Value Sheets(lapnev).Select: Range("A1").Select
A makró az első futtatáskor jó eredményt ad, a következőknél viszont az előzőleg felírt adatokhoz hozzáadja a többit. Erre majd valaki biztosan tud ötletet adni, hogy lehet ismeretlen lapszámú és nevű lapokon törölni az előző adatokat.
Ha nem lenne ötlet – ami lehetetlen –, a második futtatástól kezdve ki kellene jelölni együtt a lapokat, és törölni a már beírt adatokat.
Másik munkalapon akarom látni. Hogy az előző példánál maradjak: legyen egy mercedes lap, egy bmw, egy fiat, stb. És amikor az első lapra beírok egy adatot, az jelenjen meg azon a lapon is, amelyikbe tartozik.
Ha van egy táblázatom 5 oszloppal és egy másik munkalapon szeretnék ebből a táblázatból kiszedni sorokat, néhány feltétel alapján, azt csak makroval tudom megtenni? Vagy irányított szűréssel, esetleg tömbképlettel?
Pl. az egyik táblázatban autókat sorolok fel, az oszlopok: gyártó, tipus, rendszám, önsúly, alvázszám és egy másik táblázatban szeretném csak a Mercedesek listáját. De úgy, hogyha az első táblába új adat kerül, az automatikusan kerüljön a másikba is.
Szia! Használd a KICSI, NAGY, SORSZÁM függvényeket. A legritkábbra most kapásból nem tudom a választ de más nem mondja meg utánanézek. Elvileg: {=MIN(DARABTELI(A1:A13;A1:A13))} tömbképlet megadja ezt is
Azt szeretném megkérdezni, hogy mi okozhatja egy sima excel fájl megnyitásakor a "Fájlhiba:az adatok elveszhetnek" hibaüzenetet.
Az érdekes az, hogy csak akkor jelenik meg ez az üzenet, ha egy adott gépről (mindig erről a gépről ) valaki előzőleg már megnyitotta ugyanezt a fájlt, esetleg beleírt egy értéket (mondjuk egy cellához megjegyzést szúrt be), majd elmentette és bezárta. Ezután több különböző gépről már csak a fent leírt hibaüzenettel lehet a fájlt megynyitni (érdekes, hogy vannak olyan gépek is amelyek simán, hibaüzenet nélkül nyitják meg). Vajon mi lehet ennek az oka?
Természetesen megengedhető a nagybetűsítés de nem csak ez alkalommal szeretném elsikálni a problémát : Ha ez tényleg így van ez egy komoly gond lehet. Ilyen kivételej nem szabadna, hogy legyenek hibaüzenet nélkül hiszen a mezei user ráhagyatkozik az excelre.
Pénzügyi-kontrolling területen azért néhány szót rövidítünk pc-vel. ( számítógépnek, profit center, production cost stb. ) Ez mellé azért sanszos hogy valaki még odabiggyeszt egy S-sel kezdődő szót, szórövidítést.
Konkrét éles esetben amikor nincs mód, idő keresztellenőrizni akkor azért ez okozhat ez némi gondot.
Ezenfelül ki tudja, hogy vannak más betűkombinációk is aminél elfogadod, hogy a SZUMHA nem összesített semmit közben pedig kellett volna.
Abban szeretném a segítségeteket kérni, hogy mi modon lehetne az exponencinális függvényt létrehozni excelben? Az =exp(szám) parancs sajnos nem működik. Vagy saját függvényt kell rá írni?
Kaptam egy excel file-t havi pénzügyi számokkal angol excel-lel dolgozó kollégámtól. Megnyitottam a magyar excel-lel és meglepve tapsztaltam, hogy nálam más a végösszeg.
A táblázat alapvetően szumha függvényekkel szedi össze más táblázatokból az eredményeket.
Egy cella okozta az eltérést. Eddig úgy tudtam, hogy a szumha kis-nagybetűt nem különböztet meg.
Most viszont az eredménytáblámba "pcStationery"-re szumházva a forrás file "PCStationery" sorait nem összegzi.
Ez a pcS ( kis "p" - kis "s" - nagy "S" ) valami vezérlőkarakter ? Vannak még más ilyenek is ?
Angol excelben miért nem gond ez - miért csak a magyarban ?
Elnézést ha ez a téma már volt ezen a fórumon, most nincs időm visszaolvasni. Köszönet minden tanácsért !
No igen. Minden viszonylagos. Kinek mi a szemét, és mi a hasznos. Bizonyára vannak esetek, amikor jól jön(nek) eme funkció(k) - már ha júzer egyáltalán ismeri őket -, és vannak esetek, amikor feleslegesek. Ám ez a topic nem erről szól.
Sajnos mind a Word-nek, mind az Excel-nek sajátossága, hogy sok szemetett is elment a fájlokba. Nálam már sok alkalommal segített, hogy egy M$ fájlt OOo-val (OpenOffice.org-gal) nyitottam meg, aztán vele ismét elmentettem open document formátumban is, és M$ formátumban is. Mindenféle változtatás nélkül. Az open document formátum eleve tömörített, így kisebbek a fájlméretek, csakhogy a M$ programok nem tudják kezelni őket. :( Ám a legtöbb esetben a M$ formátunban is lecsökkentek a fájlméretek. Volt, amikor kevesebb, mint a fele lett. A szemét nem lett elmentve. Próbáld ki!
Megér egy próbát, mentsd el más néven a dokumentumot.
A Wordnek megvan az a sajátossága, hogy a doc eltárolja a benne végzett módosításokat, amik növelik a méretét. Ha az új fájl mérete kicsi, OK. Ha nem, akkor egy újonnan megnyitott doc-ba másold át a régi szövegét, mentsd el, ezután csatolj.
Mivel sok diagramot kell csatolnod, érdemes az első csatolást makróra rögzíteni, billentyű kombinációt rendelni hozzá, és a többit már ezzel csatolni.
Adott egy Form, melyen van egy Combobox, melynek a Text-e alap állapotban üres. Labelekben megjelennek különböző adatok, melyek a Combobox értékétől függnek. Gombnyomásra megnyílik egy másik Form, ahol a Labelekben megjelenő értékeket lehet módosítani a "Lezárás" gombbal. Amennyiben a Combobox üres, nincs is baj, de ha nem akkor a Combobox folyamatában hibát jelez. A probléma az, hogy egy olyan munkalapon próbálja végrehajtani a feladatot ami nem is szerepel a Combobox eseményében. A konkrét kérdés igazából az, hogy a Combobox Click eseménye miért fut le amikor nem is történik benne változás és nem is kattintok rá csak egy másik Form bezárul, vagy ha ez mindenképpen lefut, hogyan lehet, hogy olyan munkalapra megy, ami nem is szerepel az eseményben.
Számomra rejtélyes ügyben szeretnék segítséget kérni. Excelből Wordbe másoltam át sok diagramot, az eredmény egy 16 MB-os doc lett, nekem pedig kisméretű fájl kellene. Már rájöttem, hogy képként kellett volna átmásolni a diagramokat Irányított beillesztéssel, nem pedig sima vágólappal. Nekiálltam kitörölni az ábrákat és az említett módon újra beilleszteni, de a doc fájl mérete nem változott - még akkor is 16 MB maradt, amikor minden létező ábrát és szöveget kitöröltem belőle. Meg tudná mondani valaki, hogy hogyan tudnám csökkenteni a méretet úgy, hogy csak az ábrákat cserélem?