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.
Az a hiba nem probléma egyébként, megszűnik, ha az A oszlopban egy cellát kiválasztasz.
Mivel a cell("address") egyéb paraméterek híján a legutoljára változtatott cella címét adja vissza, természetes, hogy amikor a képletet beírod, hibát jelez, mivel saját értékét keresi és az persze nincs az adott tartományban.
De ha az A oszlopban dolgozol, ott már csak olyan értéket tudsz választani, ami megtalálható a hivatkozott tartományban.
Ezért is mondtam többek között, hogy felejtsd el.
Sokkal egyszerűbb és jobb a Choose használata a Match -al.
Kategóriák névhez tartozik az A1:A2 cella. A Kategória_1, Kategória_2 cellák pedig Delila hozzászólása szerint.
Nevek hozzárendelése tartományhoz:
Sajnos csak magyarul tudom mondani, mert magyar az Excelem:
Képletek - név megadása - megjelenik a párbeszéd panel, ahol ki tudod jelölni a tartományt, illetve megadhatod a nevet. Remélem, valamennyire hasonlítanak az angol nevekre a fordítások.
A helyzet az, hogy egyik megoldással sem tudtam megcsinálni.
Egyrészről, mert még sosem csináltam makrót, annak még utána kell olvasnom és nem volt rá időm.
Másrészről, mert Delila10 megoldását noha végigcsináltam, de nem tudtam hozzárendelni a tartományokat. Tehát képtelen voltam megcsinálni a B13 legördülő cellát.
A13 cellában a data validation source "=$A$1:$A$2"
B13 cellában a data validation source "=INDIRECT(A13)" ? Mert erre nekem hibát ad ki.
Illetve az OFFSET függvénnyel is vannak bajaim, de annak majd utána olvasok, hogy hogyan is kéne használni. Mert elég egyszerűnek tűnik a leírás alapján, mégsem sikerült alkalmaznom.
Elvileg ezt kéne írnom az A1 cellába: =OFFSET(D1;0;1;13;1) itt a zárójelben lévő rész azt jelenti, hogy =OFFSET(D1 cellától;0 sorral lejjebb;1 oszloppal jobbra;13 sor magasságban;1 sor szélességben), és erre D1 reference errort kapok. De nem értem hogy hogyan javíthatnám ki.
Delila10, egészen pontosan te milyen képleteket írtál és hova?
Továbbgondoltam egy kicsit a problémát és a következőre jutottam:
Ha a kategóriák elnevezését "szokványos módon" szeretnénk látni, akkor csinálni kell egy táblázatot, ahol meg lehet keresni a kategóriához tartozó nevet, majd onnan már lehet az érvényesítésre hivatkozni. Már csak az volt a gondom, hogy honnan tudjam meg, melyik cellában vagyunk éppen. Erre jó a cella ("cím") függvény.
A B oszlop celláinak az érvényesítése: =indirekt($N$1)
G1:G2 tartalmazza az A oszlop celláinak érvényesítését - ezt el is nevezhetjük Kategóriáknak
H1:H2 tartalmazza az alcsoportok NEVÉT, azaz ahogyan el van nevezve a tartomány.
Az N1 cella értéke akkor változik, ha a munkalapon egy cella értékét megváltoztatjuk (ha az automatikus kalkuláció van érvényben, ha nincs, akkor nyomni kell egy F9-et).
Tehát, ha az A oszlopba valahol kiválasztunk egy kategória értéket, akkor az annak megfelelő alcsoport értékek közül lehet választani.
Hátránya: Ezzel a megoldással a B oszlop minden cellájában változik az érvényesítési tartomány (ahol ilyen meg van adva).
a név megkötések nem feltétlenül felhasználóbarát eredményt adnak (szóköz helyett aláhúzás, stb.)
az érvényesítést a b oszlopban külön meg kell oldani, persze lehet a képletet lehúzni de akkor is (és ott marad a másolt - esetleg már nem is helyes - érték a cellában).
A makróban nincs a kategóriákra megkötés és az érvényesítés is megoldódik, sőt az adott kategória első értéke is kiírható azonnal a cellába.
Nem szükséges makróval elintézni, egyszerűen megoldható anélkül is.
A különböző tartományoknak nevet adsz. Az A1:A2 nálam a "Kategória" névre hallgat. Fontos, hogy az allisták azt a nevet kapják, amelyikhez főlista-beli kategóriába tartoznak. Az E1:E13 tartomány neve Kategória_1, az F1:F11-é Kategória_2. A tartományok méretét az OFSZET függvény segítségével rugalmasan változtathatod.
A Kategória egyes elemeinek a nevében nem lehet szóköz, és nem szerepelhet önállóan számjegy.
Az első érvényesítés az A13 cellában van, a lista forrása: =Kategória A B13-as érvényesítésnél a forrás: =INDIREKT(A13)
Nem kell másolgatni az alcsoportokat egy másik helyre. Mi van akkor, ha az alcsoportok nem azonos számú elemből áll?
Pl.
sör k1:k5
bor l1:l8
pálinka: m1:m3
Ha csak simán átmásolod, akkor két eset lehet: vagy üres sorok maradnak a legördülőben, vagy nem látszik minden sor.
Ezért másképp kell megoldani:
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target = "sör" Then range("B1").validation.modify formula1:="=k1:k5"
If Target = "bor" Then range("B1").validation.modify formula1:="=l1:l10" If Target = "pálinka" Then range("B1").validation.modify formula1:="=m1:m3" Application.EnableEvents = True End Sub
Természetesen a "B1" az egy példa cella és fontos, hogy már legyen Datavalidation a cellában. Ha nincs akkor a következő az eljárás (a validation.modify helyett)
Át is állítottam, mégpedig miután itt a topikban segítséget kaptam. De amiről beszélek az az algebra, te magad írtad, hogy az nem működik jól ebben a formátumban sem. Természetesen egy konkrét feladatban mindig meg lehet oldani az általad leírt függvényekkel valahogy, erre mondtam, hogy barkácsolás. A tiszta megoldás az, ami a belinkelt SQL manuálban van.
Ha átállítottad volna formátumot [ó]:00:00-ra, akkor bármilyen hosszú futóverseny időeredményét gond nélkül jegyezhetted volna fel óra-perc-mp-ben. Persze én is csak most vagyok ilyen okos, miután a Neomatik példa kapcsán rájöttem, hogy mi fenére is való ez a formátum :))).
Ezt úgy tudod megoldani, hogy egy munkalap-change makró az aktuális alcsoportot másolja be az alcsoport listába. Itt pl.
Lista:
főcsoport: e1:e3
alcsoport:g1:g3
Féleségek:
sör: k1:k3
bor: l1:l3
pálinka: m1:m3
és a makró: amit nem másolhatsz be akárhova, csak annak a munkalapnak a moduljába, amelyiken van a lista
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target = "sör" Then Range("k1:k3").Copy Range("g1") If Target = "bor" Then Range("l1:l3").Copy Range("g1") If Target = "palinka" Then Range("m1:m3").Copy Range("g1") Application.EnableEvents = True End Sub
Data Validation-el elértem, hogy legördülő listákból lehessen választani a cellákban, viszont azt nem tudom, hogy hogyan tudnám megcsinálni, hogy miután az Áru főcsoport oszlopban szűkítettem, utána az Áru alcsoportban már ne dobja fel az összes lehetőséget, csak az adott főcsoporthoz tartozót.
Van egy képernyőkezelési problémám. Egy UserFormon vagyok, és itt fut egy függvényem. A futás egy pillanatában szeretnék egy üzenetet küldeni a felhasználónak, hogy most hosszabb idejű adatszerkesztés folyik, és kis türelmet kérek. Erre egy címkét használok, ami az adott pillanatig nem látható (.visible=False), és itt az értékét True-ra váltom.
Csakhogy ez a címke a programrész futása közben nem jelenik meg. Az Application.Screenupdating értéke true, tehát nem ezen múlik. Ha a programrészletbe egy break-et teszek, akkor megjelenik.
Ebből arra következtetek, hogy mivel a Userform futása alatt nincs mit frissülnie a képernyőnek, ezért nem érvényesül a címke megjelenítő beállítás.
Kérdésem, hogy egyrészt jól gondolom-e a hiba okát, másfelől ha igen, akkor létezik-e parancs, amivel a futás közben frissíteni tudom a képernyőt?
Ez az előbb írta tükrében logikus viselkedés, mert a nap() argumentuma nem időtartam, hanem dátum, és a 32 valóban 1900. febr. 1.
Tehát nem az a baj, hogy a nap nem százas, mert az, hanem hogy az időtartamkezelési képessége az Excelnek nem alakult ki a törzsfejlődés során. Ennélfogva az időtartamkezelés helyből barkácsolást jelent, csak ez nagyon kicsi számoknál nem mindig tűnik fel.
A másik megoldás külön szummázni az órákat, perceket, mp-ket.
Az Excel alapvetően időpontokkal számol, nem intervallumokkal. Ezt az emerek próbálják időtartamok kezelésére használni, és ez működik is, amíg át nem lépjük az egynapos határt.
(Én például futóversenyek eredményeivel dolgozom, és akkor szembesültem a problémával, amikor egy nagyon hosszú verseny időeredményei egy napnál hosszabbak lettek.)