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.
Ezt a kérdést már többször feltették itt, és többször megválaszolták. A 2 legegyszerübb megoldás:
1. A Beszúrás/Kimutatás-sal megadod hogy hova listázzon, majd továbblépsz és az 1-50 oszlop fejcímét az un. sorcimkék kvadránsba húzod, és kész.
2. Special (Irányitott) szűrő, kipipálod, hogy mindegyiket csak egyszer, hogy ne helyben szűrjön, hanem "máshova", aztán megadod hogy hova, a kritériumcellába beírod, hogy >0, majd szűrés és kész.
A két eredménylista abban fog különbözni, hogy a kimutatásé nagyság szerint rendezi az számaidat, a szűrőnél pedig megmaradnak az adatoszlop sorrendjében.
Sziasztok, az alábbi problémát nem tudom megoldani:
Van egy oszlop tele számokkal 1-50-ig. Van, hogy egy szám többször is szerepel az oszlopban, de van olyan szám is 1-50-ig, ami egyáltalán nem szerepel az oszlopban, illetve van az oszlopban olyan sor is, ahol egyáltalán nincsen szám.
A feladat a következő lenne. Egy másik oszlopba egymás alá ki kéne listázni azokat a számokat, amik szerepelnek az első oszlopban, de ebben a második oszlopban, már csak egyszer szerepeljen mnden szám.
Hi Folks, Another bug? Replace does not work on a protected sheet even with UserInterfaceOnly set to True?
Maybe more interestingly, it doesn't throw and error?
Is the only workaround to unprotect a reprotect?
Tehát: Ismét egy poloska (bug)? A replace nem működik a védett lapon akkor sem, ha a UserInterfaceOnly értéke true?
...Az egyedüli megoldás, ha ki-, majd visszakapcsoljuk a védelmet?
És a microsoft szakértő válasza: ...this is a very old problem. i wouldn't say that it is a bug. This feature is simply not available. But here is a workaround.
...ez egy nagyon régi probléma. Én nem mondanám, hogy poloska. Ez a tulajdonság egyszerűen nem érhető el.
Nálam is. Az a kérdés, hogy unprotect nélkül miért nem működik? Mikor minden más módosítás működik a védett adatlapon. Még egyszer hangsúlyozom, a kérdésem elvi jellegű, a problémát meg tudom oldani, csak nem értem, hogy miért van így.
Egy olyan problémám van, hogy e-mailben kapott excel dokumentumot a program nem tud megnyitni. Bejön az excel ablak, de maga a munkalap nem jelenik meg. Más exel dokumentumot a program gond nélkül megnyit. Mi lehet a probléma?
Kedves Delila, köszönöm. De azt hiszem, félreértetted a kérdésemet. (Emlékeim szerint ez eddig először történt meg).
Szóval nem az volt a gondom, hogy hogyan tudom a lapvédelmet feloldani. Hiszen ahogy a programban letiltom az esetleges kézi módosítások lehetőségét az ActiveSheet.Protect userinterfaceonly:=True paranccsal, ugyanúgy könnyedén vissza tudom kapcsolni az ActiveSheet.Unprotect paranccsal.
Engem az zavart, hogy amig a program a protect parancs ellenére eddig minden adatmódosítást (beírás, törlés, rendezés stb.) gond nélkül végrehajtott (hiszen a tiltás elvileg csak a kézi beavatkozásokra érvényes), addig a replace parancs esetében megtagadta a végrehajtást.
Tehát a kérdésem inkább elvi volt. Létezik, hogy a replace parancs "szabálytalanul" viselkedik, avagy én hibázok el valamit? Illetve, ha a replace a hibás, akkor vannak-e még más, unortodox módon viselkedő parancsok?
Pedig ez a beállítás is megőrződik, csak az Excelnek van egy speciális, de érthető tulajdonsága. Ahogy előttem is írták ez a beállítás az egész Excelre vonatkozik. Az automatikus/kézi számolási beállítást az Excel mindig a legelső megnyitott fájlból állítja be. Tehát ha ezt a fájlt nyitod meg elsőnek, akkor kézi számolásod lesz. Viszont ha ezután még megnyitsz másik tíz munkalapot, akkor azokban a munkalapokban is kézi lesz a számolás, majd ha ezt a másik tíz munkalapot mented, akkor azok is lementik magukkal a kézi számolás beállítását. Ha viszont már van nyitva egy munkafüzeted, amiben automatikus a számolás, és ezután megnyitod a kézi számolásos fájlt akkor viszont abban is az automatikus beállítás lesz érvényes.
Én meg azt gondolom, hogy ez az Excel beállítása lehet és nem a munkafüzeté. A visszavonás gombbal vissza lehet vonni egy ilyen beállítást? Felteszem, nem.
Meglepő jelenséget produkált az Excelem (2003). Hónapok óta dolgozom a programomon, ahol a munkafüzet jelszavas védelmén túlmenően magát az alapadatokat tartalmazó munkalapokon is beállítottam a lapvédelmet. Amit ugyan nem nehéz kikerülni, de azért jobbnak láttam, ha az Excel nem engedi a kézi módosításokat. A program elején bekapcsolom a lapvédelmet (ha valamiért kikapcsolódott volna), és ez így is marad. A kikapcsolást nem használom. A program így is tud írni bele. Annyit tudtam, hogy a védelem az autoszűrő használatát is tiltja, de sebaj, azzal úgysem dolgozom.
Erre most egy ponton használnom kellett a search and replace parancsot, és legnagyobb megdöbbenésemre egyrészt hibaüzenetet kaptam, hogy a módosítani kívánt cella írásvédett.... Az üzenet még nem lett volna gond, azt le lehet tiltani, de a cserét nem hajtotta végre a program. Amúgy ez sem nem nagy gond, egy programsorral fel tudom oldani, majd egy másikkal vissza, inkább elvileg zavar. Nem találom dokumentálva a dolgot.
Én szúrtam el valamit, vagy a Replace funkció nem működik a védett lapokon. És ha az utóbbi igaz, fog-e vajon érni még más meglepetés is további parancsoknál?
Azt be lehet állítani az Excel 2007-ben, hogy amikor lementek egy füzetet a "Képletek kiszámítása csak kérésre" beállítással, akkor azt így is nyissa ki? Mert nálam mindig visszavált az automatikus kiszámítási módra.
Vagy lehet valahogy mondani neki, hogy a "D" oszlop összes sorára értelmezze.
Nem értem a problémád. Már miért ne lehetne mondjuk az E oszlop adatait a D oszlop celláiból származtatni? Ez a BAL fgv-nyel is ugyanúgy megy mint bármelyik függvénnyel. l
A C1-nél az első 8 karakterre van szükségem csak. És itt van az, hogy az eleje azonos a termékeknél de a vége eltér ezért logikusan a táblázat külön értéknek veszi.
Köszi a tippet! De az a baj, hogy egy txt file-ból olvassa be ami minden nap csak növekszik. Szóval az összes sorra meg kellene írnom szerintem a left() fgv-t. Vagy lehet valahogy mondani neki, hogy a "D" oszlop összes sorára értelmezze.
Szerintem nem. De ha az A és a B oszlopban van a két dátum, akkor a C-ben elő lehet állítani ezt dátum- és szövegkezelő függvényekkel, és az első kettőt elrejteni, Viszont azokkal lehet számolni tovább.
Az automatikus beléptetés nálam is csak a saját asztali gépemen érvényes. Más gépen be kell jelentkeznem (bár máshol ezt szándékosan nem is indapassal teszem, hiszen ott nem akarok bejelentkezve maradni), de az nem érinti a saját asztali gépemet. Itt azután sem kell bejelentkeznem hazatérés után.
Indapassozol? Elvileg mostanra muszáj volna. Ha igen, akkor ne a forum.index.hu-ról jelentkezz be, hanem pötyögd be, hogy indapass.hu, ugyanazzal a loginnal lépj be a jobb felső sarokban lévő belépés gombbal, böngésző bezár, majd irány a parancsikon. Elméletileg így működnie kellene.
Emlékeim szerint nekem ebben az indapassal való összekötés segített. Csak az újrainstallálás kapcsolta ki. Akkor újra összekapcsoltam, és azóta is eleve bejelentkezve vagyok a saját gépemen. Csak már régrn volt, és a pontos technikára nem emlékszem.
Kösz a választ. Nem töröltem semmilyen böngészési előzményt. De ha töröltem volna is, be kellene tudni állítani valahogy egyszerűen. Mintahogy előszörre sikerült. Ha már akkor is bejelentkezés nélkül müködött volna, belenyugodtam volna, hogy csak így müxik. De az előzmények miatt tudom, hogy van bejelentkezéses forma is. Így hát keresem.
A kukikat hol kell megnézni? És egyáltalán: átírhatók?
Az Excel fórumnak csináltam egy inditó ikont az Asztalra. Hosszú ideig, ha rákattintottam. úgy hozta fórumot, hogy már be is voltam jelentkezve. Kb két hete azonban meghülyült, és belentkezés nélkül adja a fórumot. Próbálkoztam mindenféle beállítással, de nem sikerült a bejelentkezéses változatot összehoznom. Tudna valaki segíteni?
Sőt, a left-es (Bal függvényes) alakhoz nem is kell külön kereső oszlop, mert az FKERES függvényt is elfogad kritérumként. Tehát:
=FKERES(BAL(1234567,6); stb) 123456-ra fog keresni.
A 2007-es excelnél mindegy, hogy az 1234567 szám- vagy szövegformátumú, a 2003-asnál azonban úgy emlékszem, hogy szövegfüggvényhez csak szövegformátum passzintható. És viszont
Majd megpróbálok valamit mert azért bosszant, hogy nem tudom megoldani.
Most egy másik kérdésem lenne már ha el tudom magyarázni :D
Van három munkafüzetem. Munkafüzet1-en van vonalkód időbélyeggel. Munkafüzet2-n van egy értékpárom ahol a vonalkód és a hozzá tartozó termék neve van és az Fkeres() fgv-hez kell. Munkafüzet3-n egy kimuatás van a vonalkódból ami a munkafüzet1-en szerepel
A munkafüzet3 A oszlopába írom az Fkeres() fgv-t azért hogy ne vonalkódokat kelljen keresni hanem ott legyen a termék neve.
A problémám, hogy a vonalkód vége változhat ami a terméket nézve nem fontos mert a szállítmányozáshoz kell. Pl:
0123456 ==>Csoki1
0654321 ==>Csoki2
0123459 ==>Csoki1
0654329 ==>Csoki2
Így a kimutatás táblázatban összesen 4 sor van ha a példát nézzük. Nem lehet megvalósítani valahogy hogy összevontan jelenítse meg? Azaz mindegy hogy 0123456 vagy 0123459 mind a két bejegyzés a harmadik munkafüzeten a csoki1-hez tartozzon?
James42: az a fontos, hogy te elégedett légy, ne törődj a világgal.
Pimre: a youtube oldalon, az alatt, hogy "Published on..." van egy link. Arra kattintasz, majd a link alatti leírást követve a feljövő oldalon megkeresed a file-t (legalul van), a videón 1:14-től mutatja hogy találod meg.
Bizonyára hasznosak a Youtube videói, bár én a linkből nem igazán tudom kihámozni a kereshető listát. Nincs egy jobb lista?
Egyébként a magam részéről ha igazán alapos gyűjteményt keresek, akkor jobban szeretem az írásos - tartalomjegyzékkel elláttott, lapozható - összeállításokat. És ebben számomra a csúcs eddig a következő volt: http://www.ozgrid.com/Excel/free-training/basic-index.htm
Például ennek az 5. leckesorozatából tanultam meg a Userformok használatánap alapjait.
Na de oda tartoznak még a szajkók és a szarkák is, és azok sokkal szebbek. Viszont a lényeg az, hogy most legalább már érthető, hogy mit akartál, és még link is van hozzá. Tehát a hozzászólásomat sikeresnek nyilvánítom. :-)
Nekem a varjúk történetesen nem jönnek be, de virágozzék ezer virág!
A két név akiket ezek szerint nem ismersz, a youtube-ra töltenek fel videókat az excel használatáról, többnyire függvényekről. Most csináltak egy kereshető listát az összes videójukról excel file formátumban.
A makrók tudtommal nem. De a hozzájuk rendelt billentyűkiosztás felül írja az excel billentyűkiosztását. Nálatok valszeg nem ez van, mert arra csak emlékeznétek, hogy csináltatok beszúrás és eltolás makrókat, amihez pont ezt a két betűt rendeltétek.
Egyébként akartam is javasolni, hogy ha minden kötél szakad, megoldás lehet, hogy lemakrózzátok a másolás és beillesztés parancsot és kiosztjátok nekik ezt a két betűt. Ha ezt az excel elfogadja és normálisan működik, akkor az exceletek állítódott át. De az is lehet, hogy figyelmeztet, hogy a két betű foglalt, válasszatok más betűt. Ekkor szerencsétek van, mert csak a betűket lefoglaló makrókat kell megkeresni és átállítani, hogy helyre álljon a rend.
Korábban rendben volt, de hogy mi váltotta ki, nem tudom (nem az én gépem, kolléga kínlódik a jelenséggel). Makrófuttatás elkavarhatja vajon ennyire az excel lelkivilágát?
2007-es Excellel akadt egy kis összetűzésünk. A Ctrl+C és a Ctrl+V billentyűkombók nem épp az elvárt módon működnek. A Ctrl+C a másolás helyett a "Beszúrás..." helyi menű tartalmát szedi elő, a Ctrl+V pedig ugyanez pepitában, csak nem a beszúrást, hanem az eltolást erőlteti. Mi lehet vajon félretekerve? Van ötletetek?
A Ctrl+X normálisan működik, illetve az egérrel elérhető másolás és beillesztés menüpontok is teszik a dolgukat normálisan.
De a viccet félretéve, talán mégis megoldható a problémád. Valahogy úgy, ahogy pdw javasolta. Külön oszlopban vezetve a változást, majd egy harmadikban történne a 2 oszlop összedolgozása (amihez esetleg további segédoszlopok felvétele is előnyös lehet).
Olyan kérdésem lenne, hogy megvalósítható-e automatizáltan a következő:
Van egy txt file amiből számol nekem az excel szép kis számokat. Hó végén ellenörzöm a raktárat. Többnyire egy kis eltérés van a tényleges és az excelben található értékek között.
Egy sima kivonással kiszámolom a raktár és a tényleges közti különbséget majd ezzel az értékkel korrigálom is a készletet.
De ezt az ellenörzést csak havi szinten csinálom meg. És az a kérdésem hogyan lehetne megoldani, hogy a január végén beolvasott értékek statikusak maradjonak mert februárban már nem annyi a készlet. Egyenlőre csak a copy paste megoldást találtam mint használható dolog
példával:
A "Készlet mf A1"-be szum függvénnyel beolvassa a "scanner munkafüzetből", hogy 100db
Kimentem a raktárba és 150db-ot találtam.
Amit be is írok a "leltár mf A1" oszloba.
Azaz 50 db az eltérés amit hozzá is adok a "Készlet mf A1"-hez és így 150 db lesz. Magyarul egyezik az excel és a valóság
Kimegyek következő hónapban ugyan ezt a procedúrát megcsinálom. Csak az a baj, hogy akkor már a "scanner munkafüzetbe" nem 100db lesz hanem 500db. Így az előző hónapnál nem 50 darab az eltérésem.
Ja és a helyes adat, amit ki akarsz nyerni, se nem 51800Ft (ez így helytelen), se nem 51800 Ft, ami csak ránézésre helyes, hanem 51800 (szám), pénznemként megformázva. Mert ha kinyerted az általad leírt 51800Ft adatot, azzal megint nem tudsz semmit kezdeni a nyomtatáson kívül (pl. áfát számolni, összeadni...). Ha azt csinálod, amit írtam, akkor a Ft stringek külön oszlopba kerülnek és egyszerűen törölheted őket, a pénzt tartalmazó oszlopok pedig számformátumúak lesznek.
Delila nagyon fürgén ír makrókat kora reggel, de én egy másik, excelesebb megoldást javaslok. Ha vannak más sozlopokban is adatok, azokat húzd odébb vagy 10 oszloppal, hogy legyen helyed, utána az A oszlop kijelölésével válaszd az adatok menüben a szövegből oszlopok parancsot, tagolt, elválasztó karakter szóköz, egymást közvetlenül követő elválasztók egynek számítanak beállításokkal, és hamarosan egy valódi Excel-táblázat birtokosa leszel, amiben végezhetsz műveleteket is. Ez ugyanis egy ömlesztett szövegfile az A oszlopban, amivel az összes többi felmerülő feladatot is csak szörnyen nyakatekert módon fogod tudni megoldani.
A cellád több helyen is tartalmaz számot, azért nem jött össze.
Írtam rá egy függvényt.
Function Ft(Cella As Range) Dim betu As Integer, nev$, ujnev$ nev$ = Cella.Value For betu = Len(nev$) - 3 To 1 Step -1 If IsNumeric(Mid(nev$, betu, 1)) Then ujnev$ = Mid(nev$, betu, 1) & ujnev$ Else Ft = ujnev$ & " Ft" Exit For End If Next End Function
A B1 cellába ezt írd: =Ft(A1), ezt másolhatod az alatta lévő cellákba.
SK adatbázikus munkáról beszélt, a "bázikus" jelző pedig a lúgossal szinonim, a savasnak az ellentéte. Az adatbázikus munka közömbösíti a savas kávét.
A fűnyíróember egy másik fonál, nincs köze a sav-bázis egyensúlyhoz. Ez egy film volt valamikor a 90-es években, asszem Stephen King könyve alapján. A címszereplő **** spoiler **** annyira virtualizálódott a végére, hogy kilépett a testéből, be a számítógépes hálózatba, és ott élt tovább. Ha jól emlékszem.
Szarvashibát követtem el. Többeket (ScreenUpdating, DisplayAlerts) kikapcsoltam, és azzal voltam, hogy ezek között volt az EnableEvents is. Most vettem észre a hiányát, hogy rám olvastad.
K ö s z ö n ö m!
Off: Mikor alszol? Éjjel, és hajnalban is itt vagy. On:
Lehet, hogy a Selection.PasteSpecial Paste:=xlPasteValues helyett van olyan módszere az értékbeillesztésnek, amit nem ismerek, és nem kell a másolat helyére állni előtte?
Arról a bizonyos 11. lapról készítek másolatokat egy ciklusban, ahol szükségszerűen a másolt lap lesz aktív, akkor pedig az első lap hivatalból elé ugrik. Most a másolatok készítese után beírtam, hogy szaladjon vissza az első a helyére.
Eddig irányított beillesztéssel, értékeket illesztettem be az elsőről a 11-n. lapokra, annál rá kellett állni az n-re. Sima másolásnál nem szükséges az n. lapra állás. Ezt végül másképpen, hivatkozásokkal oldottam meg.
A teljes kód külsős rendszeren nem tesztelhető, mert a kód nagy része adatokat importál a vállalatirányítási rendszerünkből. Ha kíváncsiságból mégis szeretnél ránézni, akkor megállítom az aktuális eljárásnak megfelelő formánál és elküldöm a kód más rendszerből is használható részét. (Előtte azért letesztelem, hogy pusztán a kivágott kóddal is megakad-e, vagy csak a teljessel együtt. (Sanszos, mert bizti az aktuális kódban van valami, amitől bugzik.)
De igazából csak jó lenne az a teljes kód, mert így nem nagyon lehet reprodukálni a problémát. Van a topikleírásban egy link, hogy hová lehet pakolni a hosszú kódokat.
Ha ezt bezárom egy eljárásba, akkor azt teszi, amire hivatott. Amint beteszem a programba, onnantól csak az "A" oszlopot hajlandó elrejteni. -.- Gondoltam, hogy lehet, hogy sok az agyának, mert a 800. sor után kerül sorra, addigra lehet befárad az Excel, vagy nem is tudom... Tehát szétszedve + range lecserélve, biztos, ami ziher
2:
Columns("A:A").EntireColumn.Hidden = True
Columns("F:F").EntireColumn.Hidden = True
Columns("L:M").EntireColumn.Hidden = True
Columns("O:S").EntireColumn.Hidden = True
A 2. verzió is csak az "A"-t rejti el a programban futtatva. Sebaj, biztos retardáltra dolgozza magát az Excel, ezért összefolyik neki a parancs, ahogy nekem a betűk a szemem előtt. Íme, a never go full retard elvnek ellentmondó próbálkozás is:
3:
Columns("A:A").EntireColumn.Hidden = True
Cells(1, 2).Select 'fake
Columns("F:F").EntireColumn.Hidden = True
Cells(1, 3).Select 'fake
Columns("L:M").EntireColumn.Hidden = True
Cells(1, 2).Select 'fake
Columns("O:S").EntireColumn.Hidden = True
Persze ez is csak az A-t rejti el. Nem értem, hogy mi van... Egyébként minden próbálkozás az eredményt tekintve kiváló, ha szubrutinként hívom meg... De ez így nagyon nem elegáns. A kódot nem vágnám be, mert hosszú, de oszloptörlések vannak közvetlenül az elrejtés előtt a kódban. Ha ez lenne a baj, akkor sem értem...
Egy idétlen krimi nézése közben eszembe jutott a megoldás, míg a képernyőn gyilkolászott a tettes.
Mikor a napokat tartalmazó lapokon haladtam a ciklussal (11-től az utolsóig), az első lap mindig az aktuális elé furakodott a remek makród mellékhatásaként, felborítva a sorrendet. Ezt sikerült megoldanom: a ciklusba beírtam, hogy szaladjon vissza a helyére.
Úgy értettem, hogy egy olyan riport elkészítése életszerű lehet, ahol az előző évvel együtt folytatólagosan kérik a hetek megszámozását. Ahogy például a hónapokkal is megteszik az annuitásos törlesztőszámításnál. Ott sem 1-12 hónap van, 1-60 hónap pl. az 5 éves hitelnél. Persze hétnél ez nem jellemző, de találkoztam én már mindenféle váratlan dologgal.
Az említett pédához természetesen nem illik, kizárólag azzal példálóztam, hogy mivan, ha mégis... alapon kerüljük már meg, hogy bal() fgv helyett minden eshetőségre egy arra valót használunk, ami szépen megformázza azt a számot (szöveg())
Köszönöm. Mint kiderült, sajnos az én feladatomhoz nem jó.
Van 10+1 lapom. A +1 tartalmazza a hónap első napjának adatait. Agyba-főbe formázott, hétköznap, szombat, vasárnap, és ünnepnap oszlopai különböző háttérszínekkel a megadott dátum szerint.
Egy makró bekéri az évet és hónapot. A 11. lapból annyit másol a füzet végére, ahány nap szükséges az adott hónaphoz, pl. nem szökőévben februárnál 27-et.
A napok lapjai a füzet első lapjáról vesznek adatokat, ezért lett volna jó, ha az mindig az aktuális lap mellett van. Az n-edik lapra állva az első lap az n-1-edik helyre lép. Viszont ha rálépek az elsőre, az előre szalad, és ott vagyok, ahol voltam.
Kihagyhatnám az előre fuss utasítást, marad az első lap az n-1-edik helyen. Akkor meg más hiba lesz. Egy másik makró az elsőről irányított beillesztéssel másol oszlopokat a napok lapjaira. Itt a For lap% = 11 To Worksheets.Count bolondul meg, mert a korpa közé keveredett a disznó.
Olyasmire gondoltam, hogy ha pl. Munka1-en egy képlet munkalapokon átívelő összeadást tartalmaz (pl. lásd itt: http://www.officearticles.com/excel/sum_the_same_cell_in_multiple_microsoft_excel_worksheets.htm), akkor a lapok átrendezése rögtön körkörös hivatkozást fog okozni, ami beláthatatlan következményekkel járhat. Nekem pl. teszteléskor felugrott a körkörös hivatkozás című ablak, és azóta sem tudom bezárni :-)
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Application.EnableEvents = False Application.ScreenUpdating = False If Sh.Name <> "Munka1" Then If Sh.Index > 5 Then ThisWorkbook.Worksheets("Munka1").Move before:=Sh Else ThisWorkbook.Worksheets("Munka1").Move before:=ThisWorkbook.Worksheets(1) End If Sh.Activate End If Application.ScreenUpdating = True Application.EnableEvents = True End Sub
"Persze ha valami miatt fontos a lapok sorrendje, akkor ez a megközelítés nem jó."
Feltételezem, hogy ha fontos is a lapok sorrendje, az nem az adatbevitel közben érdekes. Ezért el tudom képzelni, hogy elegendő a munkafüzetből való kilépéskor helyreállítani:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Ez azt csinalja, hogy minden hét ele berak egy nullat, majd jobbrol (azaz a vegerol visszafele) 2 szamjegyet mutat. Ergo 1-bol 01 lesz es 01 latszik, 12bol 012 lesz de szinten csak 12 latszik.
Megj.: a RIGHT-ot nemtom mi magyarul, majd az okosok megmondjak :)
Azt, hogy a hét száma ne 1 helyértékű legyen (pl.: 1) hanem két helyértékű (pl.: 01), azt hogy lehet elérni? (mert a 2. hét után a 20., a 21....heteket jeleníti meg)
Az megoldás, hogy két külön oszlopba megjelenítem az évet (BAL függvénnyel) majd a hetet (WEEKNUM_ADD függvénnyel) majd egy harmadik oszlopba összefűzöm a két oszlop adatát. Van ennél egyszerűbb?
Szeretnék dátum adatokból grafikont készíteni, ami az elmúlt hetek adatait tartalmazza. A feladatom az, hogy már a tavalyi adatokat (heteket) is meg kell jelenítenem. Hogy lehet dátumból (2012-11-20 vagy 2013-02-10) olyan formátumot készíteni függvénnyel, ami tartalmazza az adott évet és hetet. (pl.: 2012. 47 vagy 2013. 09)
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Application.EnableEvents = False Application.ScreenUpdating = False If Sh.Name <> "Munka1" Then ThisWorkbook.Worksheets("Munka1").Move before:=Sh End If Sh.Activate Application.ScreenUpdating = True Application.EnableEvents = True End Sub
A kód mindig az éppen aktivált lap elé teszi a Munka1 nevű lapot. (Célszerű is a Munka1 fülét átszínezni, és akkor jobban látszik, hogy melyik az.)
Persze ha valami miatt fontos a lapok sorrendje, akkor ez a megközelítés nem jó.
Erre én is kíváncsi voltam, és kipróbáltam. Lehet, hogy valamit félreértek, de nekem nem egészen azt teszi, amit Alta Mira szeretne.
Mivel a szerző nem írja, hogy a makrót hova kell tenni, hát a Workbook SheetActivate funkciójához rendeltem:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Worksheets(1).Activate
End Sub
Ez működik is, csak éppen egy kicsit jobban a kelleténél. Ugyanis bármely munkalapra kattintok, azonnal visszaugrik az első munkalapra. Naná, hiszen azt aktiválja. Csak éppen ezzel nem lehet dolgozni másik munkalapon. És nem is látszik egyszerre két távoli munkalap neve egy képernyőn.
Nem akarom egyszerre látni a két megnyitott munkalapot, csak azt szeretném, hogy az első munkalapfül mindig elérhető legyen.
Végülis eléggé részletkérdésnek tűnik a probléma, mert csak kicsit odébb kell görgetni... de nem magamnak csinálom, hanem a "megrendelő" így kéri. Mondtam, hogy tudtommal nem lehet így beállítani, de elkezdtem gondolkodni rajta, és már érdekel a megoldás. Amúgy érdekes kérdés az is, hogy vajon miért nem lehet ezt egyszerűen beállítani, mint a panelek rögzítésénél (erre miért nem gondoltak a program készítői)?
Az nem lenne megoldás, hogy a 30 munkalapból néhányat elrejtesz, hogy mindig az összes nem elrejtett görgetés nélkül látsszon? Ha ez jó, akkor a VBA ablakban az elrejtendő munkalapok visible tulajdonságát hidden-re kell állítanod.
Az lenne a kérdésem, hogy egy több munkalapos excelben az első munkalap fülecskéje mindig látható legyen?
A probléma az, hogy van egy 30 lapból álló munkafüzetem, az első munkalapon egy összesítő táblázat van. Azt szeretném megoldani, hogy ez az összesítő munkalapfül akkor is látható legyen, amikor mondjuk a 29. munkalapot töltöm ki, hogy oda kattintva meg tudjam nézni az összesítést is, ne kelljen görgetnem a munkalapfüleket az elejére. (Hasonlóan, mint amikor paneleket rögzítek egy munkalapon.)
Remélem van erre megoldás, előre is köszönöm a válaszokat.
A H1 cellába írtam egy számot. Végig lépkedek a D oszlop celláin. Amelyik sorban a H1-nél kisebb szám van, vagy üres a cella, vagy nem számértéket tartalmaz, azt a sort törli. Sortörlésnél az alsó sortól kell indulni felfelé, másképp nem kapsz jó eredményt.
A makróba ***-gal jelölt sorokat írtam, amik nem szükségesek a feladathoz, de megtudod belőlük a hasznos terület címét. Ebből veszem az usor változó értékét.
A D oszlop utolsó sorát így is megkaphatod:
usor = Range("D" & Rows.Count).End(xlUp).Row, ebben az esetben nincs szükség a csillagos sorokra.
Sub mmm()
Dim ter As Range, sor As Integer, usor As Integer
Dim cella As Range
Range("A1").Select '***
Set ter = Selection.CurrentRegion '***
MsgBox ter.Address 'Így tudod meg a területed címét ***
usor = ter.Rows.Count 'A terület utolsó sora
For sor = usor To 1 Step -1
Set cella = Range("D" & sor)
If cella = "" Or cella < Range("H1") Or Not IsNumeric(cella) Then
Nem tudom milyen a tábláid szerkezete, de ha az 1. sorban a mezőnevek, alatta további sorokban az adatok vannak, és más semmi (pl. összegző sor alul stb), akkor a A:D hivatkozással is végezheted az adatbázis műveleteket.
A legegyszerűbb módszer, ami nem igényel magasabb ismereteket ha elnevezed a tartományt. Kijelölöd a kérdéses területet és a szerkesztőléc bal oldalán a név mezőbe beírsz egy nevet mondjuk „alapadatok” Range("A1:E20").Select helyett Range("alapadatok").Select
Azt nem tudom hogy makroba hogy kell integralni, de ha az adathalmazra nyomsz egy "format as table" opciot akkor az ad neki egy nevet (Table1 pl.) amire aztan hivatkozhatsz a makroban.
Visszaolvasva korábbi kérdéseket próbáltam megoldást találni az alábbi problémára, de nem találtam.
A következőről lenne szó. Néhány feladatnál próbálok makró rögzítéssel, majd futtatással gyorsítani a munkámon. Ez több kevesebb sikerrel működik is. Egy olyan számomra VB-ben megoldhatatlannak látszó problémába ütköztem, amiben szeretnék segítséget kérni:
Változó nagyságú adatbázisokon szeretnék bizonyos műveleteket elvégezni, pl törölni. Ehhez valamilyen feltételeknek megfelelő sorokat kellene kijelölni és azt törölni. Viszont ezek a feltételek egy cellában helyezkednek el.
Konkrétan:
Az adatbázis mérete A1:D25, és ebből azokat a sorokat szeretném törölni, amelyikben a D oszlop adatai közül pl. nagyobb mint 100, vagy amelyik pl üres, vagy nem tartalmaz számot stb.
Viszont ha egy hagyományos módon rögzített makróval akarom ezt megoldani, akkor ezt nem érzékeli egy más méretű adatbáziban, csak az eredeti rögzítéskor kijelölt cellákkal hajtja végre a műveletet.
(Nem vagyok otthon VB-ben csak amit saját magam ellestem a makro készítése közben az Excel-től Amit próbáltam: hogy beírok a Range("A1:E20").Select –ben a 20 helyére valami cellahívatkozást, vagy képletet de ez nagy hülyeség…)
A következő makróval tudna boldoggá tenni valaki, nem tudom, mekkora munka ez. (Off. 2007)
A táblázattal azonos könyvtárban levő, fix nevű csv-t (pl. jancsika.csv) nyissa meg, cserélje le benne globálisan a CRLF (CHR(13)CHR(10)) előfordulásokat egy-egy szóközre (a sima LF marad), és mentse el, majd importálja új üres munkafüzetbe a következő paraméterekkel:
tagolt
kódolás UTF-8
tagolójel pontosvessző
szövegjelölő idézőjel
egymást közvetlenül követő szövegjelölők nem számítanak egynek (nincs pipa)
Tud ebbe valaki segíteni?
Az első feléhez nem kéne Excel, de így egy menetben lefutna és nem kéne még egy program (mivel nem én fogom használni).
Alt F11 után beillesztesz egy új modult az Insert/Modul paranccsal, majd ctrl+c ctrl+v -vel bemásolod a makrót.
Utána kijavítod. Ugyanis megfeledkeztem arról, hogy ez a kurva fórummotor elzabrálja a blackslash \ jelet. Tehát a Path után nem "" van, hanem "\". Azaz helyesen a sor:
a = ActiveWorkbook.Path & "\" & "statutso" & b ".xlsm"
Ha akarod, átírhatod még a „statutso”-t filenevet neked valami kedvezőbbre, és persze a dimorphystatmentés makrónevet is.
A makró futtatásakor az ALT F8 listából kiválasztod és Run.
A makró a filet xlsm-be (tehát makróbarátként) menti, tehát nem csak munkalapokat de a makrót is menti. Ez sajnos problémát okozhat, mert a biztonsági beállításaitok nem biztos, hogy engedik megnyitni. Akkor azokat át kell állítani. Vagy ha ezt nagyon nem akarjátok, továbbfejlesztem a makrót, hogy xlsx-ben mentsen.
Köszi szépen! Az irányított beillesztés eszembe nem jutott volna... :)
Erről a makróról tudnál mondani valamit? Semmilyen szinten nem tudok makrózni de ezt a mentés dolgot automatizálnám amennyire csak lehet. Már ha azt csinálja. Mit csinál esetleg hova kell beírnialt(alt+f11?) és hol futattom?
Megcsinálható. Én úgy csinálnám, hogy nem a Munkafüzeteket menteném stabilra , hanem a statfüzetet, pdf-ként, vagy html-ként. Vagy akár xlsx-be is, ha elötte a stat munkafüzet hivatkozásait fixálnám a ctrl+c/irányitott beillesztés/érték paranccsal. Persze nem sima mentéssel mentenék, hanem mentés másként-tel, mondjuk „utsostat” néven. Vagy ami még jobb: utsostat&datum néven.
Ezt viszonylag egyszerűen bebillentyüzheted, de itt egy makró is rá:
Most kértés merült fel bennem hogy meg lehet-e oldani, hogy van egy összesítő táblázatom ami különböző excel file-okból szedik ki az infót a felsővezetésnek.
Kérdésem az hogy meg lehet-e oldani hogy az utolsó infókat "jegyezze meg statikusan"(mintha statisztika.xlsx-be pötyögtem volna be unalmamba) az excel vagy minden Munkafüzetet le kell mentegetnem mindig a hivatkozások miatt pdf-be vagy html-be?
Adok nektek egy jó tanácsot teljesen ingyen! Sose rejtsétek el azt az oszlopot, ahol a szűrő be van kapcsolva, ha látni akarjátok az összes sort! Ááááá....
Tudja valaki, hogy az hol van leírva, hogy a#=2*b% típusú képletben a double adattipusú a# változó értéke nem léphet ki az integerekre megadott intervallumból? És hogy miért van ez?
A kérdésre válaszolva: msgbox csak akkor jön fel ha engedélye van rá. A konkrét fileben egy form jön fel amit a megrendelőnek ki kell tölteni. Semmi másra nincs jogosultsága. A raktári oldal csak két dolgot tehet: elvégezte a műveletet illetve nyomtani akar. A megfeelő helyre pipát tesz. Változtatni a táblázatban egyik sem tud.
Nincs gazdagép. Van egy Excel file a hálózatban ami megosztott. A különböző gépek shortcut-tal kapcsolónak rá. A mikor valaki műveletet kezdeményes akkor egy makró megnézi, hogy milyen jogosultsági csoportba tartozik. Csak azt engedélyezi amit neki elő van írva. Két fő csoport van. Az egyik a raktár, másik az összes többi. Az első indításkor a gépeken feljön egy kérdés: raktár vagy megrendelő vagy. Ez a kérdés többször nem jön fel.
Az hogy viselkedne megosztott munkafüzetnél, ha selection change eseményre írsz egy sima msgbox-ot a változás helyével/tartalmával? Csak a gazdagépen jelenne meg?
Amikor valaki befejezi az adatbevitelt akkor azt egy gombbal lezárja ami elindít egy kb. így kinéző makrót ami 5 perc múlva teljesképernyőre felnyitja a megnevezett gépen a kicsire csukott lapot:
Esetleg vmi segedprogram ami figyeli h az adott file mikor valtozik (timestamp-et/meretet nezi) es sikit ha valtozott? Konkretan nem ismerek ilyet, de biztos van milliofele.
Azt miért nem lehet megcsinálni, hogy a frissitő utasítás egy excel formázási parancsot is küld?
Pl. Feltételesen formázottak a raktári munkalapok, teszem azt ha A1=0 akkor a cellák szine normal, ha A1=1 akkor meg sárga. Ha ezekután a frissitéssel megy az A1=1 parancs is, akkor a munkalapok sárgára váltanak, esetleg valami szöveg is láthatóvá válik, amit aztán a raktáros, miután tudomásul vette a változást, A1=0 -val visszavált.
Egy érdekes és szokatlan probléma megoldásához kérnék segitséget.
Adott egy excel file egy belső hálózatban ami meg van osztva egy vagy több raktári géppel illetve a raktárnak a megrendelést feladó gépekkel. Bárhol történik valami változás az 5 percen belül megjelenik az összes gépnél. Ez rendben működik egy kis hibával. A raktári gépeken szükség lenne valami jelzésre, hogy változás történt azaz megrendelés érkezett. Jó megoldás lenne az automatikus megnyitása a filenek vagy a kicsire csukott excel lap felugrása ezetleg egy pop-up balak automatikus felugrása.
Másképpen mondva azt hívom frissítésnek, amikor egy ikonra kattintással vagy menüpont kiválasztásával vagy billentyűkombinációval bezárás nélkül frissül valami.
Akkor mégiscsak ugyanarról beszélünk. Mert ezeket az excel mind tudja: Office-gomb/Legutóbbi dokumentumok/ 1.számú file megnyitása
E kattokhoz rendelhetsz ikont is, billentyű kombinációt is.
Egyébként szerény véleményem szerint akkor igazán hasznos a frissítés, ha nem csak a frissült állapotot mutatja, hanem magát a frissitést is jelzi. Hasonlatosan a doc-filek korrektura összehasonlításához. Ilyet az excel valóban nem tud. Tudtommal legalábbis.
Alapból jól látod, Excelben nem lehet. Ha jól értem, a Google Docs-hoz hasonlót szeretnél, valaki módosít, a másik pár pillanat múlva már látja magánál a módosítást. A Sharepont 2013 segítségével és új Office verzióval meg lehet majd csinálni.
Köszi, ezeket is tudom. A frissítés célja az, hogy lássam, ha változik valami. Feltettem egy egyszerű kérdést, amire senki nem meri azt mondani, hogy nem lehet, pont, hanem ehelyett mindenféle ekézéseket kapok. Köszi szépen. Lapozzunk.
Milyen célból kellene neked frissíteni? Ha az Excel folyamatosan jelezné, hogy a hálózaton lévő fájlban a felhasználók módosításokat végeznek, az felesleges energia pazarlás lenne. Én biztos gutaütést kapnék, hogy két percenként jönne a figyelmeztetés, hogy valaki módosította az adatokat. Amikor olvasásra kivetted a fájlt, kvázi tudomásul vetted, hogy az akkori állapotot látod. Ha egy óra múlva meg akarod nézni, akkor újra megnyitod. Nem kell bezárnod sem, csak újra rá kell nyitni.
Egy esetben működik egy frissítésnek nevezhető funkció. Ha valaki megnyitja a fájlt, majd ezután te is megnyitod, akkor te már csak olvasásra tudod megnyitni, azonban feldob egy ablakot, amiben felajánlja, hogy értesít, amikor felszabadul a fájl.
„A fájl zárolva van szerkesztésre. Megnyithatja ’Olvasásra’, vagy válassza az ’Értesítés’ gombot, ha az olvasásra való megnyitás mellett értesítést is kér, mikor a dokumentum használatát befejezték.”
Ha másik felhasználó bezárta a fájlt, akkor a következő üzenetet kapod:
„A fájl már elérhető szerkesztésre. Szerkesztéshez válassza az ’Írásra is’ gombot.”
Másképpen mondva azt hívom frissítésnek, amikor egy ikonra kattintással vagy menüpont kiválasztásával vagy billentyűkombinációval bezárás nélkül frissül valami.
Nagyon sok weboldal egyébként még jelzi is, hogy mikor kéne frissíteni! És nem teljes újratöltéssel. Gondolom, AJAX van ezek mögött.
De ne csináljunk már úgy, mintha a piros lámpánál üresbe tenni az autót és a zöldnél egyesbe ugyanaz volna, mint leállítani a motort, kiszállni, bezárni, visszaszállni... A köznyelvi szóhasználat szerint értettem a frissítést, ahogy pl. egy könyvtárlistánál is. A weblap pont rossz példa, mert a weblapok képesek saját magukat frissíteni mindenféle technikákkal még akkor is, maikor nem akarom, de ott se szeretném bezárni a böngészőt vagy azt a fülét, majd újra nyitni egy üres fület, újra beírni az URL-t és újra legörgetni a lap közepéig. Egész egyszerűen nem ezt hívják frissítésnek.
Szóval lényegében azt mondtad, hogy nem lehet frissíteni, csak jó bonyolultan.
Újra betöltés alatt bezárás/megnyitást értesz? Mert az nem frissítés.
Már miért nem? Amikor F5-tel frissítesz egy weblapot, akkor is ez történik, újra megnyitod a weblapot, ami felülírja a régit. Vagy te mit nevezel frissítésnek? Írd meg kérlek, hagy okosodjak.
Újra betöltés alatt érthetem a bezárás/megnyitást is, de a bezárás az excelnél ugyanúgy elhagyható mint a weblapok újra megnyitásánál.
A calculate alatt az F9-t értem. Ha csatolásban vagy a másik fájllal, akkor lehet ezt alkalmazni. De az egyidejűleg megnyitott munkafüzetek között nincs csatolás. Legalábbis E.István 21368 sz. hsz-e alapján ezt szűrtem le. De te is valami ilyesmit írtál, amikor írtad hogy nincs real time kapcsolat a megnyitott munkafüzetek között.
Nem biztos, hogy jól értem a feladatot. De ha arról van szó, hogy megadnak neked egy dátumot, hogy addig összegezd a január 1-től a C-oszlopban levő aktív értékeket, akkor azt javaslom hogy a D10-be írd be a dátumot, majd a D oszlopba D16-tól ezt a képletet:
= HA(A16>$D$10;”inaktiv”;B16)
A szumha függvény összeadását pedig a D oszlop vezérelje.
Amit nem értek, hogy az inaktív napok C értékei hogy-hogy nem nullák.
A következőt szeretném megvalósítani de elakadtam és ebben kérnék egy kis segítséget
Visszamenőleg is kell adatokat szolgáltatnom. Azaz pl ma kérték tőlem április 31-i állapotot.
Eddig úgy oldottam meg, hogy van egy cellám a B10-ben aminek ez a függvénye:
==SZUMHA($B16:$B402;"aktív";$C$16:$C$402)+$D$415
A oszlop a hónap és a nap jelöli. A16 január 1 és A402 december 31
B oszlop egy legördülő lista, hogy aktív vagy inaktív ami napi szinten tudok beállítani
C oszlopban vannak az értékek
A tábla stuktúrája úgy néz ki hogy a január az A16-tól A46-ig tart.
Minden egyes nap mellet ott van az aktív szó így figyelembe veszi a szumha() függvény. Ha a legördülő listából inaktívra teszem pl a január 14-et akkor az az napi értéket a C oszlopból nem adja hozzá az összeshez.
Kérdésem, hogy nem lehet-e ezt hónap szintjén megoldani? Azaz most kérték tőlem az április 31-i állapotot akkor jelenleg május1-től május 29-ig egyesével átbillentgetem inaktívra.
Tehát két dolgot kellene figyelnie. Aktív-e a hónap és Aktív-e a nap. Ha a hónap aktív akkor számolni kezdi kivétel azokat amelyik a tárgyhóban inaktív napra van állítva. De ha inaktív már maga a hónap akkor át is ugorja az összesítést
Megnyitottam Excel 2007-ben egy táblázatot csak olvasásra, tehát más meg írhat bele. Hogy tudok értesülni erről és frissíteni? Létezik az, hogy tele van az egész számítógépem fríssítés parancsokkal, csak az Excelben nincs ilyen?
Sziasztok, egy újabb kérdésem lenne. Szerettem volna, hogy egy userformról a Kilép gomb mellett ESC megnyomásával is ki lehessen lépni. Azt tudom, hogy az Excel nem ismer LastKey típusú lekérdezést, ezért eseményvezérléssel próbálkoztam. A rendszer szépen megengedi, hogy létrehozzam a Userform_KeyUp, meg a _KeyPress funkciókat, de egyikre sem kerül rá a vezérlés. Lehetséges, hogy ezek csak a userformon belüli objektumokon érvényesek?
Tök mindegy, mi van az A1-ben. A képlet az A1 cella sorának számával operál, ez meg független a cella tartalmától. Sőt, lehetne az A1 helyett B1, C1, D1, stb. mindegy, csak 1-re végződjön.
Egy másik megoldás, hogy az eredménycellákba minden faxni nélkül beírod az eredményeket, de a láthatóságukat feltételes formázással szabályzod. Pl ha $a$1="" akkor a fontok szine egyezzen meg a cellaháttér színével (lehet választani a fehérszint is). Ekkor az eredmény csak akkor fog látszódni, ha a1-be beírsz valamit. A cellák írásvédetsége természetesen itt is megfontolandó.
Állj! Lehet, hogy bénázok, de úgy látom, hogy a feltételes formázás az adott cella értékétől teszi függővé annak formátumát. Tehát ha pl. a szám pozitív, akkor piros, egyébként meg fekete.
Én azonban azt szeretném, hogy egy "kapcsolóként" használt cella tartalmazza meg néhány másik cella formátumát. Tehát ha A1-be beírok 1-et, akkor a B oszlop színe fehér, egyébként fekete. A feltételes formázásnál ilyet nem találtam, (de ez nem jelent semmit :-)
Function adatfilenyit(filenév As String) As Boolean Application.DisplayAlerts = False If Dir(filenév) = "" Then ' Ha a file nincs meg a kívánt helyen MsgBox "A programfutás feltétele a " + filenév + " file megléte. Kérem pótolni!" Else While adatfilenyit = False On Error GoTo nincsjelszo Workbooks.Open Filename:=filenév adatfilenyit = True ' Ekkor jó a megnyitás ujra: Wend End If Application.DisplayAlerts = True Exit Function nincsjelszo: If Err > 0 Then If Left(Err.Description, 27) = "A beírt jelszó érvénytelen." Then MsgBox "Hibás jelszó. Kérem javítani!" Err.Clear 'Hibajelzés (szám és szöveg) törlése Resume ujra Else MsgBox "Hibaüzenet: " & Err.Description ' Ez egy tesztsor, ami megkülönbözteti a rendszer automatikus hibaüzeneteitől End If End If Application.DisplayAlerts = True End Function
Ha az adataid szabályos rendben, mindig 15 percenként követik egymást, összefüggő tartományt alkotnak, nincs foghíj, nincs más szabálytalanság, akkor ez itt egy lehetséges megoldás:
=SZUM(OFSZET($B$1;(SOR(A1)-1)*4;0;4;1))
A $B$1 az a cella, ahol az összeadandó adatok közül a legelső található. Ezt a hivatkozást cseréld ki arra, ami nálad van. Az A1 hivatkozást ne módosítsd.
Van egy kb. 40 000 sorból álló adathalmaz, negyedórás időpontonkban, 2 éves időttartamra.
Szeretném az adatokat óránként összesíteni, úgy, hogy a legelső cellába beírt képletet a cella jobbsarkában megjelenő kijelölővel lehúzom az adatoszlop végéig. Így elméletileg kb. 10 000 adatot kapnék.
Agyon törtem a fejem szumha és szumhatöbb fv.-kel, de nem jött össze! :(
Segítséget kérek a jelszavas védelem használatához. Két jelszó van, az olvasásra és az írásra is jogosító. A másodszorra bekért (írásra jogosító) jelszó rendben működik. Korlátlanul engedi a rendszer a próbálkozásokat. Viszont az elsővel, ami még csak olvasni enged, nekem nem jön össze ugyanez. A következőket tapasztalom:
Ha nem programból nyitom a védett adatállományt, akkor a jelszó első elütésekor hibaüzenetet küld „A beírt jelszó érvénytelen…..”, és kilép a megnyitásból. Programból nyitva ellenőrzés, azaz On Error GoTo … parancs nélkül: figyelmen kívül hagyja az üzenetek tiltását (DisplayAlerts), kiírja, hogy „Application-defined or object-defined error”, és szintén leáll. De ez nem baj, mert programból szeretném kezelni a hibás jelszót a következő részlettel:
Function adatfilenyit(filenév As String) As Boolean
Application.DisplayAlerts = False
ujra:
adatfilenyit = False
If Dir(filenév) = "" Then ' Ha a file nincs meg a kívánt helyen
MsgBox "A programfutás feltétele a " + filenév + " file megléte. Kérem pótolni!"
Else
On Error GoTo nincsjelszo
Workbooks.Open Filename:=filenév
adatfilenyit = True ' Ekkor jó a megnyitás
nincsjelszo:
If Err > 0 Then
If Left(Err.Description, 27) = "A beírt jelszó érvénytelen." Then
MsgBox "Hibás jelszó. Kérem javítani!"
Err.Clear 'Hibajelzés (szám és szöveg) törlése
GoTo ujra
Else
MsgBox "Hibaüzenet: " & Err.Description ' Ez egy tesztsor, ami megkülönbözteti a rendszer automatikus hibaüzeneteitől
End If
End If
End If
Application.DisplayAlerts = True
End Function
A „nincsjelszo:” címke után 1 alkalommal működik a részlet, azaz kiírja, hogy hibás a jelszó, és visszaugrik az „ujra:” címkére. De ha másodszor is hibás jelszót adok meg, akkor már figyelmen kívül hagyja az üzenetek tiltását, kiírja, hogy „Application-defined or object-defined error”, és szintén leáll. Hiába próbálom az Err.Clear paranccsal törölni a hibát, nem veszi figyelembe. Van megoldás arra, hogy többször is újra próbálkozhasson a felhasználó? Attól nem félek, hogy a kis/nagybetűket és számokat tartalmazó kódra véletlenül rátalál, ezért nem szeretném korlátozni benne. Másrészt meg nagyon nem elegáns, ha rendszer által generált hibaüzenettel áll le a program.
És még valamit. Meg tudja valaki mondani, hogy angol nyelvű office használatakor mi a hibaüzenet (Err.Description) szövege a jelszó érvénytelensége esetén?
Bocs a kései válaszért, mostanában ritkán vagyok internetközelben: Szóval én nem munkafüzet megosztásra akarom használni a jelszót, hanem jogosultságok beállítására. Van, akinek csak betekintési joga lesz, van, akinek írási joga is lesz, másoknak meg semmi.
Lehet más triggerhez kötni, pl. gombnyomás, munkalap váltás, duplakatt egy bizonyos cellára, vagy billentyűkombináció, stb. Akkor nem fut le olyan gyakran, csak amikor akarod.
A Visual Basic Editor bal felső paneljában (Project - VBAProject feliratú ablak) keesd meg a ThisWorkbook objektumot, kattints rá duplán, és a jobbra megnyíló kódlapra másold be a kódot. És ha akarod, részletesen elmondom, mi hogyan van benne.
Sendkeys és Volatile - mindkettő az Excel sokat szidott képességei közé tartozik. Azt gondolom, gyerek kezébe nem adunk töltött puskát, szóval én ezt a megoldást nem támogatom, bocsi. Talán valaki más.
Az F2 + ENTER valóban frissíti a lap összes függvényét, feltéve ha önmagában áll a függvény. Az Application.Volatile már akkor is frissíti, ha további műveletet végzek a függvénnyel, pl. egy szorzó van a függvény mellett.
Most már csak az F2 + ENTERT kellene összehoznom egy OnChange függvénnyel. Ebben kérnék még egy kis segítséget. Sajnos VBA-ben nem nagyon vagyok otthon.
Igen, tudom. De ez max nehany fullel mukodik. Ha azok szama valtozik, akkor mindig frissiteni kell a kepletet. Aztan tobb tucat, szaz fullel (ceges kornyezetben ez siman elofordul) szinte lehetetlen karbantartani egy ilyen kepletet, meg ugye eleganciaja is 0 fele konvergal :)
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim rng As Range, c As Range, cParent As Range Dim PreviousValue As Variant Application.EnableEvents = False Set rng = Sh.Cells.SpecialCells(xlCellTypeFormulas) For Each c In rng.Cells If InStr(c.Formula, "szinesdarabteli") > 0 Then Set cParent = c.DirectPrecedents.Cells(1) PreviousValue = cParent.Value cParent.Value = "asdrcfgh" cParent.Value = PreviousValue End If Next Application.EnableEvents = True End Sub
Úgy működik, hogy a
Function szinesdarabteli(tartomany As Range, szinesertek As Integer)
definícióban a tartomany nevű tartomány első cellájának értékét megváltoztatja, és ezzel kikényszeríti az Excelben a képlet újraszámolását. Aztán visszaírja az eredeti értéket. (Amivel újra kikényszeríti a képlet kiszámolását, de ezt nem lehet elkerülni.)
Elvileg új cella kijelölésére indul, és a fenti módszerrel sorban frissíti az aktuális munkalapon az összes szinesdarabteli függvényt tartalmazó képletet.
(Valamilyen eseményhez kötni kellett, és ez a leggyakoribb. A cellaszín változása önmagában nem indít semmilyen folyamatot.)
Mivel a kód az összes cellakijelölés-változáskor lefut, ha sok ilyen szinesdarabteli képleted van, akkor előfordulhat némi lassulás, nem teszteltem ki.
Az a gond, hogy egy lapon nagyon sokszor használom a függvényt. Ráadásul havonta újraszíneződik a lap, és a sorok, így a függvények száma is változhat.
Az első újra beírja függvényt. Tegyük fel a függvényed az a1-ben van:
Range(“a1”).formula =”képlet”
A képletet úgy tudod a legkönnyebben vba kompatibilisen megkreálni, hogy ráállsz a képletet már tartalmazó celládra, majd elinditod a makrórögzítőt az F2 Enter lépések rögzitésére.
A Application.Volatile nem csinál semmit, nem is lassul az Excell (2007), de nem is frissít a függvény.
Nyomógomb vagy billentyűparancsra én is gondoltam, de több lapon több sorban alkalmazva van a függvény. Tudok olyan parancsot adni, amivel a függvény összes előfordulását frissíti?
Ez nem jó, mert nem két fül van, hanem 4-7 között változó (alapból 4, de ha bejön egy ideiglenes dolgozó kampányra, akkor másolunk neki egyet). És ha módosítani kell rajta, mindegyik tagot módosítani kéne.
A másikat majd kiptóbálom a jövő héten, köszi! Bár nem hangzik egyszerűen, de egy próbát megér.
Na de olyat mutass, ahol az összegzendő adatok vannak több munkalapon! Pl. az Összeg fül A2 cellájában levő értéket keresem a Munka1:Munka5!S:S oszlopokban, és a mellette a T oszlopban talált értékeket adja össze az Összeg!B2-ben.
Van egy VB függvényem, melyel lekérdezem egy tartomány cella-háttérszíneit. Pontosabban megszámoltatom, hogy egy bizonyos színből hány darab van. A függvény dolgozik szépen, csak nem frissül, ha utólag módosítom a színeket. Csak akkor számol újra, ha újra beírom, vagy módosítom a lekérdezést.
Ez valami beállítási probléma, vagy egyszerűen így működik a VB? Válaszaitokat előre is köszönöm.
A "Munkalap1" és a "Munkalap2" munkalapok tartalmazzák az adatokat és a "Statisztika" munkalapra kellene az értékesítők szerint a szerződéseket összesítenem. (Vagy a székhely szerint)
A munkalapokon azonos felépítésű adatok vannak és nem másolnám össze az adatokat, hogy egy munkalapon legyen az összes adat és azon dolgozzam, hanem több munkalapra terjeszte(né)m ki a függvénnyel történő keresést.
Ez a kérdésem...:-))
Tehát például van 3 munkalapom, ahol mindhárom munkalapon vannak azonos nevek is, azokhoz tartozó számszerű összegek és azoknak a neveknek és összegeknek a szummáját szeretném megjeleníteni egy 4. munkalapon (ahol ebből az összesítésből grafikot is rajzolnék)
Tehát azonos szerkezet mindhárom munkalapon és azokat kell összegeznem a feltételeknek megfelelően.
Ja. Most már emléxem. Arról volt szó, hogy táblázatként való formázáskor az új sorok megkezdésével automatikusan kitölti a sor többi celláját. Egyébként én sem szoktam használni, ezért is nem értettem a megosztásnál irottakat.
A kezdőlap->Formázás táblázatként menüvel létrehozott, formázott táblázat a táblázat, a többi meg mondjuk"sima excel"
Kb egy éve mondták nekem, hogy ez a táblázatként formázás egyben azt is jelenti, hogy lemondasz pár excel alap szolgáltatásról, funkcióról. Például a közös használatról. Hogy még miről azt már nem tudom. Pár hete kerestem a neten, amikor itt a fórumon szóba kerültek ezek a táblázatok, de rövid keresés után nem találtam erről leírást, hosszabb nyomozásra meg nem volt kedvem, így inkább nem használom ezeket a táblázat formázásokat.
Kösz a kimerítő választ. A leírtakból számomra az derül ki, hogy az excel elég jól megoldja a közös használat miatti esetleges problémákat. Többek közt azokat is, amelyek miatt a kérdésem feltettem.
A cellánkénti jelszavas védelemről nem tudtam. Kösz. Persze nem fogom használni, mert amikor kéne, valszeg halvány fogalmam sem lesz, hogy hova is jegyeztem fel őket :))).
A témával kapcsolatban lenne még egy kérdésem. Közben én is ráakadtam a Korrektura menülapra, ahol a Munkafüzet megosztása menüpontra rámutatva a felugró ablak többek közt ezt is írja: "A táblázatokat tartalmazó munkafüzet nem osztható meg." Ez alatt mit ért? Milyen munkafüzet nem osztható meg? Mivel én táblázatot nem tartalmazó excel füzetetet azt hiszem még sosem láttam.
Annál sokkal egyszerűbb a megoldás minthogy képlettel formázzam.
A megoldás az volt (E.Istvannak köszönhetően), hogy ha nem egymáshoz akarjuk az értékeket vizsgálni akkor a tipusnál számot kell megadni (legyen az tényleg szám vagy akár % érték)
Ha egymáshoz akarjuk hasonlítani őket akkor kell % ot beállítani.
Most, hogy belegondolok a tipusnál nem is a cellaérték tipusra vonatkozik a kérdés hanem a vizsgálat módjára. (ezt lehetne egyértelműbbé tenni az ablakban)
Bizonyosan képlettel is megoldható a kérdés, de így fényévekkel gyorsabb :)
Azt nem tudom, hogy mik azok a jelzések a celláidban, de az általad kívánt beállitást szerintem nem azon beállítási panelen kell csinálni, amit a képed mutat, hanem azon még rákattintva a „formázandó cellák kijelölése képlettel”-re. Itt beírhatod a első feltételed. Ha mondjuk az A10 cella tartalma alapján akarod formázni a B10 cellát (vagy akármelyiket, akár magát az A10-t is), akkor pl. =a10>=1 és kijelölöd a pirost. A leokézása után egy újabb panel jelenik meg, ezen visszaigazolja a piros beállításodat, továbbá felajánlja további formázási szabályok felvételét. Kérsz egyet, és beírod hogy =a10<1 és kijelölöd neki a sárgát.
A formázási szabályaidat aztán az excel automatikusan érvényesíti az összes kijelölt cellán.
A százalék típusra a súgó ezt írja. Nem teljesen értem, de mintha egymáshoz képest vizsgálná a cellákat.
Az érvényes értékek tartománya 0 (nulla) és 100 között van. Ne írjon be százalékjelet (%).
Akkor használjon százalékértéket, ha minden értéket egymáshoz arányítva kíván megjeleníteni, mert a százalékérték alkalmazásakor az értékek eloszlása egymással arányos.
Nem rossz dolog ez a közös használat, de nem vesztettél sokat, ha eddig nem használtad. Én is igyekszem kerülni. Munka közben nincs külön szinkronizálás, csak mentéskor. Tehát amikor az egyik felhasználó ment, akkor visszafelé ki is olvassa a megnyitás óta, vagy az utolsó mentés óta történt változásokat. Ütközés esetén, amikor mind a két felhasználó ugyan azt a cellát írta, azt hiszem a másodikként mentő felhasználónak ajánlja fel, hogy akkor maradjon az első felhasználó értéke, vagy írja felül az ő értékével a cellát.
A közös használatú munkafüzetnek, van egy másik is problémája, ami nincs rendesen kezelve ill. kommunikálva. Ez főleg akkor jelentkezhet gyakrabban, ha nagyobb méretű a fájl, tehát hosszabb ideig tart a megnyitás, mentés.
Hiába van minden felhasználónak írási joga, ha az egyik felhasználó éppen megnyitja vagy menti a fájlt, akkor a művelet időtartama alatt a másik felhasználónál aki meg pont meg akarja nyitni kiírja, hogy a fájlt egy másik felhasználó használja, és csak olvasásra lehetséges a megnyitás. Ekkor a tudatlan felhasználó megnyitja csak olvasásra, ahelyett, hogy kb 1-2 sec múlva újra megpróbálná a megnyitást. Majd munka végeztével rányom a mentésre. Természetesen az Excel figyelmeztet, hogy csak olvasásra lett megnyitva, de mentés másként-tal simán rá tud menteni a közös használatú fájlra, ezáltal kitörölve a megnyitás óta mások által végzett módosításokat.
Vagy normál megnyitás utáni mentéskor, mialatt más már éppen ment szintén kiírja, hogy másik felhasználó használja a fájlt. Ekkor meg a kedves felhasználó lementi más néven a saját állományát, ezáltal meg az ő módosításai nem kerülnek be a közös táblázatba, viszont a hálózaton meg már rögtön két fájl lesz.
Ha érdekel a téma, akkor viszont van egy nagyon jól használható része is. Ez akár közös használatú fájlban, akár normál fájlban használható, ha hálózatos környezetben dolgoztok. Régi excelben valahol a védelmeknél van, 2007-től pedig a korrektúra->Tartományok szerkesztésének engedélyezése.
Ezzel meg lehet oldani azt, hogy egy excelen belül különböző celláknak vagy tartományoknak külön-külön jelszót adsz és az a cella csak azzal a jelszóval írható. Illetve ezekhez a cellákhoz, tartományokhoz konkrét felhasználókat is rendelhetsz, akiktől nem fogja kérni a jelszót. Így minden felhasználó megnyitja a fájlt és látszólag gond nélkül és külön jelszó nélkül tudja felvinni a saját adatait, viszont a másikéba nem tud beleírni csak jelszóval.
Egy kisebb hátrány/előny, hogy ezeket a jelszavakat csak te tudod módosítani a felhasználók nem.
Azt szeretném megkérdezni, hogy van-e olyan countif analóg vba függvény ami a vba tömbökben számolja meg bizonyos értékek előfordulását, vagy csinálnom kell a megszámolásukra egy ciklust? Úgy tűnik ugyanis, mintha a countif csak a munkalapokon müködne.
A hogyan látja B munkáját, ha már rámentette a sajátját? Vagy van egy A mentés meg egy B mentés majd valami szinkronizalas? Van erre valami kész szoft?Mert elég komplikálnak tűnik.
Nem lesz real-time. Nálunk minden felhasználónak saját füle van (kettő a fején, egy a munkafüzetben). Ha B elmenti, majd A is elmenti, akkor van a változás, mert A-nak fényeskedik egy felirat, hogy a munkafüzet más felhasználók módosításaivel lett elmentve, és akkor látja B munkáját. Azt még nem próbáltam, mi lesz, ha ugyanazt a cellát akarják szerkeszteni. :-)
Szia! Én még sosem dolgoztam megosztott munkafüzettel, és előreláthatólag nem is fogok. De érdekel, hogy hogyan is működik. Teszem azt, ha egyidejüleg te is, meg én is megnyitjuk ugyanazt a megosztott filet, és mindkettőnknek jogosultsága van belepiszkálni, akkor real time-ban látjuk-e egymás változtatásait? Tehát csatolással kerül a gépeinkre a munkafüzet vagy bemásolással?
Szeretnék jelszóval védeni egy Excel adatállományt külön betekintési és külön módosítási jelszóval. Az adatokat egy tőle független program kezeli. Addig rendben is van, hogy amikor a program megnyitja az adatállományt, akkor kéri a kétféle jelszót. És ha betekintésit tudom, de a módosításit nem, akkor olvasásra nyitja meg. És itt adódik egy kis gondom. Az adatfelvivő programrészre enged a program ráfutni, és csak a mentéskor zaklatja a felhasználót rendszerüzenettel.
Ezt szeretném elkerülni, és figyelmeztetés után megakadályozni, hogy egyáltalán próbálkozzon a módosítással, aki erre nem jogosult. Ehhez ki kellene tudnom olvasni a programmal, hogy csak olvasásra van megnyitva az adatállomány. De sajnos nem találom a megoldást. Tudtok segíteni?
Kiváncsiságból megszámoltam, hogy pontosan hány karaktert képes a 2003-as excel egy cellában megjeleníteni. És a legnagyobb megdöbbenésemre nem kb. 1100-t mint írtam, hanem PONT 1100-t. Vajon miért?
Megnéztem a problémádat. És azt tapasztaltam, hogy a 2003-as excel cellái 32.767 karaktert képesek tárolni, de abból csak kb 1100-t képesek direktben megjeleníteni. Ezek is olvashatók azonban a szeresztőlécen, tehát ha ráállsz az adott cellára. Ha ez nem elég kezes, akkor lehet csinálni például azt, hogy a szomszédos oszlopban ezzel a képlettel teszed láthatóvá az A oszlopban nem mutatott szöveget: =ha(hossz($a1)>1100;közep($a1;1100;1100);"").
Azért köszönöm mindkettőtöknek a próbálkozást. Akkor marad a fapados megoldás. Még szerencse, hogy a formon elhelyezett objektumokra lehet változónévvel hivatkozni, így a mintegy tízféle comboboxomat, és ugyanennyi textboxomat egy-egy függvénnyel tudom előkészíteni inicializáláskor, és tesztelni az adatbeíráskor. Ez tényleg kellemetlen lett volna fapadosan egyenként megírni.
Örültem a hsz-dnek, mert megint tanultam valamit. Ami frankón működik is, már ami formok megszámolást illeti. De a behívással még problémák vannak. Mert nem feltétlenül azt a formot hívja, amelyikre a hivatkozás történt. És bár az első pillanatban erre nekem is lett volna magyarázatom, ami azonban nem bizonyult százasnak, mert a következő futtatásnál ugyanazzal a beállítással a következő userformot adta, és így tovább. Tehát a useforms(a).show beállítással végiglépkedett a létesített formokon. Ha végére ért kezdte előlről. Amig ki nem derül, hogy ez hogy is van, addig okosabb ha pimre marad a fapados megoldásánál.
Én is próbálkoztam tegnap, ugyanerre jutottam. Azért tapasztaljuk ezt, mert a Useforms.Count azokat a formokat számolja, amelyek létre vannak hozva objektumként. Az, amit szépen összerakunk textboxokból meg commandbuttonokból, az még csak az objektumosztály, de annak egy példányát futás közben létre kell hozni ahhoz, hogy ténylegesen legyen megszámolható Userform az Application-ban.
Szóval kellene ide minimum egy Load utasítás:
Sub teszt() Load UserForm1 Load UserForm2
MsgBox UserForms.Count End Sub
A fenti makró futásának eredménye: 2
Ezt ugye fel lehetne használni pimre projektjében is, csak kérdés, hogy egyszerűbb lenne-e, mint a fapados megoldás, amit ő maga kitalált. Merthogy itt a UserForms gyűjtemény tagjaira csak sorszámmal lehet hivatkozni (pl. UserForms(1)), a névvel hivatkozás (pl. UserForms("UserForm1")) hibát okoz.
Csináltam néhány userformot, mivel úgy gondoltam, hogy ezek automatikusan bekerülnek a userforms gyüjteménybe, amelynek tagjaira aztán indexelve lehet majd hivatkozni. De nem kerültek be. Amit az is mutat, hogy a userforms.count=0. Így sajnos nem tudtam segíteni, de azért megírtam, hátha valakinek egészen nyilvánvaló, hogy hol hibádzik a megoldáskísérletem és korrigálja.
A regényeket érdemes inkább szövegfájlba pötyögni, mert a fórumszoftver rendszeresen eljátssza, hogy ha túl hosszúra nyúlik a beírási idő, akkor egyszerűen szó nélkül elnyeli a szöveget. Szoktak itt (nem pont az Excel topikban, hanem fórumszerte) jóféle anyázások lenni emiatt.
Bocs, ne haragudj a félreértésért, de én nem szoktam fórumos dolgokat e-mailben intézni, csak nagyon indokolt esetben, és nem akartam azt a látszatot kelteni, hogy én vállalom magamra a problémád megoldását. Csak jeleztem, hogy ilyen hiányos kérdésfeltevéssel más se nagyon fog tudni segíteni. Ha látjuk, mi a feladat, valaki válaszol, akinek éppen affinitása és ideje van hozzá. A képet felteheted pl. kepfeltoltes.hu-ra, ahonnan be lehet linkelni ide.
Elég hosszú a dolog és küldenék egy képet is vagy táblázatot, de ide nem sikerült felrakni. Bepötyögtem egy r egényt és úgy tűnik elszált. Tudsz adni egy email címet???
És máris egy újabb gondom adódott. Egy adott ponton választanom kell, hogy melyik Userformot hívja meg a program. A meghívandó form nevét át tudom adni a behívó részletnek, csak éppen a nevet nem tudom változóba tenni, hogy ezzel nyisson. Tehát mondjuk az "aaaa", vagy "bbbb" nevű formot kell megnyitni. Próbáltam ezt egy string változóba tenni, formneve néven, de a formneve.show nem működik. Próbáltam a string helyett objectnek, vagy userformnak létrehozni a változót, de azt sem fogadja el a program. Van erre elegáns megoldás?
Köszönöm. A kapcsolót megcsináltam, sőt időközben tovább is fejlesztettem. Tekintettel arra, hogy az EnableEvents nem működik a formokon, létrehoztam AllowEvents néven egy public kapcsolót, amely inicializálás közben False, majd a befejezéskor True-ra vált, és valamennyi esemény ennek a vizsgálatával kezdődik. Ha viszont az eseménybe be enged lépni, akkor a jelző False-ra vált, majd a végén vissza True-ra:
Private Sub TextBox1_Change() If AllowEvents Then Exit Sub
AllowEvents = False 'esemény tesztelés AllowEvents = True End Sub
A SetFocus beállítást megnéztem mégegyszer, és igazad van, tökéletesen működik. Nem tudom, mi lehetett a baj tegnap. Mindenesetre ezzel ki tudom írtani az összes sendkeys-t.
Ha az egyes vezérlők Change eseményéhez makrót kötsz, akkor érdemes mindegyikbe beépíteni azt kapcsolót, miszerint az űrlap inicializálásakor ne fussanak le az eseménykezelők. Valami ilyesmire gondolok:
Dim FormInit As Boolean
Private Sub UserForm_Initialize() FormInit = True 'vezérlők feltöltése adatokkal FormInit = False End Sub
Private Sub TextBox1_Change() If FormInit = True Then Exit Sub 'eseményvezérlő End Sub
Private Sub TextBox2_Change() If FormInit = True Then Exit Sub 'eseményvezérlő End Sub
Ami a másik dolgot illeti, csináltam egy űrlapot 2 textbox-szal, és az alábbi kóddal:
Private Sub TextBox1_Change() If Len(TextBox1) = 4 Then TextBox2.SetFocus End Sub
Minden további nélkül átlépett Textbox2-be, amikor a szöveg hosszúsága elérte a 4 karaktert.
Igen, megvan. Amin ennyit dolgoztam, azt nem szoktam eldobni.
A sendkeys-t olyan billentyűnyomkodásokra használom, ahol szándékosan léptetni akarok. Például ha beírta a felhasználó az irányítószám, vagy egy évszám 4. karakterét, akkor a Change funkcióban (annak ellenőrzése után, hogy valóban számot írt be) a program kiküld egy TAB-ot, hogy automatikusan lépjen a következő dobozba. Csak arról feledkeztem el, hogy a Change működik az inicializálásnál is, amikor feltöltöm a boxot, csak ott nincs módja érvényre jutni az elküldött karakternek, és ez okozott meglepetéseket az inicializálás után. Azóta jelzővel megoldottam, hogy adatfeltöltéskor ne legyenek kiküldve a sendkeys karakterek. Mellesleg azóta próbáltam sendkeys helyett setfocust használni, de nem sikerült. Egy box Change funkcióján belül nekem nem jött össze a másik boxra való setfocus hivatkozás.
Viszont, ha a billentyűzetpuffer törlése excel szinten nem oldható meg, akkor inkább lemondok róla, hiszen a program nem a saját gépemen fog működni.
Remélem, azért megvan még az a másfél órás leírás. Szükség lehet rá egy-egy későbbi kérdésedhez. A mostanihoz is jó lett volna, mert megint az a helyzet állt elő, hogy a válasz: "attól függ..."
A Sendkeys olyan, mintha a billentyűzetet nyomkodnád. Ha pl. szövegdobozba küldesz be karaktert, az onnan nyilvánvalóan törölhető. Ha valamiféle parancsokat küldesz be, mint mondjuk egy ENTER, amikor a fókusz egy Commandbutton-on van, és erre végrehajtódik a gombhoz rendelt kód, azt nyilván nem lehet visszavonni.
Esetleg lehetne törölni azokat gombnyomásokat, amelyeket az oprendszer - sűrű elfoglaltságai miatt - még nem olvasott ki a billentyűzetpufferből, de ez már nem Excel szint.
A hiba természetesen az én készülékemben volt. A SetFocus ártatlan, jól működik:-) Jó másfél órás munkával leírtam, hogy mit csinálok, aztán elküldés előtt átgondoltam még egyszer, és rájöttem a hiba okára. Sajnos bizonyos helyzetekben nem tudok jobb megoldást, mint Sendkeys-t használni (hiába tudom, hogy nem célszerű), aztán ezek ott is dolgoztak, ahol nem számítottam rá. Így egyenként kellett kipucolnom őket.
De ha már, akkor megkérdezem, létezik parancs az így elküldött karakterek törlésére? Hiába kerestem, egyelőre nem találtam.
Hogyha a Ctrl+End lentebbre/jobbra ugrik, mint hogy szeretnéd, akkor válaszd ki és töröld azokat a sorokat/oszlopokat, amik attól lejjebb/jobbra vannak, mint az a cella, ahova szerinted ugrania kéne a Ctrl+End-nek. Elméletileg ez megoldja.
Sub uj() Dim wb As Workbook, i As Long, Siker As Boolean
Set wb = Workbooks.Open("D:\Jóskapista.xls") Do Siker = True On Error GoTo NemMegyAMentés If i = 0 Then wb.SaveAs "D:\Pista " & Format(Date, "mm.dd") & ".xls" Else wb.SaveAs "D:\Pista " & Format(Date, "mm.dd") & "-" & i & ".xls" End If i = i + 1 Loop Until Siker = True Exit Sub
NemMegyAMentés: Siker = False Resume Next End Sub
Amúgy alapvetően annyi a művelet, hogy megnyitod a sablont, aztán elmented új néven. Ez összesen két sor kód lenne. Jelen esetben azonben addig kell próbálkozni futó sorszámmal és új neven mentéssel, amíg nem sikerül, és ezért van a kód kicsit megbonyolítva. Egyébként nem próbáltam, mert körülményes lenne teszkörnyezetet létrehozni, szóval nem biztos, hogy jól fog működni. De remélem.
Köszönöm, sikerült! Ez viszont meglepett: "A csatolások megkeresésére nincs automatikus módszer"
A másik, ami fejtörést okoz, hogy gyakran beragad a file valakinél. Most is azt írja ki a gép, hogy meg van nyitva a táblázat egy kollégánál, aki egy órája hazament, és ki van kapcsolva a gépe.
Nem tudom, ki mit kreatívkodott a megosztott munkafüzetremmel, mert többen használják, de megnyitáskor egyszerre csak megjelent egy üzenet, amit sose láttam, hogy a munkafüzet csatolásokat tartalmaz egy másikra.
Honnan tudnám kideríteni, hogy pontosan melyik munkalapon és melyik cellában vannak a csatolások? Mert ezt valahogy nem mutatja ez a kedves kis ablak.
Szerintem egyszerübb ha a cellaegyesítés megszüntetésére is, meg a létesítésére is lekattogtatsz egy makrót, amiket aztán a problémás rutinok elé-után beiktatsz.
Oké, oké. Meghajlok bölcs érveid előtt. Majd szólj rám, ha pongyolán fogalmazok :)
Viszont gyakorlati szempontból ("hogy magyarázzuk el az idelátogatóknak" c. kérdés) nincs sok jelentőssége. Aki ismeri és érti az adatbázis általad preferált definícióját, annak nem kell magyarázni. Aki nem ismeri v. nem érti, annak csak azt lehet mondani, hogy "most" kell átváltani Accessre, és "azért, mert jobb lesz így, hidd el" :)
Tágabb értelemben autóút minden útfelület, ahol autók közlekednek, a makadámúttól az autópályáig. De egy szakmai fórumon mégis illik pontosan használni a fogalmakat... A szakkifejezések jelentését nem lehet etimológiailag megközelíteni.
Persze különböző szigorúságú definíciók léteznek, és az én egyetemi adatbázistanárom még a dBase típusú rendszereket és az Accesst is filekezelő rendszereklnek mondta, mert nem elégítik ki az adatbázis-kezelőkkel szemben támaszott legszigorúbb követelményeket. A dBase esetében ez abszolút érthető számomra is.
Egy szakmai fórumon szerintem alapnak kéne tekinteni, hogy egy adatbázis legalább első normálformába rendezett táblákból áll, és tartalmaz a saját szerkezetére vonatkozó információkat. Még akkor elég sok mindentől eltekintettünk. :-) A riport az már más dolog, azzal tényleg lehet szabadabban bánni. De ha összemossuk az alapvető különbségeket, akkor hogy magyarázzuk el az idelátogatóknak, hogy mikor és miért érdemesebb átváltani pl. Accessre?
a képen látható DREAM TEAM'98 FC szövegnek nem tudja valaki így ránézésre,hogy mi lehet a font típus neve? régebbi excelben volt,de nem emlékszem már rá, most meg kellene...előre is köszönöm :-)
Igen, emlékszem, hogy valaki a törzsvendégek közültöbbször szóvátette a különbséget, de arra nem, hogy ki volt.
Alapjában véve egyetértek, ugyanakkor szerintem tágabb értelemben minden adatbázis, amiből adatokat vesznek ki feldolgozás céljából. Csak gondold végig, mit jelent maga a szó.
Hasonlóképpen, minden végeredmény riport, ami a feldolgozás eredményeképp születik.
De értem, ha Te nem ebben az értelemben használod.
Nem hiszem, úgy elég nyakatekert lenne, csak egy sima sablonra gondoltam, a kód abban a munkafüzetben van, ahol a tényleges adatok (azt használjuk, onnan indítjuk az akciót).
For l = 3 To 13 Step 2 'Range(Cells(sor + 1, l), Cells(sor + 1, l + 1)).MergeCells = True ' Megosztott munkafüzetben nem működik. Range(Cells(sor + 1, l), Cells(sor + 1, l + 1)).HorizontalAlignment = xlCenterAcrossSelection Cells(sor + 1, l).HorizontalAlignment = xlCenter Cells(sor + 1, l).Value = Cells(sor, 2).Value + (l - 1) / 2 - 1 ' A felette levő sor B oszlopából veszi a kezdődátumot Cells(sor + 1, l).NumberFormat = "mmmm d." Next l
Nem azt a szintaxist használtam a range-ben, mint te, mert a ciklusváltozót nehéz betűvé alakítani, de nem hiszem, hogy ez a gond, mert a kikommentezett sor ugyanezzel simán működik, ha nincs megosztva a munkafüzet.
Kipróbáltam, attól sem függ, hogy szegélyezek-e utána és attól sem, hogy ráeresztek-e explicit egy középre igazítást a következő sorban. Egyszerűen a bal oldali cellában marad.
Hát ez a megfelelő elhelyezés az, ami nem megy nekem. Tegnap este óta próbálom, keresem fórumokon a megoldást, de nem találom. Pedig a súgó szerint működnie kellene: "In a Frame that contains other controls, the focus moves to the first control in the Frame, and subsequent keyboard events apply to the control that has the focus."
Annyit látok, hogy másoknak is van problémája ezzel.
Próbáltam a setfocus utáni sorba betenni a doevents parancsot, de a füle botját sem mozgatja. Viszont ha megállítom a futást egy breakpoint beiktatásával, és a megállás után f5-el továbbengedem, akkor érvényre jut a parancs.
Ha tudod a rögzítés utáni első sor számát (legyen a 3. sor) és az első oszlop betűjelét (legyen C), akkor range("C3").select, vagy cells(3,3).select. Erre gondoltál?
Talán már feltűnt, hogy háklis vagyok rá, ha összemossák a táblázatot az adatbázissal (talán mert egy adatbázis szerető gazdájaként élem a hétköznapjaimat). Igazából az én hibám, hogy nem kezdtem a riport szónál tiltakozni, csak éppen nem volt időm-erőm ezen szőrözni. Van egy sokfülű munkafüzet pü. adatokkal, amiből időnként újat kezdünk, és amikor újat kezdünk, akkor a régi munkalapjairól el kell végezni az összegzést, egy alkalommal, ennyi.
A rendszert örököltem, már így is sokat fejlesztettem rajta, és ha rajtam múlna, adatbázisban lenne, és nem lenne vele ennyi problémám, de erre még nem állunk készen.
Userformmal kapcsolatban kérek segítséget. Azt hogyan lehet befolyásolni, hogy a formon található boxok közül melyikre ugorjon elsőként a vezérlés? A sorrrendjüket tudom, hogy a tab order szabályozza. De, hogy melyikkel kezdődjön a munka, azt nem.
Nálam a következő a helyzet: Ha a programban inicializásáskor szépen előkészítem őket adatbeadásra, akkor azt teszi, amit gondolok, a tab order szerinti elsőre ugrik.
Hanem amikor már meglévő adatrekord módosítását készítem elő, azaz a már korábban munkalapra mentett adatmezők tartalmát kiolvasom és az értéket kiinduló értékként teszem a boxba (vegyesen vannak textboxaim és comboboxaim), akkor számomra rejtélyes okokból valahova a közepére áll. De, hogy miért, arra képtelen vagyok rájönni. Nem arra, amelyiknek először adtam értéket, nem is arra, amelyiknek utoljára. Nem is névsor szerint. Egy jó, hogy legalább következetesen ugyanarra az elemre lép elsőként, tehát feltehetőleg valami beállítja így, így hátha nekem is lesz módom befolyásolni a dolgot.
Köszönöm. Kérdésedre, hogy miért Excel, miért nem Access, egyszerű a válasz. Még soha nem dolgoztam az Accessel, és bár sejtettem, hogy az megfelelő lenne, nem mertem alapismeretek nélkül belevágni, mert nem tudtam felmérni, hogy az alapok elsajátítása mennyi időt igényelne.
Az Excel programozás alapfogalmaival valamilyen szinten már megismerkedtem korábban, most az adatbevitel volt az, amit nulláról kellett megtanulnom. De ha ezzel a programmal most kész vagyok, meg fogom nézni az Access-t.
Ha ez egy riport, akkor miért a megosztott munkafüzetben van? A riport egy pillanatkép az adatbázis állásáról, bizonyos szempontok szerint összeállítva. Ha naponta készítenek tíz riportot, az mind benne van a megosztott workbook-ban? Nekem úgy lenne logikus, hogy a kolléga dolgozik a megosztott munkafüzetben, aztán megkattint egy gombot, erre a program létrehoz egy független munkafüzetet saját gépen, és abba generálja a riportot. Azt utána esetleg elmenti archiválás céllal, vagy elküldi a főnökének, vagy ilyesmi.
MÉg az az út is nyitva áll, hogy az alsó táblázat külön lapra kerüljön, csak nem akartam, mert így is annyi füle van, mint az oroszoknak együttvéve, és gyengék a gépeink.
Egyébként az adafeldolgozó munkalapokon is kell a fejléc, mert annak alapján tudnak beleírni a dolgozók, de azt nem kell makróval kezelni, mert fixen helyezkedik el a lap tetején.
Ez egy riport. :-) Csak két táblázat van egymás alatt, és nem tudom, hány soros lesz a felső, ezért kezdtem úgy, hogy munkalap takarít, felső táblázat kész, alsó fejléc formáz...
Amit még lehetne, hogy külön takarítana az alsó táblázat fejléce fölött és alatt, előbb törölve a sorokat, aztán egyenként beszúrva annyit, ami kell... Sokkal bonyolultabb.
Vagy esetleg törölné az összes sort (nem tartalmat) a kilencediktől kezdve a maxsor-adikig, aztán a megfelelő lélektani pillanatban beszúrná a kívánt három sor fejlécet egy szervizmunkalapról másolva. Ezt elfogadja egy megosztott munkafüzet? Szerintem igen, mert sorbeszúrást meg törlést rendszeresen csinálunk (azt sem értem, miért kevésbé veszélyes, mint cellát egyesíteni, ebben még mindig nem vagyok meggyőzve, de mindegy). Valaki tud segíteni egy ilyen kóddal?
Szerintem fejlécet a riport kapjon, ott van értelme, az adatfeldolgozásra szánt munkalapokon fölösleges. Vagyis: legyen egy riport template munkalap, előre megformázva, cellák egyesítve, stb. Erre a munkalapra csak meghatározott helyekre kelljen meghatározott adatokat VBA kóddal beírni, és ennyi. Minden egyéb művelet olyan munkalapokon történjék, ahol nincs cellaegyesítés. Az egyesített cellák kezelése VBA-ban egyenlő az ön-tökönszúrással és csak erős idegzetűeknek ajánlott. Esetleg alacsony vérnyomással küzdőknek.
1. A különféle vezérlők betűtípusát a Font property állítja be. Ez tervező módban is elérhető, és a látszat ellenére nem csak a betűtípus nevét, hanem méretét, Bold, Italic tulajdonságát is lehet vele állítani.
2. Én a DoEvents utasítást próbálnám meg, valahogy így:
Fogalmam sincs, hogy a szerzők mit gondoltak akkor, amikor ezt így oldották meg.
4. Szerintem teljesen jó az új űrlap beiktatása. A funkciók logikus csoportosítása és elkülönítése talán így oldható meg a legtisztábban. Vannak persze más lehetőségek is, pl ha magán az adatbeviteli űrlapon van egy választó funkció, amellyel meglévő rekordok közül lehet választani módosításra, és amely elrejthető Visible = False beállítással, ha új rekordról van szó. De tapasztalatom szerint a leendő felhasználók informatikai intelligenciaszintjére tekintettel általban nem érdemes komplexebb megoldásokat erőltetni, inkább törekedni kell a minél egyszerűbb, lehetőleg csak szándékosan eltéveszthető megoldásokra.
Nekem is felmerült egy kérdésem. Miért Excel, miért nem Access?
A képlet beírása után persze nem árt, ha írásvédetté teszed a cellákat.
Egy másik megoldás, hogy az eredménycellákba minden faxni nélkül beírod az eredményeket, de a láthatóságukat feltételes formázással szabályzod. Pl ha $a$1="" akkor a fontok szine egyezzen meg a cellaháttér színével (lehet választani a fehérszint is). Ekkor az eredmény csak akkor fog látszódni, ha a1-be beírsz valamit. A cellák írásvédetsége természetesen itt is megfontolandó.
A fifikás diákok persze még igy is leleshetik az eredményt a szerkesztőlécről. Ez ellen a szerkesztőléc kiiktatásával védekezhetsz.
AZt szeretném, hogy bizonyos cellák tartalma csak egy adott cella értékétől függően jelenjen meg. Konkrétan, adott egy csomó matekfeladat generálva, eredményekkel együtt, ám azt nem akarom láttatni, csak ha pl A1 = 1, szóval ez a cella egyfajta kapcsoló lenne. Segítsetek :-)
Megosztott munkafüzetben egyáltalán nem lehet cellákat egyesíteni vagy szétbontani. Suxxxx&#^˘°^˘°^#@@#&&{&@{>#&˘!!!!
You do not expect to change the following features, which cannot be modified after a workbook is shared: merged cells, conditional formats, data validation, charts, pictures, objects (including drawing objects), hyperlinks, scenarios, outlines, subtotals, data tables, PivotTable reports, workbook and worksheet protection, and macros.
Egy csomó érthetetlen korlátozás. :-((((( Még jó, hogy dolgoztam vele, most tervezhetem át a táblázatot ortopédra.
Ebben az a furcsa, hogy a megosztás előtt még futott a makró, és a próbatáblázaton is látom, hogy megosztás nélkül fut a makró, megosztott módban meg nem. És ráadásul debugolni sem lehet, mert a hiba csak megosztva jelentkezik, és olyankor nincs kód... A 22-es csapdája, nem?
Majd a többi oszlopba kiszámolod az egyeneseidnek a abszcisszaértékekhez tartozó értékeit. Amelyik abszcisszaérték kivűl esik az érdeklődési körödön annak az y-celláit üresen hagyod.
Majd az XY diagram lehetőségeiből a több vonalast választod. És kész.
Köszi, szuper minden. Már csak egyre nem jövök rá: hogy lehet a scrollbart visszatenni a makró végén a lap tetejére? (Azaz a rögzítés alatti sorra. Szóval ütközésig fel.)
És még egy kérdés: Az elkészült adatfelviő lap alapján kitöltődik az excel tábla, de szóba jöhet a már korábban felvitt adatok módosítása. Ez az adatfelviteli képernyővel megoldható, annyi különbséggel, hogy a userformon az egyes boxok nem üresek, hanem a beolvasott adatokat tartalmazzák.
Amit még nem gondoltam végig, illetve kissé bizonytalan vagyok, hogy miként tudom megoldani a korábban felvitt adatok közti böngészést, hogy aztán eljussak az adatfelviteli képernyőig. A keresésnek nyilván az adatfelviteli userform inicializálása előtt kell megtörténnie. Kérdés, hogy a keresést hova tegyem.
Pillanatnyilag az a struktúra, hogy van egy userform, ami a menüt tartalmazza (Adatfelvitel, adatmódosítás stb. gombokkal). És ezen az adatfelvitel választása után hívom meg az adatfelviteli képernyőt tartalmazó userformot.
Az elképzelésem, hogy az adatmódosítás előkészítésére kénytelen leszek közbeiktatni egy új userformot, amin csak egy választó eszköz van (ez feltehetőleg listbox lesz, de még ebben sem vagyok biztos), és a kiválasztás után ez hívja be az adatfelviteli formot.
Jó ez így? Vagy van egyszerűbb megoldás, mint egy közbeiktatott userform használata?
Jimmy még egyszer nagyon köszönöm. Áttértem a comboboxra, ahogy ajánlottad, és azóta elkészült az adatfelviteli rész, és működik végre az adatlapom. A többi adatlap az már a meglévőnek a klónja lesz néhány további adattal, tehát nem félek tőle.
Azért beleütköztem néhány problémába:
1. Egyes boxoknál (egy éveket bekérő textbox, aminek adtam bemenő értéket - évszázad, amit csak ki kell egészítenie a felhasználónak, aztán több combobox) a default betütípus bold volt, anélkül, hogy szándékom szerint beállítottam volna. Másoknál normál szöveg volt. Végül a programból a .Font.Bold = false beállítással el tudtam érni a normál szöveget. Most már csak kíváncsi vagyok, hogy mitől állítódik alaphelyzetben nullára, valamint arra, hogy jól látom-e, hogy ezt a propertiesnél nem tudom beállítani, csak programból.
2. A programban az egyes tételek kitöltése és az adatsor táblázatba írásakor egyben mentem is az állományt biztonsági okokból. És ez dolgozik 2-3 másodpercet. Ezért erre az időre szeretném bekapcsolni a homokórát (Application.Cursor = xlWait). Az viszont csak olyan késleltetéssel jelentkezik, hogy többnyire nem is jelenik meg, vagy legfeljebb a várakozás utolsó másodpercének töredékére. Ha beiktatok a homokóra után egy várakozást (pl. msgbox), akkor megjön a homokóra. Lehetséges programból kikényszeríteni a homokóra azonnali megjelenését?
3. A következő inkább csak észrevétel, nem annyira kérdés. Teljesen megdöbbentett, hogy a formokon nem működik az eseménykezelő tiltása (Application.EnableEvents = False). (Legalábbis 2003-as verzió alatt) Ha a change funkció módosítja a box értékét, simán visszaugrik a vezérlés a change elejére. Aztán később megtaláltam ezt dokumentálva (http://www.cpearson.com/excel/SuppressChangeInForms.htm), és volt javaslat a kivédésére is. Azért érdekelne, hogy ezt szándékosan oldották meg így, vagy egyszerűen elfelejtkeztek róla a szerzők.
Siman a "0"&A1 azert nemjo, mert ha eredetileg is 4 karakteres az azonosito, akkor hozzarakja a 0-t amivel 5 karakteres lesz es vegkepp nem fogja megtalalni az erteket.
RIGHT("0"&A1,4), pedig hozzaadja a 0-t minden ertekhez, majd jobbrol 4 karaktert levag, igy mindig meglesz a 4 es 0 is lesz elottuk, ha 3 karakteres az eredeti azonosito.
A getpivot meg a vlookup utan talan leghasznosabb fuggveny amit eddig hasznaltam :)
Az SAP-rol mint rendszerrol gondolom hallottal mar, itt csak annyit ertettem alatta, hogy egy SAP-bol lehuzott adatbazis az egyik kiindulo pont.
Én is töprengtem a problémádon, és épp akartam javasolni, hogy próbáld ki, hogy a "0"&A1-t textform'tummá alakítva elfogadja-e a getpivot, amikor láttam, hogy már oké a helyzet. De azért megkérnélek, hogy nézd meg. Kiváncsi lennék ugyanis, hogy jó volt-e a megérzésem. Magam sajnos nem tudom leellenőrizni, mert lövésem sincs, hogy mi az a sap, és a getpivothoz sem volt még szerencsém.
Ja megegy: egyebkent van mod SAP-t direktben interfaceelni Excellel (es akkor feltelezem Access-el is). Meg nem hasznaltam, csak mutattak hogy van ilyen. Kell neki egy kulon plugin amugy.
Adott 2 kulso forrasbol (SAP + Access) szarmazo adatbazis melynek van 1 kozos oszlopa, amiben egy alapvetoen 4 szamjegyu azonosito kod van.
Ez a kod van amikor 0+3szamjegy es van amikor 4 szamjegy formaban van.
Az SAP-os letoltes a 0+3 formatumu azonositokbol mindig lenyeli a nullat (tehat pl. 0123-bol 123 lesz csak), ellenben az Access-es meghagyja a 0-t, sot alapbol Textkent adja meg (pl. '1234).
Mindket tablazotbol van csinalva egy pivot, majd egy harmadikban hasznalnam a =GETPIVOTDATA() fv-t rajtuk.
A fuggveny ezt az azonositot egy cellabol veszi es a problema hogyha oda ugy irom be h '123, akkor csak az SAP-os adatbol szedi ki a szamot, ha viszont '1234 akkor meg csak az Access-esbol.
Nyilvan valahogy kozos formara kene hozni ezeket, ami nem is bonyolult:
(=IF(LEN(A1)=3,"0"&A1,A1) es ezt siman meglehet adni a kiindulo pivotoknak, azonban ennek ellenere nem szedi be rendesen az ertekeket.
Probaltam mar a VALUE(), FIXED(), TEXT() fuggvenyeket is, de valahogy egyikkel se jo.
Csak a tábla alatti sorba írás hatását teszteltem. Arra nem figyeltem, hogy hozzá adja-e a sort a táblához, de úgy emlékszem mindig hozzá adta. A vonatkozó képleteket azonban nem számolta ki mindig. Most, hogy próbálgatom előidézni , nem sikerül. Mindig kiszámítja az új sor képletét. Sőt csinál valami meglepőt is. Ha átirok egy képletet a képletes oszlop bármelyik cellájában, akkor átírja az oszlop összes képletét. De úgy látom csak akkor, ha az új képlet elemei konstansok vagy ugyanabban a sorban vannak. Na, még tanulmányozni kell :))).
Hogy erted? Ha az igy formazott tabla melleti oszlopba vagy alatta levo sorba irsz egy szamot akkor mindig beadja a tablaba. Plussz a vonatkozo kepleteket is kiszamolja automatikusan.
A probléma csak az, hogy nálam az "Adattartomány végén a formázás és a képletek folytatása" ki volt pipálva, és így volt, hogy hol működött, hol nem. De most valszeg rájöttem a rejtett feltételre, ami még szükséges hogy folytassa a képletírást: 4 azonos képletnek kell fölötte lennie, hogy folytassaa képletírást. Bár most a próbálkozások során, volt egy olyen kimenet is, hogy 6 azonos képlet közül a 6-ikat manuálisan megváltoztatva a 7-iknél a 6-oshoz tartozó képletet írta, de a 8-9 nél már nem folytatta. Aztán a 10-iktől már igen. Egy kicsit zavaros :))).
Egy táblázatba új adat beírásakor az excelem van amikor az új sorba automatikusan átveszi a fölötte levő sorból az adatra hivatkozó függvényeket, más esetekben nem. Az lenne a kérdésem, hogy hogy lehet ezt a funkciót ki/be kapcsolgatni. A súgóban nem találom.
1. jelöld ki az egész Z oszlopot (az oszlop betűjelére kattintva fenn)
2. feltételes formázás (2003-as angol excelben Format/Conditional Formatting, de a többiben is megtalálható valahol :P)
3. a feltételnél válaszd kil, hogy Formula Is (~, és a képlethez írd be, hogy =COUNTIF(Z:Z;Z1)>1, és mondjuk válaszd ki, hogy a cella háttérszíne piros legyen
Így azok a számlaszámok, amik egynél többször szerepelnek, pirosak lesznek. Amiket utólag írsz be, azok is. Persze csak akkor, ha teljes az egyezés (nincs benne felesleges space pl.)
Magyarul valahogy így nézhet ki a függvény: =DARABTELI(Z:Z;Z1)>1
Nekem 2003-as excelem van, de itt egy link, hogy hol találod a feltételes formázást későbbi excel verzióban:
Adott egy nagyméretű tablázat, amit folyamatosan bővítek, de el szeretném kerülni az a hibát, hogy az egyik oszlopában duplán írjak be egy adatot. (számlaszámot) Ez csak az egyik oszlopra vonatkozik, nevezzük "Z" oszlopnak. A többi oszlopban lehetnek ismétlődések, csak ebben nem.
Meg lehet oldani úgy, hogy a jövőben ne engedjen beírni olyan számlaszámot, ami már eddig szerepelt, valamint azt, hogy az előzőekből-eddigiekből kiszűrni a duplikáltakat? A szűrésnél próbáltam az autoszűrést, de több mint 500 darab van, azt egyenként végig ellenőrizni nehézkes.
"Ismerem" A Combobox vezérlőt annyiban, hogy mielőtt a munkába belekezdtem, április elején rászántam néhány napot, és áttanulmányoztam a Userformokhoz felajánlott mind a 16 vezérlőt. Az ezekre adott tankönyvi példákat megcsináltam, és átgondoltam, és érteni véltem. Szóval ilyen szintű az "ismeretem"
Aztán valahogy szimpatikusabbnak látszott a ListBox a ComboBox helyett, és az utóbbit ki is hagytam a számításból.
Viszont most javaslatodra megnéztem a még egyszer a tankönyvi példát, és úgy látom, melléfogtam. Holnap nekilátok a ComboBoxos megoldásnak. És nagyon köszönöm.
Annyit még muszáj hozzátennem, hogy a név előtagot gyakorlatilag minden weblapon, ahol regisztrálni kell, Combobox-szal kérik be. Azt pont erre találták ki.
Ha valami okból mégiscsak ragaszkodsz a listboxhoz, akkor lehet trükközni a magasságokkal, ahogy mutattam 21227-ben.
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) ListBox1.Height = 100 End Sub
Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) With ListBox1 .Height = 20 .TopIndex = .ListIndex End With End Sub
"Annak mi a szerepe, hogy minden egyes Listbox Enternél újraírod a listbox tartalmát?". Szerepe nincs, oka van. Nevezetesen a saját hülyeségem. Hát persze, hogy a form inicializálásakor kell megadni a kezdőértékeket. Utólag nem is értem, hogy jutott eszembe az Enter eseményhez rendelni ezt. A figyelmeztetésed máris enyhítette a gondjaimat.
A feladat egyébként egy tagnyilvántartó program, ahol sok adatot fognak bekérni az egyes személyektől, és ezek egy része listából választható. Ezeket választom listboxból.
Namármost szeretném nemcsak bolondbiztossá tenni, hanem jó kinézetűvé is. Arra például nem ismerek megoldást, hogy a listbox csak akkor nyíljon fel, ha rámegyek, és elhagyáskor pedig csak egy sor látsszék, ne az egész listbox.
Ezért a következőt tervezem, és lehet, hogy ezzel bonyolítom túl a feladatot. Például amikor a név előtagot (dr., ifj., id. stb.) kell megadni, akkor erre egy textboxot készítek és egy nem látható listboxot. A textboxba lépve a visible tulajdonság felcserélődik, így a listbox látható. Erre a textbox enter eseményét használom, és a végén a setfocus-al állok rá a listboxra. Így:
Private Sub txtNévelőtag_Enter()
txtNévelőtag.Visible = False
lstnévelőtag.Visible = True
lstnévelőtag.SetFocus
End Sub
A listbox választásnál (ezt az afterupdate eseménnyel vizsgálom) a listbox eltűnik, és a textboxba kerül a választott szöveg.
txtNévelőtag.Value = ide kerül a lstnévelőtag.Selected(i) szerint kiválasztott elemhez tartozó név
lstnévelőtag.Visible = False
txtNévelőtag.Visible = True
Küldöm a megoldás képi eredményét is. De bizonyára van egyszerűbb megoldás. Ráadásul a gondjaimat azt hiszem az okozza, hogy a textboxra való visszalépéskor (mert ugye azt is kezelnem kell, ha téveset választott a felhasználó, és javítai akarja), szóval ilyenkor nem mindíg tudom uralni, hogy mikor melyik eseményre szalad a program. Ezért néha nem az az eredmény, amit várnék. De tesztelni meg nehezen tudom, mert a program megállítása után néha más történik, mint anélkül. Van esetleg valami nyomkövetési eszköz, mondjuk létrehozható egy log fájl?
Nem vagyok benne biztos, hogy jól értem a problémádat, de ha az lenne, hogy az Fkeres képletben meg akarod változtatni az oszlophivatkozást, akkor annak legegyszerübb módja, hogy nem konstanssal, hanem cellahivatkozással mutatsz rá az oszlopra. Esetedben tehát a kettes helyett mondjuk $A$1-t írsz be képletedbe. Mert így csak az A1 cellát kell átírnod az új oszlophivatkozáshoz.
*az előző komment eltűnt valami fekete lyukban, de akkor megpróbálom még egyszer*
Szerintem nem lehet máshogy, csak makróval. Írtam egyet, ami az összes kijelölt cellán végigmegy és kicseréli az oszlopot jelző karaktert. A kódban kettest cserél ki hármasra, de ezt könnyen át tudod írni (az elején van, Const-tal kezdődő sorok). A vesszőket hagyd benne! Remélem működik nálad is.
Annak mi a szerepe, hogy minden egyes Listbox Enternél újraírod a listbox tartalmát? Ezt én biztos nem így csinálnám. De hogy hogyan, azt nem tudom, mert nem értem, mire szolgál az űrlap. Ha van kedved mesélni róla, részletekbe menően, szívesen elolvasom :)
Az érdekelne, hogy milyen feladatot akarsz ezzel a formmal megoldani, és hogyan képzelted el a megoldást lépésről lépésre (de csak nagy vonalakban).
Még annyit, hogy a beírt kódból igyekeztem csak a lényeget (a tömb feltöltését) feltüntetni. Így kimaradt néhány sor, a tömb felállítása, meg néhány kezdőérték beállítás. Csak nem akartam, hogy túl terjengős legyen. A legfontosabb értékadások így is látszanak.
Lehetséges az egymás melletti cellákban szereplő függvénybeállítások egyszerre történő változtatása? Pl: =fkeres(B3;C3:D16;2;hamis) Ki szeretnék jelölni egyszerre több cellát, és a harmadik értéket, az oszlopszámok(ebben az esetben a kettes) szeretném megváltoztatni egyszerre sok cellában, h ne kelljen külön-külön mindet átírni. Köszönöm!
Elakadtam a ListBox használatával. A következőt szeretném: A felhasználó rákattint a listbox form-ra, ekkor megjelenik a lista. (Ezt az listbox enter() eseményéhez kötöttem) A lista kezdőértékét szeretném alaphelyzetben a 0. elemen tartani, ezért induláskor az adott listbox selected(0) értékét true-ra állítom. Valahogy így:
Private Sub lstVálasztó_Enter()
Dim utolsósor As String, i As Integer, sorszám As Integer, üreslehet As Boolean
lista(0, 0) = "üres" ' A név
lista(0, 1) = 0 ' A kód
For i = 1 To utolsósor ' Ha üres lehet, akkor 2-től indul a lista a ciklusban
lista(i, 0) = név beolvasás munkalapról
lista(i, 1) = kód beolvasás munkalapról
Next i
lstVálasztó.List = lista
lstVálasztó.ListIndex = lista(0, 1)
lstVálasztó.Selected(0) = True
End Sub
És azt is szerettem volna, hogy kiválasztott elem látható addig, amíg a felhasználó nem választ másikat. Aztán a választás után szerettem volna az afterupdate() eseménynél a selected elem kiolvasásával megkeresni a választást.
Már azon több mint két napja kínlódom, hogy a program automatikusan végrehajtja az enter után az afterupdate-t is. Azt már nagy nehezen megoldottam egy jelzővel, hogy ez ekkor még ne végezzen érdemi munkát, csak majd ha a felhasználó választott a listából. Ez még működik is.
Azt viszont nem jön össze, hogy ne módosítsa a program önkényesen az általam megadott értéket. Ahogy látom, ez attól függ, hogy a formon belül melyik (akkor még nem látható) elem helye felett állok az egérrel a form kiválasztásakor. Tehát ha a még üres listbox teteje környékén kattintok az egérrel, akkor a legelső elem jön be, ha kicsit lejjebb, akkor a 2. és így tovább.
És ez azért kellemetlen, mert a későbbiekben szeretném az adatmódosítás lehetőségét is megoldani, ahol különösen fontos lenne, hogy belépéskor az az elem legyen kijelölve, amelyet beolvastam a már korábban kitöltött munkalapról, és ne mutasson hamis adatot.
Remélem, hogy sikerült érthetően leírnom a problémámat. Van erre megoldás?
Nem igen vagyok otthon a diagramokban, így nem tudtam, hogy az oszlopok szinét manuálisan is be lehet állítani. De ha lehet, akkor a szinezésük biztosan megoldható makróval. De nem tűnik egy egyszerű feladatnak, legalábbis az én szintemen.
Sejtettem, hogy nem lehet. Úgy oldottam meg, hogy a hónap értékeit minden tárgy esetében csökkenő sorrendbe tettem és utólag manuálisan színeztem az oszlopokat egyesével az eredeti tábla alapján. Azért köszi!
Sziasztok! A kérdésem a követlező lenne: szeretnék készíteni egy olyan oszlopdiagramot, mint a mellékelt képen, hogyan tudnám megoldani azt, hogy itt például tantárgyi csoportonként mindig a legnagyobb értékű oszlop kerüljön előre (ami tegyük fel minden tárgy esetében másik hónap) és az csökkenő tendenciát mutasson a csoporton belül, tehát az informatikánál a balról jobbra haladva a lila, piros, zöld, kék sorrend, de ha egy másik tárgy esetén a piros oszlop a legmagasabb, akkor az kerüljön előre, és így látszódjanak az értékek? (Az egyszerű szűrővel rendezés azért nem jó esetemben, mert nem minden tantárgy esetében ugyanaz a tendencia a hónapokon végighaladva.) Köszönöm előre is a segítséget!
De a legegyszerübb megoldás, hogy a C oszlopban végigsorszámozod a rekordokat 1-től végig. Aztán csinálsz egy sorbarendezést az AI minősítő oszlopra. És Kész. El vannak választva. Ha vissza akarod kapni az eredeti sorrendet akkor újra egy sorbarendezés, most a C oszlopra. :)))
Miután megírtam a szűréses választ, beugrott hogy az excel nem hajlandó az írányitott szűrést másik lapra tenni. Ez egy kicsit megbonyolitaná a makróírást, ezért inkább javasonék egy egyszerűbb FKERES-es megoldást. Ehhez kéne egy kiegészító oszlop a táblázat elött. Tételezzük fel, hogy a C oszlopod üres. Ekkor a C4-be ez jön:
=AI4 & darabteli($AI$4:AI4;AI4), és ezt végigmásolod.
Ezután a következő lapokat A4-től sorszámozod 1-től akármeddig, az A1 cellába meg beírod a kritériumot: Pl. Megtartandó.
Ezután gombnyomás se kell, a munkalapokon up to date szét vannak választva a beszállítóid. A Hahibás üresstring miatt, ahol az Fkeres még nem talált adatot, ott az üresnek látszik. (Ezért én általában nem is "" -t használok hanem "."-t, hogy lássam meddig van képletekkel kitöltve az oldal.
Az oszlopNo-kat vagy manuálisan adod meg, vagy egy előre besorszámozott sorból származik, vagy akár az aktuális oszlop-1 képlettel határozod meg. Természetesen az A oszlopbeli sorszámok is kiválthatók a sor-3 kifejezéssel.
Még annyit, hogy a makrósítás esetén az alaptáblázat méretét jóval több sorra méretezném, mint az aktuális rekordok száma, hogy az új beszállítók esetén ne kelljen az adattábla méretezésével veszkődni. Vagy a másik megoldás: a makróban átírni a sorok számát jó nagyra.
Én három külön lapra történő írányitott szűrést csinálnék egymás utan. A megfelelt, az ideiglenes, és a megtartandó kritériumokra. És már szét is van osztva a táblázat. Ha ezt egy gombnyomásra akarnám elvégezni, akkor az első alkalommal bekapcsolnám a makrórögzítőt. Amit bekapcsolva hagynék a táblázatok kicsicsásítása közben is (esetleges fejlécek odamásolása, lapfülek megírása stb).
Adott egy elég terjedelmes táblázat, ahol a cég különböző beszállítói vannak felsorolva; sorokban az egyes beszállítók és oszlopokban a hozzájuk tartozó adatok (cégnév, cím, kapcsolattartó...., minősítés).
A feladat az lenne, hogy a beszállítókat minősítésük (Megfelelt, Ideiglenes, Megtartandó) alapján három, másik fülön lévő, "Megfelelt", "Ideiglenes" illetve "Megtartandó" táblázatba másolja át (a teljes sorokat).
Először síma Fkeres függvénnyel indultam neki, de rájöttem, hogy ez nem túl jó, hiszen így az egyes cél táblázatokban üresen maradnak azok a sorok, amikor az illető beszállító (minősítése alapján) éppen nem az adott táblázatba kerülne. Működik tehát, de a hézagos táblázatokat utólag "reszelni" kell, ráadásul ha a kiindulás táblázatba utólag beszúrok sorokat (új beszállókat), akkor a képletezést is folyamatosan másolni kell.
Megoldható lenne-e a probléma egy parancsgombbal, amelynek megnyomására egy VB modul (makró?) elvégezné a kívánt szétválogatást?
Mellékeltem egy képet az egyszerűstett táblázatról.
Az Fkeres numerikus adatokkal úgyanúgy működik mint a stringekkel.
A HAMIS módban (tehát amikor megtaláláshoz teljes egyezést igényel) a numerikus adatoknál ha nem találja meg amit szerinted meg kéne, gyakran az a hiba hogy a 16-ik tizedesben különböznek. Ezért ha a numerikus adataid számítottak, célszerű őket Kerekites (round) függvénnyel azonos tizedesszámra beállítani.
A stringeknél a stringvégi láthatatlan szóköz okozza leggyakrabban, hogy nem találja meg a keresettet. Ezt a trim függvénnyel küszöbölheted ki. Vagy a Helyette-vel (substitute).
Az ismétlődésekkel az a helyzet, hogy mindig az első megtaláltat adja vissza. Ha többször keresel rá, mindig ugyanazt az elsőt adja vissza, hiába szerepel a táblázatban esetleg többször. Tehát fontos, hogy a keresett táblázatban egy azonosítóhoz csak egy rekord tartozzon, (vagy a keresett tulajdonságra ugyanazt az adatot tartalmazza). Nálam gyakran előfordult, hogy egy kereső azonosítóhoz több keresett is tartozott, ezért csináltam anno egy makrót, amelyik az Fkeres lefuttatása után átnézi ilyen szempontból a listát, és az ismétlődéseket is kibányássza a táblázat aljára. Ha érdekel, előbányászom.
A kifejezetten téves találatok tipikus IGAZ módú FKERES hibák. (Míg a HAMIS módra a HIányzik hiba a jellemző). Ezért nem is értem, hogy nálad IGAZ módban hogy lehetett sok HIÁNYZIk hiba. Az IGAZ módú keresés ugyanis gyakorlatilag mindig teljesül, csak mint írtam az előző posztomban, könnyen hibás eredményt adhat.
Az Fkeres tanulmányozásához meg sok sikert. Érdemes megtanulni, mert nagyon hasznos.
Válaszoltam a mailban. Lenne még egy kis probléma a dologgal:) Makro nélkül nem lehet megoldani? Tiltva vannak a makrok a számítogépeken biztonsági okokból és nem tehetek semmit ez ellen:)
Szia! Köszönöm a választ, de nem jól magyaráztam el. Elküldhetem az excel fájlt, abban érthetően látszik,h mit szeretnék. Nem nehéz szerintem a dolog, csak én sehogy se tudok rájönni, hogyan tudnám megoldani. Adsz egy mail cimet légyszives?
Köszönöm a válaszokat neked és rhcpgergőnek is. Sajnos (vagy talán szerencsére?) nem jött össze sem így, sem úgy, sem amúgy. Talán azért, mert az FKERES inkább numerikus adatokra működik? Vagy a stringek több kérdést vetnek fel? Pl. az ismétlődés kezelését? Nem tudom. Mindnesetre kontrollálhatatlan eredményeket kaptam. Sajnos esetenként kifejezetten téves találatok is jöttek, azaz olyan névhez tartozó adatott mutatott, amelyik nem egyezett meg a párjával.
Ezért végül nekiálltam, és irtam rá egy kis keresőprogramot. Ezt talált is hibákat, ahol valóban nem stimmeltek a nevek, mert az egyik táblázatban némelyik másképp volt írva, mint a másikban. Meg voltak ténylegesen hiányzók is, ahogy jelezted nekem. De ezzel legalább össze tudtam hozni az összetartozókat. Igaz, elment vele néhány óra, de sürgős volt, hogy mára készen legyek vele.
Később azért majd tanulmányozni fogom az FKERES működését. Most legalább vannak megbízható adataim, aminek tudom az eredményét, nincsenek hibái, így tudok vele tesztelni.
Az A1-tol B6-ig terjedő táblázatnak az A oszlopában nevek szerepelnek, a B oszlopban pedig a nevekhez tartozó értékek. A D1-től E6-ig terjedő táblázat egy üres táblázat, aminek ha a D oszlopába beirom az első táblázatban szereplő nevek egyikét a D1-től D6-ig terjedő mezők egyikébe és a tőle jobbra levő cellába az osztandó értéket, akkor a következő cellába irja ki eredményül a két érték elosztott értékét. Egyszerübben:
1. táblázat: 2. táblázat
Név Osztó Név Osztandó érték Eredmény Ádám 4 Pl. beirom,h Dávid 12 ? Béla 6 vagy Zoli 18 ? Dávid 8 Sanyi 10 Zoli 12 Peti 14
Remélem érthetően magyaráztam el. Nagyon szépen köszönöm a segítséget!!!
Csak a rend kedvéért: Rájöttem, hogy az Fkeres IGAZ paraméteres módjának a kritérium relációját tévesen adtam meg. Az ugyanis nem >=, hanem csak >. Nem gondoltam át eléggé.
Az Fkeres az IGAZ feltétellel (vagy az azzal egyenértékű elhagyásával) csak akkor ad jó eredményt, ha az adataid szigorúan növekvő sorrendben vannak. Mivel ekkor a keresési kritérium nem =, hanem a >=. Amikor aztán a kritériumot kielégítő első cellát megtalálta, akkor nem erre a cellára, hanem az elötte levőre mutat. Stringek közt keresve nem igen van értelme e módnak, de számok esetén már gyakran. Például ha a legdrágább, de még 1000 ft-ból kifizethető pizzát akarod kiválasztatni az excellel, akkor az Fkerest-t IGAZ feltétellel érdemes használni, mert így akkor is eredményt fog adni, ha nincs pontosan 1000 ft-os pizza. Ami azonban csak akkor lesz garantáltan releváns, ha pizzák növekvő ársorrendben vannak.
Érdekes, hogy a fordítottját, tehát a "legkisebb, de még jó" feltételt (tehát <=) az Fkeresnél nem lehet beállítani, szemben mondjuk a HOL.VAN-nal.
Tehát, ahogy rhcpgergő írta, esetedben az Fkerest HAMIS feltétellel (vagy az azzal egyenértékű nullával) érdemes használni.
És még valam. A fentiek miatt úgy vélem, hogy amikor "a mintegy 100 név egy részében megtalálja a megfelelőt, sok esetben azt adja eredményül, hogy #HIÁNYZIK.", akkor azok zömmel valódi hiányzók. Ugyanis az IGAZ mód csak akkor ad HIÁNYZIK eredményt, ha a listának már az első eleme nagyobb mint a keresettt. Az összes többi esetben ugyanis talál eredményt, csak nem biztos hogy jót. És itt lehet a bibi szerintem akkor is, amikor az ismétlődő nevek közül az egyiket megtalálja, a másikat meg nem. Azaz hogy az ismétlődő nevek nem pontosan úgyanúgy ismétlödnek. Érdemes lenne leellenőrízned.
Amíg nem jövünk rá, hogy az excelt miképpen lehetne rábírni a dátumigényedhez igazodjon, addig talán hasznos lesz az alábbi makró. A currentregió exceldatumait írja át a kedvedre. A jelenlegi feltételbeállítással a 01.máj formátumot máj.01-re, amin persze könnyedén változtathatsz, ha szükséges.
Ha jól tudom, az excel az oprendszerből veszi az alapértelmezett dátumformátumot. A vezérlőpultban a regionális és nyelvi beállításoknál lehet vele szórakozni. Persze lehet, hogy nincs igazam, de egy próbát megér.
Nem, mert mindig másik táblázatban van. :-) Elég gyakran használok dátumot, és idegesít, hogy automatikusan ezt az ortopéd formátumot veszi fel, mintha a középkorban lennénk. Ctrl+Shift+3 nekem nem csinál semmit.
Hogy kell rávenni az Excel 2007-et, hogy ja csak begépelem, hogy 4/30, akkor ne alapértelmezetten 30.ápr formában jelenítse meg, amitől hányingerem van? A vezérlőpult beállításai jók.
Kipróbáltam azt a scriptet, amit küldtél. Elég érdekes volt az eredmény, legalábbis számomra. Igazából még mielőtt Alt-F11-et nyomtam volna, megnéztem, mi a helyzet egy üres táblázat esetén, és ekkor megvolt a jobb egér menüben a Hiperhivatkozás menüpont. Abban a táblázatban viszont, amit a júzernek használnia kéne, nincs meg, akár lefuttatom a scriptet, akár nem. Fogalmam sincs, hogy miféle trükk lehet egy táblázatban, ami eltünteti, de ezek szerint nem a program hibás, és nem is a felhasználó beállításai, hanem a táblázatban lehet a bibi valahol (kipróbáltuk egy másik lapon is, és ott is ugyanez volt a helyzet). Ha esetleg erre volna ötlet, azt is megköszönném. A júzer azt mondta, megpróbálja átmásolni az adatokat egy másik táblázatba, de ennek az eredményét nem vártam meg. Igazából nem is annyira fontos, mert így is tudja használni, most már kétféle módon is, de a probléma azért még érdekel minket.
Kicsit kezdő vagyok ebbe még nem csináltam kérlek a vasco3@freemail.hu címemre vezesd le nekem ha nem zavarlak naggyából értem de mikor és mit másoljak és hogy az nem tiszta
Mindekettőbe megtalálhatók azonos cikkszámok de az egyikbe mondjuk 10000 cikkszám a másikba 5000 cikkszám van és ehez kacsolodnak árak is! Hogyan tudom átmásolni a kisebbik exceltáblát a másikba, hogy lecserélje az azonos cikkszámot és a mellete lévő oszlopba melléirja az árakat?
Akadt egy új problémám, segítséget kérek: Egy listboxban szeretném programból beállítani a kezdőértéket.
Erre a ListIndex tulajdonságot használom. Csak az a gond, hogy valamiért nem érvényesíti, hanem továbbra is az első elemre ugrik. Ha viszont valahogy megállítom a programot. Pl. egy Break beállításával, vagy a ListIndex utáni sorba egy msgbox "valami" paranccsal, akkor már érvényre jut.
Mi a megoldás, hogy érvényre jusson a default érték?
Ez az. Gubanc van sajnos. A Personal végig ott volt az általad javasolt mappában (is). De ami az igazi fejtörést okozza, hogy tegnap még minden külön hókusz-pókusz nélkül behivódott. És nem emlékszem semmi rendkivülire, ami előidézhette ezt a gubancot. Azon töprengek, hogy nem kellene-e újra istallálni az excelt.
Kösz. Sajnos hiába jelöltem ki indítókönyvtárnak. Semmi. Kipróbáltam az Office11\Library-t is. Abból elindult. Ahogy a c:\aaa-ból is. Szemben a két indításra rendszeresített xlstart-tal. Jó lenne tudni az okát.
Egy elég furcsa problémába futattam bele. Mi lehet az oka?
Az XP gépemen futó excel2003 egyik napról másikra nem hvta be indításakor a Personal.xls makrófüzetet. Megnéztem a Beállításoknál az indító könyvtár megnevezését: üres volt. Valahogy kitörlődhetett, gondoltam. Ezért Beírtam: C:Program FilesMicrosoft OfficeOffice11xlstart. |gy se hívta be, noha az indítókönyvtár megnevezést most nem radírozta ki. Erre Personal.xls-t átraktam egy C:aaa nevű mappába, és ezt neveztem meg indítókönyvtárként. Innen normalisan indult. Mi történhetett az xlstart könyvtárral? Javítható-e?
2. A belső modul alatt az űrlap saját kódmodulját értettem, mivel ez az, amit űrlap, mint komplett objektum, tartalmaz. Külső modul pedig az, ami az űrlapon kívül van, tehát gyakorlatilag minden más.
1. Nem kell nagy dolgokra gondolni, ugyanaz a lényeg, mint a függvényeknél. Tulajdonképpen a form felfogható úgy is, mint egy függvény. Bemenet az, amit beadsz neki, pl. kiindulási értékek, a form pedig valamilyen algoritmus alapján előállítja a hasznos értéket, amit aztán kiveszel belőle és használod. Ez utóbbi a kimenet.
Például (egy klasszikus adatbázis feladat):
Van egy elsődleges (adatbeviteli) űrlapom, amelyen a felhasználónak ki kell töltenie a mezőket. E mezők közül több olyan, hogy nem tetszőleges érték megy bele, hanem listából választható, de nem feltétlen ugyanabból a listából. Például az üzleti partnert az üzleti partnerek listájából, a feladat felelősét a dolgozók listájából, az alkatrészt az alkatrészek listájából, stb. Erre a célra tervezek egy másodlagos űrlapot, ami az összes ilyen listából választósdit kezelni tudja.
Ebben az esetben a függvény (avagy másodlagos űrlap) bemenete az az SQL lekérdezés lesz, amivel a választható értékek listáját elő tudom állítani az adatbázisból. A kimenet pedig az az érték, amit a felhasználó kiválaszt a listából.
Az űrlap belső modulján (lásd 2. pont) megírom az összes kódot, ami a bemenetet lekezeli. Nagy vonalakban:
- lekérdezem az adatbázisból az SQL alapján választható rekordok halmazát
- a rekordhalmazból megállapítom, hogy hány darab oszlop (mező) van
- létrehozok egy listboxot a másodlagos űrlapon, amely a választható értékeket tartalmazza, annyi oszloppal, ahány az adathalmaz megjelenítéséhez kell
- betöltöm az adathalmazt a listbox-ba
- megírom az összes kódot, ami a felhasználó kattintgatásaira reagál, köztük sorbarendezési, szűrési lehetőségeket
- megírom az összes hibakezelő és a felhasználó lecseszéséért felelős programrészt
- megírom azt a kódot, ami az OK gomb megnyomására a felhasználó által kiválasztott értéket előállítja, és visszaadja az elsődleges űrlapnak.
Ebben az a jó, hogy akármelyik projektemben fel tudom használni, ahol ilyen listából választósdi játék van. Csak annyit kell tudnom, hogy mit kell beadnom az űrlapnak, tehát mi a bemenet, és hogy a kimenetet hogyan, milyen formában kapom vissza. Az űrlap belső működését akár el is felejthetem (ha sikerült egyszer jól megírni).
Egyébként az összes beépített objektum és függvény, amivel találkozol, így működik. A súgóban le van írva, hogy milyen bemenő paraméterek kellene hozzá, és hogy a kimenetet milyen formában kapod meg.
A felbontásról.
Ez elég fogós kérdés. Amikor egy ablak különböző felbontásokon is működik, ott többnyire csak arról van szó, hogy felnagyítják/lekicsinyítik a méreteket. Pl. egy kép simán skálázható, vagy egy szövegdoboz is, legfeljebb több/kevesebb szöveg fér bele. Ha viszont egy 1280x1024-as űrlapot zsúfolásig megtömsz vezérlőkkel, bajosan tudom elképzelni, hogy azok el fognak férni 1280x800-on. Ha szellősebben vannak a vezérlők, esetleg egy átrendezés segíthet, de nekem nincs olyan algoritmusom, ami ezt elvégzi.
Igazából két lehetőséget látok. Az egyik, hogy csökkented a form méretét más elrendezéssel, vagy multipage használatával. A másik, hogy csinálsz egy tök ugyanolyan formot más felbontásokra optimálva, és mindig azt használod, ami éppen kell. Ez elég macerás, mert ha az egyiken módosítasz, azt át kell vezetni az összes többire is.
A kekeckedés nem zavar. Sőt, örülök, mert olyan dolgok végiggondolására késztet, amelyek magamtól nem jutottak volna eszembe.
Azért sajnos itt nekem alapfogalmaim hiányoznak.
1. Függvényeknél természetesen tudom, de formoknál fogalmam sincs mi a ki- és bemenet. És nem találtam utalást rá hosszas keresgéléssel sem.
2. A külső/belső modul fogalmával sem biztos, hogy tisztában vagyok. Én azt hittem, hogy azzal, hogy ha ugyanabban a munkafüzetben hozom létre a formokat és az általuk meghívott függvényeket tartalmazó modult, akkor az belső modul. És ha átviszem másik gépre a munkalapot, akkor az ott is van. Ki is próbáltam, és minden további nélkül működik a program.
Viszont a kipróbáláskor beleütköztem egy új problémába. A képernyőm felbontása 1280x1024. A másik gépé, amin kipróbáltam, 1280x800, mert ott a harver ennyit enged. Programozáskor a formot a teljes képernyő méretére állítottam, és a kilépés gombot az aljához közel helyeztem el. Viszont a másik gépen futás közben nem látszik ez a gomb. Próbáltam keresgélni megoldást, de nem találtam.
Az világos, hogy 1024 pontot nem lehet elhelyezni 800 ponton. De feltételezem, hogy van valamilyen megoldás erre, hiszen sok program működik különböző felbontások mellett. De fogalmam sincs merre induljak el a megoldás keresésében.
kész van az excel táblám, most pedig szeretném ellátni lapvédelemmel, da van benne egy makrós legördülő menü, és ha levédem akkor nem lehet változtatni rajta. de ha jobb klikk vezérlő formázása védelem nincs kipipálva de mégsem lehet lapvédelem alatt módosítani
Picit kekeckednék azért, mert jobb ma egy véreb, mint holnap kettő.
A form kódjának áttekinthetősége egy dolog, más dolog a hordozhatósága. Van úgy, hogy az ember csinál egy formot egy adott feladatra, aztán pár hónappal később jön egy másik feladat, ahol hajszálra ugyanaz a form jó lenne, vagy csak minimális változtatásokkal. Ha az első feladatnál hordozhatóra írtad meg, akkor könnyű átvinni. Ha nem, akkor nem annyira.
A hordozhatóságnak (vagy más szóval újrafelhasználhatóságnak) ebben a kontextusban ilyen kritériumai vannak:
1) A form jól definiált bemenetekkel és kimenetekkel rendelkezik.
2) A form tartalmazza az összes kódot, ami ahhoz kell, hogy a felhasználóval kommunikáljon, illetve a bemenetekből a kimeneteket előálltsa.
Ha a formról olyan függvényeket hívsz meg, amelyek külső modulon vannak, a 2. feltétel nem teljesül. Ez nem feltétlenül probléma, csak fel kell jegyezni valahová (célszerűen a form kódlapjának tetejére commentben), hogy a form csak az ilyen-olyan külső modullal együtt használható. Aztán ha kell, akkor együtt vinni mindkettőt a következő alkalmazásba.
De különben, ha csak egy adott form használ egy adott függvényt, akkor azt a form saját kódlapján is el lehet helyezni, Private megjelöléssel. Akkor kívül esik az eseménykezelő rutinokon, és nem zavarja az áttekinthetőségüket, de mégis a form része marad.
Még annyit a függvények önálló modulba gyűjtéséről, hogy nagyon nagy segítség. Kiválóan áttekinthetővé tudom ezzel tenni a formok eseményeinek programozását. Mert nem csak azokat feladatokat teszem ki, amelyeket több form is használ, hanem áttekinthetőbbé tudom tenni az egyes események vezérlését. Érthetőbbé tudom tenni az események vezérlését és csökkenteni tudom a kódjaik méretét. Nagyon jó!!!
Köszönöm. Egyelőre csak meg akarom érteni. Mert egyelőre látva, hogy mennyire bonyolult, feladtam ezt az elképzelést, és inkább létrehozok egy "átmeneti" munkalapot. Ide írom a módosult adatokat az eredeti munkalappal azonos szerkezetben, és mentéskor csak bemásolom ezt a sort az eredeti munkalapra. Egyébként adatnyilvántartásról van szó, tételenként mintegy 50 adattal. És a felhasználókat meg szeretném kímélni attól, hogy az Excel táblázatban bogarászva kelljen azt kitölteniük.
1) Userform2-n deklarálni publikus változókat, és azoknak értéket adni
2) Property-k használata.
Most nem írnám le részletesen őket, inkább mondd el, mi a célja, mire akarod használni.
Függvények:
Alapvetően azt kel sztem bekódolni egy Userform-ba, ami logikailag oda tartozik. Ha van egy függvényed, amit több form-ból is szeretnél elérni, az nem tartozik logikailag egyikbe sem. Az ilyen függvényeket én kiiraknám egy normál modulba, publikusan. Akkoraztán akárhonnan meghívhatóak.
Köszönöm. Szép kifejtés volt. Az túlzás, hogy értem, mindenesetre kipróbáltam és működik. És most próbálom értelmezni.
A mintapélda rról szól, hogy a meghívott Userform át tud adni adatokat a meghívónak. Azt viszont nem tudom kibogozni, hogy ez működik-e úgy is, hogy ez oda-vissza megtörténjen? Mert olyasmiben gondolkozom, mint a klasszikus funkcióknál. Hogy a hívó átad egy paramétert a meghívottnak, az pedig módosítja az értéket és azt visszaadja. Ehhez a mintában nem találtam meg a kulcsot.
A másik - tegnap késő esti - kérdésem azt hiszem, megoldódott a leírásod alapján. "...az adatok átadását a Form-ok között ... eseményekhez kötjük." Ebből az következik számomra, hogy a Formok között a függvények nem átjárhatók, tehát nem oldható meg, hogy egy adott függvényt csak az egyik form kódjában szerepeltessek, és azt a másik form kódjából is meg tudjam hívni. Jól értem?
sziasztok, teljesen tanácstalan vagyok, kellene csinálnom egy excelt, amiben legordülö menük vannak.
es van hozzá egy táblázatom, amiben benne vannak az adatok, a cel az lenne hogy a végén ha a legördulö menuben mindent kivalasztottam akkor egy eredmény kijöjjön.
pl kiválasztom, egy oszlopban melyik ország akkor azt szeretném ha odaírná mellé a pénznemét, de az országnak van egy szorzó száma is, meg egy kódja is es azt is odaírná. fkeressel próbáltam, de az egy cállát ir csak mellé.
Ajánlom mindazok figyelmébe, akik a "Class Module = megfejthetetlen talány" című műsorban érdekeltek.
Alapvetően a Userform a Class Module-hoz hasonlóan egy objektumosztályt jelent. Amikor azt mondjuk, hogy Userform1.Show akkor valójában az Excel létrehozza a Userform1 nevű objektumosztály egy példányát, amit alapértelmezés szerint ugyanúgy ("Userform1") hívnak, és azt jeleníti meg. Tehát a konkrét műveletet sosem az objektumosztállyal, hanem annak egy példányával végezzük. Legalábbis ezt gondolom, mert leírva nem találtam sehol. Mindenesetre egy Userform1 típusú form megjelenítésének szabályos módja az alábbi lenne:
Dim UF As Userform1 Set UF = New Userform1 UF.Show
Ez azért lényeges, mert ugyanabból az objektumosztályból tetszőleges számú példányt létrehozhatunk, és ez igaz a "Userform1" nevű objektumosztályra is:
Dim UF1 As Userform1, UF2 As Userform1 Set UF1 = New Userform1 Set UF2 = New Userform1 UF1.Show UF2.Show
(Mindkettő egyszerre csak akkor jeleníthető meg, ha a Userform1 osztály ShowModal tulajdonsága False.)
Na most. Az objektumorientált programozásban az egyes ineraktív objektumok történéseit, felhasználói beavatkozásra adott reakcióit az objektum eseményein keresztül lehet kezelni. Ilyet már mindenki látott, pl. a Munkalap típusú objentum Worksheet_Change eseménye személyében.
Kézenfekvő, és szerintem elegáns és konzisztens megoldás az, ha az adatok átadását a Form-ok között ilyen eseményekhez kötjük.
Ehhez szükséges, hogy az adatot átadni szándékozó Userform-on definiáljunk egy publikus eseményt. Ez nem olyan esemény lesz, ami a felhasználó kattintgatásaira reagál. Ezt az eseményt programból váltjuk ki, de a formon belül. Ugyanakkor a formot meghívó külső egység fogja érzékelni, hogy itt esemény történt, és kezelni azt.
A gyakorlatban hogy néz ez ki.
Van 2-féle Form tervező üzemmódban összerakva: Userform1 és Userform2. Userform1 az elsődleges űrlap, ez hívja meg majdana másodlagos űrlapot. Userform1-en legyen - egy gomb, amelynek neve Btn1 - egy textbox, aminek neve TextBox1
Userform2 a másdolagos űrlap, ebbe kell a felhasználónak adatokat beírni, és ez adja majd vissza az adatokat az elsődleges űrlapnak. Ezen az űrlapon legyen - 4 db Textbox, amelyeknek neve: Txt1, Txt2, Txt3, Txt4 - egy gomb, amelynek neve btnReturn
Userform2 kódlapján, lehetőleg a lap tetején definiáljuk a "Visszatérés" nevű eseményünket:
Public Event Visszatérés(Érték1 As String, Érték2 As String, Érték3 As String, Érték4 As String) Lényeges, hogy Public legyen, mert csak ekkor látszik kifelé, a létrehozó felé. A Userform2 összes többi, gyárilag definiált eseménye Private, ezért nem is látszik kintről.
Szintén Userform2 kódlapján definiáljuk, hogy a btnReturn gomb megnyomása kiváltsa ezt a bizonyos űrlapeseményt: Private Sub btnReturn_Click() RaiseEvent Visszatérés(Me.Txt1, Me.Txt2, Me.Txt3, Me.Txt4) End Sub
Userform1 kódlapján (legfelül) először is deklarálunk egy Userform2 típusú változót.
Private WithEvents UF As UserForm2
A WithEvents kapcsoló kötelező, ellenkező esetben nem tudjuk Userform1-ről kezelni az UF objektum eseményeit.
Aztán Btn1-hetz rendeljük az űrlap megjelenítését: Private Sub btn1_Click() Set UF = New UserForm2 UF.Show End Sub
Amint a Private WithEvents UF As UserForm2 deklarációt beírjuk, a kód-ablak fölötti, bal oldali lenyílóban megjelenik az UF objektum, amit ha kiválasztunk, a jobb oldali lenyílóból ki lehet választani az UF valamely eseményét. Mivel UF-nek csak egy eseménye van definiálva, jelenleg nincs sok választási lehetőség, de amúgy lehetne.
Leprogramozzuk az eseményt: Private Sub UF_Visszatérés(Érték1 As String, Érték2 As String, Érték3 As String, Érték4 As String) Me.TextBox1 = Érték1 & "-" & Érték2 & "-" & Érték3 & "-" & Érték4 Unload UF End Sub
Használat közben akkor mi is történik? Usefrom1 létrehoz és megnyit egy Userform2 típusú objektumot, mely utóbbi neve UF. A felhasználó az UF-en beírja az adatokat a 4 szövegdobozba, aztán megnyomja a gombot. A gombnyomás (mert így programoztuk le a gomb eseményét) kiváltja az UF űrlap Visszatérés nevű eseményét, amely magában foglalja 4 paraméter átadását. A Userform1 érzékeli, hogy az UF-en publikus esemény történt, és mivel van hozzá eseménykezelő rutin írva (Private Sub UF_Visszatérés), azt végrehajtja, és ennek keretében beírja a TextBox1-be a UF által visszaadott 4 sztringet kötőjellel elválastzva. Aztán bezárja az UF űrlapot. (De akár nyitva is hagyhatja, ha éppen arra van szükség.)
Az adatok visszadása bármilyen lehet. Sok adat esetében érdemes tömböket összeállítani, és/vagy egyéni típusokat használni, és akkor egy-két változóban többszáz vagy többezer adat átadható a másik űrlapnak.
Ha simán megosztok egy táblázatot, akkor ugye bárki más is le tudja venni a megosztást, nem csak az eredeti megosztó személyiség?
Valamint ha van egy megosztott táblázatban egy szürke pipa a megosztásnál, és senki nem tudja levenni, annak mi lehet az oka, és hogy lehet gyógyítani?
Előre is köszönöm. És ha nem vagyok nagyon telhetetlen, akkor ugyanez függvények vonatkozásában is érdekelne, hogy ne kelljen több helyre bemásolnom az ismétlődő függvényeket. Nem mintha nagy munka lenne, de hát az igényes, struktúrált programozás kritériumainak nem igazán felel meg.
Nagy gondban vagyok. Hogyan lehetséges a különböző UserFormok között változókat továbbadni. Reménytelenül keresgélea google-ban. Olyan tanácsokat látok, amire magam is gondoltam, csak éppen nem működnek.
- Próbáltam az első használt UserFormnál (ahonnan a többieket hívom) Public-nak deklarálni, de nem segített.
- A másik tanács az volt, hogy a General Deklarációknál kellene Public-ba tenni, de nekem az sem működött.
- Volt olyan tanács is, hogy az egyes vezérlőelemek tag-jébe kell írni. De ez sem jött be, mert a vezérlőelemet nem tudom elérni egy olyan UserFormban, amelyikben nem szerepel.
Végső soron megoldás lesz, hogy egy átmeneti munkalapon tárolom a kb. 50 változómat, de valahogy nehézkesnek érzem, és semmiképpen sem elegánsnak.
Mellesleg a végleges helyükre azért nem akarom kiírni, mert erre csak akkor kerítenék sort, mikor az operátor kéri a mentést. Minél kevesebb esélyt szeretnék adni félbemaradt mentésre.
A tegnap lementett fájlom ma azzal az üzenettel örvendeztett meg, hogy a beolvasáskor az Excel olvashatatlan tartalmat talált a benne és akarom-e hogy kijavítsa. Akartam. Kijavította. A problémám csak az, hogy a hibajelentésből nem derűlt ki, hogy melyik rekordot törölte (látszólag semelyiket).
Tudna valaki segíteni a hibaüzenet értelmezésében?
Szóval az a probléma, hogy másnap reggel 2 filet is találsz a mappában? Egy készlet.xlsx-t és egy készlet(ütközés).xlsx-t? Még ilyennel nem találkoztam.
Lövésem sincs mi lehet a háttérben. Egy ötlet: Végig gondolnám a 29 munkafüzet kereszthivatkozásait. Hátha azok okozzák az ütközést.
Eddig még semmilyen kérdésbe nem futottam bele. Egyszer csak (többnyire másnap reggel) látom, hogy készlet.xlsx és készlet[ütközés].xlsx. Természetesen jó dolog, hogy nem irogat random mód felül dolgokat! :) De jelenleg 29 MF-ből áll és tartok tőle hogy valami fontos változtatás az egyik excel-be a másik fontos változtatás az üzközésesben hajtom végre... Ezért szeretném valahogy megoldani hogy rákérd mielőtt létrehozza. Vagy legalább abban a pillanatban figyelmeztet és nem egy egész napi munkát kell összehasonlítani, hogy mi is az eltérés.
Én inkább úgy gondolkodnék, hogy létezik-e olyan vezérlőelem, amivel ez a feladat megoldható. Ha van, akkor azt Excelből is lehet használni. Rengeteg custom vezérlő van. Ezek úgy készülnek, hogy valaki leül és megírja pl. C++ vagy Delphi nyelven, aztán közzéteszi. Nem biztos, hogy a MicroSoftra kell várni ez ügyben. Aztán persze lehet, hogy meg kell venni, de ez van.
Ha meg nincs olyan, ami kell, még mindig meg lehet írni SK. Príma lehetőség a Class Modulok felhasználására :)