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.
Szeretnék feltenni egy banális kérdést. (Excel Starter 2010 magyar verzió). Minden hónapban egy táblázatban foglalom össze a munkások havi jelenlétét (szám, ha dolgoztak, 'fsz' ha szabin voltak, ' - ' kötőjel, ha még nem vagy már nem voltak alkalmazva). Ez eddig úgy működött, hogy pl ha kötőjel kötőjel kötőjel 8 8 8 -at írtam, akkor egyszerűen a megfelelő billentyű után a jobb kurzorral át tudtam lépni a következő cellába.
Most a kötőjel után jobbra lépve kivonást értelmez. Ugyanazt a fájlt használom, csak úgy munkalapot, de eddig nem így viselkedett.. Átállítottam szövegre is a cellákat, általánosra is, semmi változás. Nézelődtem az automatikus számoltatás részen is, ott átállítottam manuálisra - semmi változás, ráadásul ha jól értelmeztem ez a függvényekre vonatkozik.
Tudom, apróság, meg valószínűleg gyermeteg kérdés, de ha valaki tud, kérem adjon vmi tippet :)
Valami ilyesmi lett volna sztem a megoldás (legalább két dolgozó esetén):
Sub teszt() Dim nevsor As Range, c As Range, ws As Worksheet Dim cb As DropDown
Set cb = ActiveSheet.Shapes("Lenyíló 1").OLEFormat.Object Set ws = Worksheets("dolgozok") Set nevsor = ws.Range("A2", ws.Range("A2").End(xlDown))
cb.RemoveAllItems 'minden elemet töröl a combobox-ból For Each c In nevsor.Cells cb.AddItem c.Value Next End Sub
De ha ez az a combobox, amire én gondolok, akkor annak a "Vezérlő formázása" menüpontban be lehet állítani bemeneti tartományát, ami lehet akár nevesített tartomány is, és akkor nem kell pogramból küzdeni a feltöltésével.
De amit látok és elméletben akár rossz is lehet az az, hogy Selection.AddItem Worksheets("dolgozok").Cells(i + 1, 1) -t használsz.
Ehelyett jobb megoldás a Selection.AddItem Worksheets("dolgozok").Cells(i + 1, 1).Value használata.
A kódok bezavarodhatnak ha a Range-re hivatkozol, nem a Range értékére. Mondjuk az esetek többségében az Excel IQ-ból veszi, hogy nem a cellára gondolsz, hanem a tartalmára, de sose lehet tudni.
Az ActiveSheet object használatát is mellőzném, mert ha csak egyszer akaratlanul megváltozik és már nem a kombóbox-ot tartalmazó munkalapra mutat, akkor meghalt a kódod.
Mivel muszáj volt et megoldanom az egész probléma megoldásához (egy béna programot kell hétfőig írnom) mindenhol kértem segítséget.
Hátha másnak is van, lesz ilyen problémája, ezért itt (is) leírom, miképpen oldottam meg:
Hátha másnak sem működik az, hogy egy ComboBox tartalmát módosítsa a HELP-ekben oly könnyedén leírt
ComboBox1.AddItem "ÚjElem"
utasítással.
Nálam ez az utasítás ugyanis nem működött - sem az egyik, sem a másik gépen - és nem tudom, mitől függ; Excel-től, géptől, installálástól, valamilyen beállítástól. Tény, nem működik.
Szóval adott egy Excel-tábla, aminek az első munkalapján van (többek között) egy "nev_combobox" nevű ComboBox, ezt kell feltolteni a másik ("dolgozok" nevű) munkalap első oszlopában lévő nevekkel:
i = 2 Do While Worksheets("dolgozok").Cells(i, 1) <> "" 'nevek adatszámának megállapítása; a nevek a második sortól kezdődnek dolgozokszama = dolgozokszama + 1 i = i + 1 Loop i = 1 Do While i <= dolgozokszama 'nev_combobox feltöltése a nevekkel ActiveSheet.Shapes("nev_combobox").Select Selection.AddItem Worksheets("dolgozok").Cells(i + 1, 1) i = i + 1 Loop
Valaki felvetette, miért probléma, hogy csak a "select"-tel tudom "lérni" a comboboxomat, erre azt mondtam, mert például nem tudok belőle törölni. Nem is lehet, ugyanis ahogy a ComboBox1.Clear utasítás nem működik, úgy a Selection.Clear sem, tehát másképp lehet csak törölni; én ezt találtam működőképesnek (ha valaki pl. az összes elemet ki akarja törölni):
ActiveSheet.Shapes("nev_combobox").Select mennyi = Selection.ListCount 'hány darab elem van a nev_combobox-ban?
Egy egészen kézenfekvő dolgot nem tudok megcsinálni.
Hogy a fenébe lehet egy worksheetre odarakott combobox-ba programsorral új elemet beletenni, hogy lehet a combobox-ra egyáltalán hivatkozni programból?
Egyáltalán, hogy lehet elnevezni egy comboboxot másképpen, mint ahogy alapértelmezetten odarakja a képernyőre mondjuk "Lenyíló 5" néven?
Egyetlen példa sem működik, amit a helpekben, interneten találok, tehát pl. a "ComboBox1.AddItem "qwert" " parancsot képtelen értelmezni és egyszerrűen nem értem, mi a fenét rontok el, pedig ennek baromi egyszerűenek kellene lennie....
Egyébként kisebb pontatlanságoktól eltekintve (pl. a gyűjtőszámla háromhavi tőkésítése helyett havi tőkésítéssel számoltak, így 926eFt jött ki 920eFt helyett) korrektül végigszámolták a cikkben szereplő paraméterekkel. Egyébként ez az eltérés csupán kb. 300Ft eltérés jelentene a törlesztésben.
Nem értem, programot akarsz írni, vagy Excel függvényt használni? Mert úgy értettem, hogy programból megy. Ha csak excel függvényt akarsz meghívnia táblázatban, akkor működik a dolog.
Köszönöm szépen a gyors válaszodat, ha nincsen más mód élek is vele. Lehet hogy nem írtam le pontosabban, sajna én függvényben szeretném ezt megoldani.
Egyszerű. Megnyitod egyidejűleg mindkét fájlt. Abban a fájlban, illetve annak abban a cellájában ahova a függvényt akarod írni, megnyomod az egyenlőségjelet, majd elengeded a billentyűzetet, és az egérrel átmész a másik fájlba, ott az egérrel ráállsz a kiválasztandó cellára, és az egérrel rákattintasz. Ha csak ennyi, akkor entert nyomsz. Ha folytatni kell, például összeadás jön, akkor nem enter jön, hanem megnyomod a + jelet, és kikeresed a következő adatot. És így tovább.
Ha persze az elején az egyenlőségjel után egy függvényt akarsz kezdeni az hasonló. Például összegzésnél beütöd, hogy =szum( majd ezen a ponton (a nyitó zárójel után) hagyod félbe a pötyögést, és mész az egérrel a másik fájlban a keresett cellákra.
Ezzel a technikával akár egy fájl több munkalapjának adata, de akár több fájl különböző munkalapjainak adata is lehet egyetlen képletben.
Azt hiszem van egy határ, hogy a képlet szövegének hossza nem haladhat meg valahány karaktert (én olyan 800-900 közötti értéket találtam), de ezt pontosan nem tudom.
Még annyit, hogy ha a képletet javítani kell, nem kell elölről kezdeni, hanem a cellára állva fenn a parancssorban megjelenik annak aktuális képlete. És ott javítható, kiegészíthető a képlet.
Remélem érthető, így leírva bonyolultabbnak látszik, mint a gyakorlatban megcsinálni.
Nagyon sok okosságot lehet itt találni, amiket utólag meg is köszönnék.
Eddig nem kérdeztem tőletek, de most a tudományom végére értem. Ha tudtok segítsetek. Egy függvényt szeretnék írni ami egy mezőt tölt ki, de a feltételeknek megfelelő adatokkal ami egy másik xls-ben van. Programként jól működik, de függvényként mintha csak az aktuális xls-t látná és a másikat nem.
Furcsállom, mert nekem a program maga lefutott. (Csak azt nem tudtam ellenőrizni, hogy mit csinál.) Arra gyanakszom, hogy a hiba a gépedben lehet. Próbáltad másik számítógépen? Milyen op. rendszered van? Milyen Office verzió?
Esetleg ránézhetek közelről, ha el tudod küldeni a doksit email-ben. Előtte persze törölj ki belőle mindent, ami nem kell, csak a két makró modul maradjon bent.
Sziasztok, csak beszámolok egy érdekes meglepetésemről a programozásnál. Egy adott ponton az iif függvényt használtam:
iif(sor<0 or oszlop<0,0,függvény(sor, oszlop)) formában, ahol a meghívott függvény használta a cells(sor,oszlop) kifejezést.
A szándékom az volt, hogy amikor a nem megfelelő paraméterek miatt közvetlenül kell adatot megadnom, akkor ne fosson rá a program egy olyan kifejezésre, ami hibát okozna.
Viszont legnagyobb meglepetésemre a függvényt a program akkor is meghívta, ha a feltétel miatt csak az iif függvény true értékének megfelelő kifejezést kellett volna visszaadnia.
Nem okozott gondot, átírtam a normál if...then szerkezetre. Csak érdekes (talán mondhatom, hogy apró hiba), hogy ezek szerint a program előbb kiértékeli az iif függvénynek mindkét ágát, és csak utána dönti el, hogy melyiket adja vissza. (20 évvel ezelőtti emlékeim szerint, ahol még Clipperben programoztam, nem volt ilyen gond az ottani iif függvénnyel)