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.
Nemigen tudom csatolni. Ez egy icipici része egy jónagy (többezer sor) macronak.
Csak letisztítva ez a probléma lényege.
Közben lett egy ötletem, az Excel valami négyzetösszeges képlettel számolja a lineáris illesztést, azt kellene kiszámolnom nekem is. Rögtön látnám hol van nullával osztás. (Elméletem szerint a számoláskor valahol nullával osztásnak kell lennie, mire az Excel nem hibát ad, hanem nulla eredményt.)
Amúgy mérési adatokról van szó, akármi lehet. Valós számok.
Aztán akármit mérünk, azzal kell tudnom számolni, és kell tudnom ábrázolni.
Szerintem ez nem megfelelő, mert az adatérvényesítésnél üres sorok is vannak és a kérdező pont ezt szerette volna elkerülni. Másodszor abba az oszlopba már alá nem lehet írni semmit, mert az is megjelenik a legördülő listában. Egyébként az Ofset nél is ez gondot jelent, mert egy lejjebb található adat módosítja a tartományt.
Én mindenkinek melegen ajánlom a listává ill. 2007-ben táblává történő konvertálást.
Mennyit agyaltam rajta... Megkérdeztem a Microsoftot is.. Valószínűleg nem olvasták el rendesen, mertz "üres mezők mellőzése"-t javasolták kipipálásra...
Lehet még egy kérdésem? Le tudom védeni a munkalapot azért? Próbáltam az adott cellákat levédeni, úgyhogy engedélyeztem a nem védett cellákba a klikkelést, és úgy is, hogy új sorok létrehozását is engedélyeztem, de nem megy...
A cél az lenne, hogy max 40-et vihessenek be, és a formátumon, az érvényesítéseken (pl, hogy csak x hosszúságú szöveg, vagy csak 1 és 50 közötti szám legyen bevihető) ne tudjanak változtatni!
Az OFSET fv is tökéletes (régen így tudtunk din. listát készíteni), de aki nem ismeri, annak nehéz az argumentumokat megadni a név managerben, hiszen fejből kell tudni. Ezt könnyíti meg a listának (2003), ill. a táblázatnak (2007-10) a használata.
A dinamikus listát (szerintem) egyszerűbben is létre lehet hozni.
A Munka1 A oszlopába bevittem az adatokat – címsor nélkül.
Adatok - Definiált nevek - Név megadása.
Név -> kiadványok, Hivatkozás -> =OFSZET(Munka1!A1;0;0;DARAB2(Munka1!A:A);1)
A beszúrandó helyre Adatok - Érvényesítés - Megengedve: Lista - Forrás: =kiadványok
Ha mégis akarsz címsort adni a Munka1!A1-be, a Hivatkozás képlete:
=OFSZET(Munka1!A1;0;0;DARAB2(Munka1!A:A)-1;1)
Úgy vettem észre, hogy a 2007-es verziónak van egy (?) betegsége. Miután bevittem az ofszetes függvényt a megadott névhez, önkényesen megváltoztatja a képletet. Ezt a Képletek - Definiált nevek - Névkezelőjében korrigálom, ezután már megmarad.
1. Azon a mlapon ahol a kiadványok vannak és már elnevezted a tartományt (b1:B40) kiadványoknak de még nem írtál be könyveket, hozz létre egy táblát: jelöld ki a b1:b2 tartományt:
insert tab/tables csoport/table, jelöld be, hogy van fejléc és ok
Automatikusan kapsz egy formázott táblát, a jobb alsó sarkában egy kis háromszög jelzi, hogy addig tart. Ha most b2-be majd b3 ba beírsz valamit a tartományod nő (a háromszög most már b3-ban van. Ha formátum nem kell, eltávolíthatod ill módosíthatod a Table tools - Design tab/Table Styles csoportban válassz mást.
2. módosítsd a már meglévő nevet pl. kiadványok: Formulas tab/Defined names/Name Manager. A névhez tartozó tartományt módosítsd kijelöléssel ($b$2:$b$3) ok.
Ettől kezdve a kiadványok tartomány dinamikus lesz.
3. A másik munkalapon, ahol rendezvények vannak, jelöld ki azt a tartományt, amelyikre az adatérvényesítést állítod be és a lista forrásaként a tartomány nevét add meg (F3-at nyomva megkapod a létező nevek listáját és onnan is beszúrhatod) List Data Source:=kiadványok
Ettől kezdeve a legördülő lista panelod mindíg azokat a könyveket ajánlja föl amelyek a névhez tartozó dinakus listában szerepelnek. Próbáld ki, írj be a kiadványok munkalapon a b4-be valamit-->enter és ellenőrizd a rendezvények munkalapon a legördülő listádat.
Ha nem működik, ellenőrizd a Name Manager-ben, hogy a Kiadványok tartomány ugyan az e mint a TableX (pl. Table1) Ha nem akkor a névhez tartozó tartományt módosítsd ugyan arra mint a TableX
4. A kiadványok mlapon kitörölheted a próbaként megadott három címet:
jelöld ki a b2:b4 tartományt-->jobb klikk és Delete-->Table rows
Ha mindent jól csináltál: a Name Managerben lesz TableX és Kiadványok és mindkettőnek a tartománya ua: $b$2:$b$2. Ez a lényeg és hogy az adatérvényesítésnél erre a névre hivatkozz.
Az a baj viszont, hogy mivel ez űrlapként funkcionál, amit kiküldünk egy-két helyre, a 40 üres mező már adva van az az elején. Ezt a 40-et neveztem el "kiadvanyok"-nak (mondjuk B1:B40). Viszont, amikor eljut a felhasználóhoz, vagy bevisz 40-et, vagy csak 10-et. A többi üresen marad. Hogy mennyit, azt előre nem tudom. (Azaz csak B1:B10-ig lesz benne kiadvány, B11:B40-ig semmi.) De mivel a legördülő lista a "kiadvenyok"-ra(B1:B40) vonatkozik, ezért kijön a listában egy rahedli üres sor :(((
A beírt könyvcímeket jelöld ki és rendelj hozzá nevet, majd alakítsd át listává úgy, hogy a fejléc is legyen kijelölve. Ha ezek után az adatérvényesítésnél a listát választod és forrásként a lista nevét adod meg az csak a listában meglévőket fogja mutatni. Ha a lista bővül, akkor a legördülőben is megjelennek az újab címek.
2007-ben annyi a különbség, hogy a listát táblázatnak nevezi Create List helyett format vagy insert table.
Adott egy táblázat 2 munkalappal. Az egyikben a felhasználónak lehetősége van 40 egymás alatti mezőbe 40 könyvcímet (vagy akár kevesebbet, ha nem tölti ki az összes mezőt) bevinni. A másik munkalapba bevezetheti a rendezvényeit, és azokhoz legördülő menüvel hozzárendelheti a kiadványok címeit (1 rendezvényhez 1 kiadványt). A kérdésem az, hogy hogyan tudnám megoldani, hogy az Adatok/Érvényesítés paranccsal létrehozott legördülő menüben a 40 mezőből csak azok jelenjenek meg, amelyek nem üresek. (A felhasználó ugyanis ha bevisz 15 kiadványt a 40 helyett, akkor 25 üres sor jelenik meg a listában a 15 kiadvány mellett.)
Van egy olyan opció az adatok/érvényesítés /beállítások fül alatt, hogy "Egyéni" ide elvileg logikai függvényt be lehet írni a legödülő lista tartalmának megállapításához. Erre nem tudtok esetleg valamit?
Ha tudtok, segítsetek légyszi, mert megakadtam ennél... :(
Function Rendezett_tomb(bemeneti_tomb) Dim Result, i As Integer
ReDim Result(LBound(bemeneti_tomb) To UBound(bemeneti_tomb)) For i = LBound(bemeneti_tomb) To UBound(bemeneti_tomb) Result(i) = Application.WorksheetFunction.Small(bemeneti_tomb, i) Next Rendezett_tomb = Result End Function
Na, azért csak összeszedtem magam és írtam egy olyan algoritmust, ami már tetszik is :-)))
Ez sokkal egyszerűbb és rövidebb is.
Sub TombRendezesCsereBerevel()
Dim tomb(1 To 50) As Integer Dim adat As Integer 'beolvassuk az adatokat az elso oszlop első 50 sorából For i = 1 To 50 tomb(i) = Cells(i, 1) Next i ' 49-szer csereberélünk For j = 1 To 49 ' végignézzük a tömböt, ha van szomszédos elem rossz sorrendben, megcseréljük For i = 1 To 49 If (tomb(i) > tomb(i + 1)) Then adat = tomb(i) tomb(i) = tomb(i + 1) tomb(i + 1) = adat End If Next i Next j ' a rendezett adatokat visszaírjuk a 3. oszlopba For i = 1 To 50 Cells(i, 3) = tomb(i) Next i End Sub
Dim tomb(1 To 50) As Integer Dim rendezetttomb(1 To 50) As Integer Dim kesz(1 To 50) As Boolean Dim min As Integer Dim ind As Integer 'beolvassuk az adatokat az elso oszlop első 50 sorából For i = 1 To 50 tomb(i) = Cells(i, 1) Next i ' a kesz tomb osszes elemét hamisra állítjuk For i = 1 To 50 kesz(i) = False Next i ' 50-szer megkeressük a legkisebb elemet For j = 1 To 50 'a min változó kezdeti értéke legyen nagyobb, mint bármelyik adat min = 10000 ' megkeressük a legkisebb elemet a tömbben For i = 1 To 50 If ((min > tomb(i)) And Not kesz(i)) Then min = tomb(i) ind = i End If Next i 'ezt elmentjük a rendezettombbe rendezetttomb(j) = min 'a kesz tombben ezen indexű elemet megjelöljük kesz(ind) = True Next j ' a rendezett adatokat visszaírjuk a 3. oszlopba For i = 1 To 50 Cells(i, 3) = rendezetttomb(i) Next i End Sub
Ja, azt elfelejtettem, hogy sajnos csak egész órákat számol, azaz nem számolja a tört órákat! :( Ha gondolod, akkor lehet még fejleszteni, de azt már csak holnapra! :)
Na erre mondtam,hogy tök sötét vagyok az excelhez. fogalmam sincs mit kezdjek ezzel amit írtál. ha elküldöd az excel file-t akkor tudom,hogy ezt akartam vagy nem.
persze ezzel nem követelni szeretnék csak másképp nem értem amit írsz:))