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.
Hát úgy néz ki, hogy a referstorange -t odagondoltam (: hátha vannak gondolatolvasók is köztünk -- és lőn :)
Egyébként én úgy értettem, hogy Delila elsőre azt nem értette, hogyan lesz a names("tartomany").referstorange("A1"). address -ből C3. Ezt próbáltam megmagyarázni.
Tehát helyesen:
A names("tartomany").referstorange("A1") cella az éppen a range("C3") cellának felel meg, ha a tartomany a C3-nál kezdődik.
Egyébként a rövidített irásmódokkal én nem vagyok egészen kibékülve:
pl. names("tartomany").referstorange.cells.count=25
names("tartomany").range("A1") ugyanaz a cella, mint a síma range("C3") cella!!!
Hiszen a names("tartomany").range("A1").address = C3! ha a tartományod a C3 cellával kezdődik.
Ezért is ragaszkodnak oktatáson ahhoz, hogy mindig konkrét hivatkozások legyenek a programban, mert akkor mindegy, hogy melyik munkalapod aktív, ha elnevezed az egyiket ws1-nek, a másikat ws2-nek. Akkor a ws1.range("XX") az mindig ugyanazt a munkalapot fogja jelenteni, viszont a range("XX") mindig az aktív munkalapra hivatkozik.
A tartomány elnevezések is erre jók, a konkrét és pontos hivatkozásokra. (pl. egy több ezer soros programban látsz egy cells(3,5) =akarmi utasítást, hát azt elég nehéz visszakövetni, hogy most vajon melyik munkalapra hivatkozik éppen.)
Az a helyzet, hogy az Excel minden ugyanazzal a logikával hivatkoz meg, mint a munkalapot. A tartományon belül az első cella hivatkozása A1, a második cellánál B1 és így tovább sor vége után jön az A2 cella.
Tehát ehhez a hivatkozáshoz elég tudnod azt, hogy a tartományon belül hogyan helyezkedik el a cella!! Ezzel a címzéssel minden tulajdonságát megkaphatod.
Viszont, ha a munkalapon való elhelyezkedését akarod megtudni, akkor az Address -t kell megkérdezned, amely azt az értéket mutatja meg, hol található a munkalapon. Tehát az adott tartomány A1 helyzetű cellája bárhol lehet az adott munkalapon, hogy hol van, na ezt mondja meg az Address értéke.
Nagyon nem mindegy tehát, hogy simán range("A1")-et írsz - ami ugye az aktuális munkalap első celláját jelenti, vagy valamilyen names(tartománynév).range("A1")-et, esetleg egy objektum.range("A1")-et (pl set oszl=columns(4), oszl.range("A1").Address =D1).
Ez így nagyon jó egyébként és hasznos is, csak arra kell figyelni a programozásban, hogy melyik tartomány melyik cellájára akarsz hivatkozni.
Kipróbáltam a cim$ = Range("tartomany")(1).Address sorban az (1)-et 2-re, 3-ra, stb. értékre átírni. Rendre a tartomány következő celláinak a címét adja meg. Abban a sorrendben halad, mint a For Each, tehát első sor tagjai, majd a következő sor tagjai.
Letöltöttem az Akadémia által közreadott - tartalmilag nagyon jó, számítógépes kezelhetőség szempontjából aggályos - legfrissebb listáját.
Viszont a kiváló Solid Converter PDF v7 segítségével (merem ajánlani a programot mindenkinek ilyen célokra) áttettem Excelbe, ahol nem egész 1 órai munkával sikerült 1551 férfi és 2031 női nevet tartalmazó listát kapnom. Feltöltöttem a következő címre: http://data.hu/get/7344927/Utonevek_MTA_2014.01.01.xls
Későbbi tervem, hogy ha egyszer lesz időm, összevetem ezt a Jimmytől és Sánta Kutyától kapott listákkal, hogy tényleg megvannak-e ebben is a kapott listákban lévő nevek.
Kösz mindnyájatoknak a segítőkész válaszokat. Többek közt azért is, mert ezekről ugrott be, hogy a currentregion kereső szóval kell Jimmy 21802-re rákeresnem, ahol egy nagyon frappáns lekérdezést ajánlott. Nekem, mint meglepve láttam :)))). Ezt ajánlotta:
''cim$ = Selection.CurrentRegion(1).address
Ennek mintájára az alábbi a legrövidebb címlekérdező utasítás:
Szerintem a names("tartomany").referstorange.range("A1").row illetve .column kell, hogy működjön. (Nálam 2010-es verzióban biztosan megy). Az már egy más kérdés, hogy a range("A1")-et kihagyva -ahogyan Te is írtad -, ugyanazt az eredményt adja a row/column, de úgy tapasztaltam, hogy más tartományoknál is így van ez (mármint hogy a row/column a tartomány legelső cellájának a sorát/oszlopát adja vissza).
Viszont, ha magának a cellának valamilyen más tulajdonságát akarod visszakapni, akkor már bizony kell a Range("A1").
Valószínűleg nektek egy egyszerű feladat lesz amit szeretnék megtudni.
Egy olyan képletet keresek, amely egy oszlop utolsó elemét adja eredményül. Az oszlop folyamatosan bővül és mindig az oszlop utolsó elemével kell számolni.
A referstorange adja vissza magát a tartományt, amire a név hivatkozik. Ennek már megnézheted minden olyan tulajdonságát, ami a tartományokat jellemzi.