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.
Tudsz az érvényesítéssel más lapra hivatkozni, de csak úgy, hogy előbb nevet adsz a tartománynak, és ezzel a névvel hivatkozol rá. Nehéz megjegyezni a neveket, de van hozzá egy segítség. Mikor az érvényesítésnél beírtad az = jelet, F3 billentyűre megjelennek az addig megadott nevek, amikből választhatsz.
Ha jól értem, az Árlista lapon akarod kizongorázni az egyes tételeket az A4:D4 cellákban, és ezeket egymás után megjeleníteni az Árajánlat lap 17. sorától kezdődően.
Azt próbálom megcsinálni, hogy az "Árajánlat" fülön szépen lehessen dolgozni, ott vinném be az adatokat, és ott jelenne meg az ár. Csak a függvény átírása nem sikerül, mert nem tetszett neki az én kis naiv elgondolásom, hogy majd "Árlista!..." módon hivatkozgatok a másik lapra, hogy onnan vegye az adatokat....
Meg nem tudtam, hogy a makrót egymás alá másolom 25-ször, (25 termékbeviteli sor van), és a
"If Target.Address = "$B$4" Then"
sorban átírom a "$B$4" -t a 25 megfigyelt cella nevére, vagy hogy is pontosan?
És még felmerült egy kis probléma azzal is, hogy az "Árajánlat" lapon, a méretnél , az érvényesítés nem enged másik lapra hivatkozni.. :-((
Úgy gondolom, hogy a zöld hátterű területről kell venni az árakat, megcsináltam azzal.
Az volt az egyik fő hiba, hogy a C4 cella érvényesítését nem írtad át. Most is a példa szerinti S1 és S2 cellából vette az adatot (az üres stringeket), holott már az F1 és F2-ből kellett volna.
A másik, amit már írtam, hogy nem a kellő címet írtad a makróba a beírás ellenőrzéséhez.
Azért nem találja, mert az Árlista lap D (4.) oszlopában keres. Mellesleg én sem találom, pedig én mindenhol keresem. A Tipusnevek!A144:A162 tartományban látok ugyan egy halom méretet, de nem tudom – és a makró honnan tudhatná – melyik méret mihez tartozik?
A makróban a Target.Address = "$C$4"-nél a figyelt cella címét átírtam "$B$4"-re, mert ennek a beírásakor kellene ehhez a Fő_alcsop-hoz megkeresni a kezdő- és záró sort.
Az az elrendezés, amit előbb adtál, jobb, világosabb, áttekinthetőbb.
Addig jutottam, hogy a hiba ebben a sorban keresendő:
kezd = Application.WorksheetFunction.Match(keres$, Columns(4), 0),
Feltettem a doksit.
Az első mint oldalt csak azért tettem oda, hogy jobban lásson mi lenne majd a vége a dolognak, de azt csak a régiből kimásoltam, így nem működik, csak a látszat miatt.
Az árlista oldalon van a lényeg.
A tipusnevek oldalon vannak a legördülő listához a csoportok.
A méretek nem jól működik, mert nem sikerül meghatározni az oszlopban a kezdő sor, és a végső sor helyét...
A kezd nevű változóba bekerül a HOL.VAN függvénynek megfelelő VB-s MATCH függvény eredménye, a keres$ első találati helye a C oszlopban:
és ezt az értéket azonnal beíratjuk az S1 cellába.
Azt levettem, hogy a "Columns(3)" lehet a C oszlop harmadik sorától, vagy valami ilyesmi, de hogyan módosítsam ezt a paramétert az E oszlop 59 sorától-ra ? :-)
Beírhatsz egy új sor, mondjuk a Dim ... alá. Legyen ez Range("O1") = "" . Amikor az alcsoportot kiválasztottad, üressé teszi az O1 cellát, és akkor látszik, hogy ki kell választani a méretet, nem maradhat benne az előzőleg bevitt adat.
Egy makró érvényes, a másik csak egy kis maszat, törölhető.
A küldött füzet lapfülén jobb klikk, Kód megjelenítése. Beléptél a VB szerkesztőbe. Bal oldalon látod, hogy a füzet Munka1 lapja van kiválasztva, jobb oldalon ott van a
Private Sub Worksheet_Change(ByVal Target As Range)
kezdetű makró. Az egészet jelöld ki, másold, bal oldalon a saját füzeted lapját (ahol a kiválasztásokat akarod elvégezni) jelöld ki, és jobbra másold be a kódot.
Az ilyen jellegű makrók akkor indulnak automatikusan, mikor a lapra beviszel egy adatot. Az
If Target.Address = "$N$1" Then sor azt adja meg, hogy akkor végezze el a következő, End If utasításig tartó műveleteket, ha ez a bevitel az N1 cellába történt.
Nézd meg itt a fórumon pippancs 17586-os hozzászólását, ami megmutatja, hogyan kell a sor- és oszlopcímekből névvel megjelölt tartományt létrehozni.
Azt megtaláltam hogy hogy a fejlesztőezközök/makrók/szerkesztés menü alatt tudom a saját celláimra átírni a makrót, de hogyan tudom az ott található két makrót (ha egyátalán mind a kettő makró?), átteni az én munkafüzetembe?
Én sem ragaszkodom a bonyolúlt, és plusz munkához.. Ez a gyakorlatban úgy néz ki hogy egy másik munkafüzetlapon van egy megrendelő nyomtatvány, és azon látszik minden. Színek, elemek, munkalapok, fogók, stb... (Ezen fog majd működni a választós rész) És ezt szoktam kinyomtatni a vevőnek. Már én sem tudom mindig, hogy melyik elemnek van szériaméretben ajtaja, és azért jó ha a saját hülyeségem ellen is véd :-) A másik gyakori eset, amikor az árajánlatba ölt munka után a vevő tizedjére is a "Mia lenne ha az inkább fiókos lenne?" "Mi lenne ha ez kisebb lenne 10 cm-el, az meg nagyobb?" és bizony itt kezd elpattani a cérna, de milyen jó lesz ha klikkelek egyet és már látjuk is az eredményt, aztán nyomtat, vagy ment másként .pdf és már küldöm is.
Nekifekszek a makros változat feldolgozásának, és biztos hogy jelentkezek hol is akadtam el ... :-))
Mikor az N1-be beírod az alcsop-ot, indul a makró.
Egy keres$ nevű változóba összefűzi a Fő- és alcsoport kiválasztott értékeit:
keres$ = Range("M1") & "_" & Range("N1")
A kezd nevű változóba bekerül a HOL.VAN függvénynek megfelelő VB-s MATCH függvény eredménye, a keres$ első találati helye a C oszlopban:
kezd = Application.WorksheetFunction.Match(keres$, Columns(3), 0), és ezt az értéket azonnal beíratjuk az S1 cellába:
Range("S1") = kezd
Ettől a sortól egy ciklus indul a C oszlop celláin lefelé:
For sor = kezd To usor (az alsó sort az usor = Range("A" & Rows.Count).End(xlUp).Row + 1 határozza meg).
Mikor az aktuális sor 3. cellája már nem azonos a keres$ értékével:
If Cells(sor, 3) <> keres$ Then, akkor az S2 cellába bekerül a fölötte lévő (még azonos) sor száma:
Range("S2") = sor - 1, és kilépünk a ciklusból:
Exit For
Az O1 cella érvényesítése erre a két, sorszámokat tartalmazó cellára hivatkozik az INDIREKT függvénnyel, így sikerült elérni, hogy mindig a kiválasztott Fő_al-nak megfelelő méreteket adja.
Ez a lényege a makrónak, a többi helyfoglalás a változóknak, és az eseménykezelés tiltása, -engedélyezése (bármit is jelentesen). Az utóbbit majd valaki szabatosan leírja.
Nem kell félni a makróktól, nem harapnak.
Az A oszlopban feltételes formázással láthatatlanná (háttér színével megegyezővé) teheted a sokszor szereplő egyforma adatokat, de kellenek a segédoszlopokhoz.
A segédoszlopokat elrejtheted, sőt, az egész táblázatot is, mikor már minden rovatát kitöltötted.
Na igen, ha webshopba szánod, pl. letölthető árkalkulátornak, akkor ez a szépséghiba nem megengedhető.
Ha viszont személyesen akarod használni, és azzal a céllal, hogy gyorsan kikeresd egy termék árát, akkor úgyis tudod, hogy mi a termék és milyen paraméterei vannak. Az meg nem a táblázatból fog kiderülni számodra, hogy egy adott bútor választható-e 350 mm-es ajtóval, vagy sem. Szóval akkor egyszerűen nem választasz olyan paramétereket, amelyek hibát eredményeznek.
Nyilván, meg lehetne csinálni bolondbiztosra is, csak kérdés, hogy kell-e, megéri-e. Én biztos nem erőlködnék. De lehet, hogy a bútorasztalosok nem olyan lusták, mint a programozók :)
Igen látom az én gondolatmenetem csak akkor működne, ha az E oszlop adatait csoportosítanám egy legördülő menűhöz, az "O1"-be, de elég nehéz lenne mindent elnevezni úgy hogy ne legyenek átfedések a csoportok között... Kialakul lassan a megoldás csak a makróhoz abszolút nem értek, és mindenféleképpen olyan megoldást akarok amit 100%-ban átlátok működésileg.De muszály fejlődni...
Nézzük a kérdéseket:
Ha jól sejtem az X oszlop az törölhető nincs jelentősége?
A "segédoszlop2" az a keresésbe segít, de a "segédoszlop1" jelentőségét nem látom.
És nem értem a makro mi alapján tudja megadni egy választott termék kezdő (S1), és záró sorát(S2).
Kezdetnek ennyi kérdés, de biztos lesz még mire át tudom ültetni a teljes termékpaletára a dolgokat.
Most jut eszembe! A makrót nem kell indítani, azért hiszed, hogy anélkül is működik.
Ez egy eseményvezérelt makró. Árgus szemekkel figyeli, mikor változik meg az N1 cella értéke, és akkor sebtében beírja a két értéket az S1 és S2 cellába. Az O1 érvényesítése csak erre vár, és a kellő helyről veszi a listája értékeit.
A makró ahhoz kell, hogy a kiválasztott fő- és alcsoporthoz tartozó kezdő-, és zárósort kikeresse. Ennek alapján adja az ezekhez tartozó méreteket az O1 érvényesítése. Nélküle a méret érvényesítés meghalna, vagy mindenhez mutatná az összes létező méretet.
Látom, Jimmy nyert az ofszet-es, hol.van-os függvényével, pedig a =HA(HIBÁS(HOL.VAN(S3;D:D;0));"";INDIREKT(P1) INDIREKT(S3)) képletben hibakezelés is van. Amíg nem választod ki a méretet, hibára futhat (az ofszet-es is), ha az újonnan kiválasztott csoportban nincs olyan méret, mint ami az előző választásból benn maradt az O1 cellában.
Érdemes az ofszet-es képletbe is betenni ezt a hibakezelést.
Nos nagyon nagy vagy! Bár egy kicsit módosítottam a dolgon, de a két segédcella nagyon sokat segített a helyes meglátáshoz, mert bár én is errefelé keresgéltem a megoldást, de Te (Ti) kellettél (kelletetek) a sikerhez. Én ezt írtam be egy cellába és makró nélkül is megoldódik a probléma: