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.
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:
Csináltam egy képet, de ez csak részlet, ettől több adat van sorokban, de mindegyik ennyi oszlopból áll, és ilyen "hármas" kategória felosztásba belefér. Én is gondolkodtam olyanba, hogy az első és a második kategória már jelent egy sorszámot és ahoz adódik hozzá a harmadik kategória HOL.VAN fügvénye és így az összeg meghatározza a tényleges helyet de nem jöttem rá mivel lehetne megoldani...
Csak felmerült egy kis probléma. A lényeg az lenne hogy egy táblázatból kellene az oszlop és a sor álltal meghatározott cella értékét visszaadni. Ezt mint Jimmy the Hand elmndta az OSZFET és a HOL.VAN függvényekkel meg is oldottam. De a probléma az lett, hogy mivel a változókat legördülő listából adom meg, így egy olyan nagyon hosszú lista keletkezik hogy görgethetem egy hétik is míg kiválasztok valamit. Ha viszont a legördülő listákat egymásba ágyazom akkor szétesik a fent említett két függvény.
Hogy jobban érthető legyen elmondom hogy mihez kell:
Konyhabútorokat készítek, és az árajánlatokat excelben szoktam csinálni. Van egy árlistám ahol a legtöbb elem ki van számolva. Példáúl "Alsó elem 2 ajtó 800 mm széles" , és ennek van több ára attól függően, hogy milyen kategóriájú ajtó megy rá. Azt nem kell mondanom, hogy nagyon sok elem van, sok méretben. A végső feladat az lenne hogy egy másik munkafüzet lapján kiválasztom egy legördülőből a kategóriát, egy másik cellában az elemet, és kiírja egy harmadik cellában a hozzá tartozó árat. Ez menne is, csak be kellene ágyaznom a legördülőket egymásba, mint példáúl Alsó elem -> 2 ajtós -> 800 mm széles. Csak ha beágyazom akkor a fenti függvények nem jól működnek mert a HOL.VAN fügvénnyel nem tudom meghatározni a sort. Mert ugye az már csak az adott "szülő" legördülő listától számol.
Remélem értelmesen meg tudtam fogalmazni a kérdést.