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.
Azt hiszem feladom, a másolás sem működik, de csak ezen a munkalapon van gond. Felépítem egy új lapra az idei adatokat. Köszi, hogy foglalkoztál velem.
Bocs, nem voltam egyértelmű (éppen egy fél órája várok arra, hogy beszúrjon 20 sort a munkalapba), de tényleg munkafüzetről és munkalapokról van szó. Már a gördítés is gondot okoz. Újabban, ha be akarom zárni ilyenkor, a ""program nem válaszol" üzenetet adja. Ez a szánalmasan kevés feladat nem foghat ki egy excelen, mégha 2003-as is. Rápróbálok a javaslatodra, köszi, mindjárt jelzem, mi a helyzet.
Megpróbálhatod azt, hogy beszúrsz egy új munkalapot, és arra átmásolod a lassú munkalap összes celláját mindenestül, aztán törlöd a régi munkalapot, az újat pedig átnevezed arra a névre, ahogy a régit hívták.
Ha ez nem segít, akkor mit értesz táblázat alatt? Értelmezési gondjaim vannak ezzel a mondattal:
"Excel táblázat, több munkalappal, a munkalapok a táblázattól kapnak adatokat, amikkel aztán tovább dolgoznak."
A korrekt elnevezések ezek lennének:
munkafüzet: az Excel fájl maga
munkalap: a munkafüzet lapjai, amiket Munka1, Munka2, stb. néven nevez a rendszer
táblázat: egy munkalap jól definiált, körülhatárolt része.
Az idézett mondat értelmében mondhatnánk, hogy táblázat = munkafüzet, és akkor egy munkafüzetről van szó több munkalappal. De máshol meg úgy hivatkozol a táblázatra, mintha az egy másik fájl lenne. Ha a "táblázat" tényleg másik fájl, akkor meg mit jelent a "Excel táblázat, több munkalappal" kifejezés?
milyen excel verziót használsz (2003,2007,2010,2013?)
=szum('fájlneve'!T103) egy cellát miért kell összegezni?
a fájlneve egy munkalapnév az adott munkafüzetben?
Valószínűleg túl sok a számolandó cella és ezért lassult be. Ilyenkor célszerű az automatikus újraszámolást átállítani csak kérésre. Az adatok bevitele után az F9 újraszámolja a cellákat. (Beállítások, számítási beállítások , munkafüzet újra számolása csak kérésre.)
Excel táblázat, több munkalappal, a munkalapok a táblázattól kapnak adatokat, amikkel aztán tovább dolgoznak. Az egyik munkalap olyan mértékig lelassult, hogy akadályozza a használatot, iszonyú lassan hagyja magát bővíteni, sorokat beilleszteni, másolni. Egyetlen ilyen parancsa van: =SZUM('fájlneve'!T103), a többi az erre, a táblázatból kapott adatra épülő feladatokat tartalmazza, némi formázással, háttérszín kiemeléssel. Ez a táblázatban kijelölt hely viszont kéthetente más cella.
A táblázat működése változatlan, gyorsan reagál, stb. Előre is köszönöm a segítséget!
Csináltam egy excel lapot, kinyomtatva havi szintű naplózásra szolgál. az első kockába írt dátumot használva kiinduló adatként, az első oszlop adja a napi dátumot, ez az aktuális hónap napjain kívül a hét napját is mutatja. Próbálkoztam azzal hogy a vasárnap valahogy első pillantásra jól elkülönüljön a hét többi napjától, háttérszínnel, vagy bármi más feltűnő módon (hogy a heteket gyorsan tudjam egy rápillantással előre hátra számolni).
Ebbe tört bele a bicskám, a help sem segített, nehezen hinném, hogy nincs rá megoldás. Próbákoztam az OpenOfice-val is.
Szerintem talált, süllyedt. Ugyanis beírva egy makróba: a=1 mrd, és b=10 mrd, akkor az 'a' variant/long lesz a 'b' meg variant/double. Tehát ezek szerint valami okból célszerű figyelmeztetni a usert, hogy az adott adat csak double típusú lehet.
A kvantummechanikai, csillagászati célprogramok, célgépeken futnak.
Mint ahogy nem ritkán, vannak azok a mezei számlázó programok, ahol egy számla (még) lehetséges sorszáma meghaladja a galaxisunk csillagrendszereinek számát: a csak feltételezetten 200 milliárd x 200 milliárdot - ami, véleményem szerint, több mint elég.:-)
A legtöbb feladat megoldására, talán egy 'dupla szó' is elég...
A data type that holds double-precision floating-point numbers as 64-bit numbers in the range -1.79769313486231E308 to -4.94065645841247E-324 for negative values; 4.94065645841247E-324 to 1.79769313486232E308 for positive values. The number sign (#) type-declaration character represents the Double in Visual Basic."
Ezek szerint a # nem azt jelenti, hogy nem lája a teljes számot, mivel a 10 mrd nem is 2 hanem 4 számjeggyel kevesebb mint a lehetséges 15. Csináltam is rá egy próbát. Az a = 123456789012345 - 1123456789012344 a vbe-ben így néz ki:
a = 123456789012345# - 123456789012344#
A kivonás eredménye a=1. Tehát 15 számjegyig valóban pontosan látja a számokat. De mit jelent a kettős kereszt?
A 2010-es excel 15 számjegy pontosságú. Ez azt jelenti, hogy bármely nagyságú számból csak az első tizenöt számjegy pontos (tizedes törteknél a tizedesjegyet nem beszámítva), az összes utána következő számot 0-nak számítja, és úgy is számol vele.
Próbáld ki, hogy egy cellába beírod a számokat folyamatosan 1234567890123456789, a cella formátumát számra állítod. Látni fogod, hogy meddig vannak számok és hol kezdődik a nulla.
A nagyságrend megmarad, de az utolsó helyiértékeket nem tudja már figyelembe venni.
Egy 0-t közelítő iterációs számításnál a vba az 1/1000 000 000 hányadost még elfogadja, de az 1/10 000 000 000 -hoz hozzábiggyeszt egy #-t. Ez mit jelent? Azt hogy, hogy az általa észlelt legkisebb különbség 1/1 milliárd? Ha igen, akkor hogy értendő az excel 14 számjegyes pontossága? Mivelhogy az 1/10milliárd annál 2 nagyságrenddel kisebb.
B+. Figyelmetlen voltam. A 2 tábládat konvertáltam az 1-re. No akkor, amit kértél. Most az 1 táblázatod van a Munka2!E1:H1000 tartományban. A Munka1-re meg ezeket a képleteket írd be egy 2x2 tartományba:
1 oszlop:
=INDEX(Munka2!$E$1:$H$1000;(SOR($A1)+1)/2;1)
=INDEX(Munka2!$E$1:$H$1000;(SOR($A1)+1)/2;2)
2 oszlop:
=INDEX(Munka2!$E$1:$H$1000;(SOR($A1)+1)/2;3)
=INDEX(Munka2!$E$1:$H$1000;(SOR($A1)+1)/2;4)
Majd ezt a 2x2 tartományt kell lefelé másolnod. Ezt úgy kell, hogy kijelölöd a 2x2 cellát, majd kurzorral rámész jobb alsó sarokra, és amikor a nyil keresztre vált, húzod lefelé.
Üdv mindenkinek! Nem vagyok egy „excel-guru”, ezért is kérném a Ti segítségeteket.A megrendeléseimet excel-be szoktam rögzíteni, és mos felmerült egy olyan probléma amire sehogy se tudok megoldást találni. A kérdésem: az első ábrán szereplő adatokat hogyan tudom egy másik munkalapon a 2.ábrán lévő módon megjeleníteni? Előre is köszi.
Hol lehet kikapcsolni az önjavító opciót ugyanis előfordulnak olyan hibák amiket nem tudok megkeresni mert mert beindul ez a folyamat és hibát jelezve lelövi a filet. Az Office 2003-ban még ez nem volt de az Office 2007-től már létezik emiatt már jó pár programomnak búcsút kellett mondanom.
Innentől nem értem a kérdést. Ha egy filet új néven vagy a régi néven új helyre mentesz, akkor onnantól, ha nem piszkálsz bele a mentés után, akkor nem kérdez rá, hogy mentse-e, mivel tudja hogy ez a változat már le van mentve. Ha meg belepiszkálsz, akkor meg az új néven illetve az új helyre menti vagy nem menti a választásod szerint. Ha bekapcsolod pimre True-ját, akkor nem fogja menteni. Nem vagyok benne biztos, hogy ezt nem fogod-e bánni.
Off: Elég idióta lehetett, aki ezt kitalálta, mikor a Dos alatt ott volt a CTRL + Alt + Del kombináció, ami most is megvan, csak beiktatódik a feladatkezelő a kilépéshez.
Azt szeretném megkérdezni, hogy az excelben az aktív cella vastag körvonalát el lehet-e valahogy tüntetni úgy, hogy közben az aktív cella aktív marad? (A beállítások között néztem, nem találtam, de lehet, hogy ott is be lehet ezt állítani. Ha makróval lehet, az is jó lenne.)
Ne haragudj, de ez súlyos tévedés. Igen gyakori eset, hogy például egy fájlt nem írásra olvasol be, hanem bizonyos információk beolvasására. És a beolvasás előtt például rendezed az adatokat valamilyen szempont szerint. De ezért nem kívánod menteni, sőt esetleg még zavaró is, ha pusztán ezért frissülnek a mentési adatai. De millió és egy egyéb ok lehet, amikor a programban nem kívánod menteni a használt fájlt.
Egyébként meg az a véleményem, hogy kínok közt fetrengve vesszen ki a világból, aki képes volt egy power gombot tenni a billentyűzetre oda, ahol tisztességes billentyűzeten a prtscr van, és egyetlen mellényúlással minden figyelmeztetés nélkül vész el az ember összes munkája.
Btw valahogy ihletet merítettem a hozzászólásodból és megoldottam, igaz nem valami elegáns. A megoldás az lett, hogy ha before_close-ba betettem, hogy ha hibás az anyagigénylő, akkor bezáráskor egy "Hibás" mappába menti a fájlt, amit néha "tisztítani" kell.
Valóban, de a táblázat a mentést makróval végzi egy új fájl létrehozásával (másik helyre), így a mentésre szolgáló kérdés felesleges, vagy ha úgy tetszik redundáns (amúgy írásvédett a fájl, szóval csak felülírással tudná menteni a felhasználó).
Amúgy a hozzászólásodból úgy jön le, hogy nem kivitelezhető, de erősíts meg légy szíves, hogy jól értem-e?
Ki lehet valahogy kapcsolni makróval, hogy ha történt egy fájlon változtatás, bezáráskor ne kérdezzen rá, hogy akarja-e menteni a változásokat, hanem alapértelmezetten a Nem aktiválódjon?
Én még nem találkoztam ezzel a hibával, de a help ezeket írja:
" Can't perform requested operation (Error 17)
An operation can't be carried out if it would invalidate the current state of the project. This error has the following cause and solution:
The requested operation would invalidate the current state of the project. For example, the error occurs if you use the References dialog box to add a reference to a new project or object library while a program is in break mode.
Stop execution of the current code, and then retry the operation.
An attempt was made to programmatically modify currently running code. For example, your code may have tried to read code from a disk file into a currently running module.
Although you can modify modules in the project while they aren't actually running, you can't make modifications to a running module. To make such changes, you must stop the module from running, make the additions or changes, and then restart execution."
Kösz. A segítségeddel nagyjából kisakkoztam, hogy a különbőző esetekben hogyan reagál az excel. Csak egyre nem jöttem még rá: Hogy a korábbi F4-es modulátnevezéseimet miért nem tudta megcsinálni: Can't perform requested operation -üzente helyette. Van valami tapasztalatod, hogy ezt mikor szokja üzenni.
Az egyes modulok változóit akkor tudod másik modulból elérni, ha Public-nak declaráltad, és akkor a modulnev.valtozónév alakban benne vannak a listákban is.
Az eljárások publikusak, ha nem privátnak hozod létre azokat és a modul.eljárás módon hívhatóak. Ha csak egy van az eljárásból, akkor ki tudja választani a VBA és nem kell a modulnév. Ha viszont több modulban is van ugyanazon nevű eljárás, akkor feltétlenül kell a modulnév is.
Próbáld ki, ha egy eljárást Private kezdőszóval hozol létre, akkor a modulon kívülről nem lehet meghívni, nem látod a projekt listákban a modulon kívül.
Egyébként mindig először az általános modulban keresi a program, ha nem írtad be a modul nevét.
Hogyan kell az egyik modulban-ben írt eljárásban egy másik modul modulváltozójának értéket adni, vagy lekérdezni, anélkül hogy a kérdéses változót projectszintűvé tenném?
A Kovalcsik könyv erröl ezt írja: Ha pl. a Dolgozo modulnak van egy Fizetes nevű változója, akkor az így érhető el: Dolgozo.Fizetes
Na most ezzel két problémám van: 1. A property ablakban nem engedi átnevezni a modult. 2. A module1-ben a module2.fizetes hivatkozas se müxik.
****
A Kovalcsik könyv azt is írja, hogy a külső modulok eljárásait is hasonlóan kell meghívni. Ezt csak nem értem. Mert nálam az osztálymoduloktól eltekintve bármelyik modulból bármelyik modul eljárása hívható. Akkor minek komplikálni?
Egyrészt köszönöm a gyors választ és az igyekezeted, másrészt elnézést, hogy nem konkretizáltam jobban a problémát az előző hozzászólásomban, mert adott devizapárok meghatározott percre vonatkozó árfolyamadata kellene, tehát pl. 2014.01.08. 14:43 EUR/USD.
A http://www.mnb.hu/arfolyam-lekerdezes címen az Aktuális deviza árfolyamok teljes letölthető verziója menüpontban xls formátumban letöltheted 1949.01.03-tól a mai napig a különféle pénznemek árfolyamát, de csakis dátum szerint.
Mikor ez megvan, egy INDEX függvénybe ágyazott HOL.VAN függvénnyel kikeresheted azt, amire szükséged van.
Excel 2010-ben már dolgozgatok egy ideje egy forex-es naplón, de a minap olyan problémába akadtam, amire nem sikerült megoldást találnom. Minden egyéb gondomat sikerült orvosolnom különböző makrókkal és angol fórumok olvasgatásával, de ez az egy megoldásra váró feladat kifogni látszik rajtam, szóval gondoltam leírom itt, hátha esetleg valaki tud rá megoldást, nagyon sokat segítene vele, mert már csak ez hiányzik, hogy elkészülhessek az egésszel.
Szóval problémám a következő: Egy általam kiválasztott múltbeli időponthoz tartozó devizaárfolyamot szeretnék kiíratni excelben. Tehát konkrétan egy cellába beírnám a dátumot és az időpontot percre pontosan, majd egy másik cellába a devizapárt, a 3. cellába pedig kiíratnám az ahhoz a perchez tartozó devizaárfolyamot. MetaTrader4-ből lenne a legcélszerűbb kivarázsolni ezeket az adatokat, de csak olyan képleteket találtam, amik az éppen aktuális árfolyamadatokat jelenítik meg (=MT4|BID! =MT4|ASK! =MT4|HIGH! =MT4|LOW! =MT4|TIME! =MT4|QUOTE!), múltbéli adatokra vonatkozóakat azonban nem. Alternatív megoldásként arra is gondoltam, hogy talán az internetről is lebányásztathatnám az árfolyamadatot, de egyrészt nem találtam olyan internetes forrást, ahonnan múltbeli adatok elérhetőek lennének, másrészt az internetes adatforrásból történő adatimportálás mikéntjét sem ismerem.:(
Ha valakinek van ötlete, tényleg nagyon sokat segítene vele! Előre is nagyon szépen köszönöm a válaszokat!
Igazán szívesen "segítettem", örülök, hogy találtál megfelelő progit.
Szerintem még egy kicsit kutakodsz és lesz pénzügyi - sőt könyvelő - program is. Lehet érdemes lenne még a "nagyoknál" (SAP, MS) is kicsit körülnézni, elég sok dolgot ajánlanak kkv-k számára is.
Lehet, kevesebb idő alatt megtalálod, mint amennyi ideig az Excelt nyúzni kellene, hogy valahogy kinézzen.
Már előrehaladott állapotban vagyok egy "tanulmányban", ami meg kísérli megmagyarázni az ilyen nevek, tartományok működését.
Egyelőre annyit, hogy ilyenkor a területeket is figyelni kell. Tehát esetedben az alma névvel meghatározott tartomány 4 területből áll és az egyes területek 1 - 1 cellát tartalmaznak. Tehát range("Alma").areas(1)(1).address=A1 stb.
Az egy dimenziós hivatkozás pl. range("Alma")(4).address az első területen megy végig lefelé. Az alma(2) csak azért adott jó eredményt, mert az A2 is benne volt a tartományban.
Második kérdésre:
Ha kitörölöd a dollár jelet - ami ugye az abszolut hivatkozást, azaz a mozdíthatatlanságot jelenti - akkor a név "mozgathatóvá" válik. Tehát az eredeti helyéhez képest az adott hely koordinátáinak megfelelően "elmozdul" a hivatkozás. Szebben látszik, ha mondjuk az I10-et nevezed el, majd utána pl. a L4 cellába írod be az =nevet.
megfogadtam a tanácsod, 25 ezerért mindent tudó standoló és készletkezelő programot lehet venni, konyhai hányadokat is számol, lekérdezéseket lehet vele csinálni xls-be, egyszóval tökéletes. 25 órát biztos elmarháskodtam volna egy excel táblával én is, és nem lett volna ilyen jó, mint ez.
Már csak egy ilyen pénzügyi program lenne a tuti, amivel tudnám kezelni egyszerre több üzlet bevételeit és kiadásait és persze a sajátomat is. De ilyet még nem találtam, ezért jobb híján excelek :)
Hát az idáig az eszembe sem jutott, hogy összefüggő területet ctrl-lal foglaljak tartományba. De ha már felhívtad rá a figyelmem, csináltam rá egy próbát. Alma névvel ctrl-lel deklaráltam az a1, b1, d1 és a2 cellákat. Majd sorban kiírattam a tartalmukat, hogy lássam hogy számozódnak a cellák. De csak az a1 a2-t volt hajlandó kíirni. Hogy lehet rábírni, hogy a többit ís kiírja?
for i=1 to 4
debug.print Range("alma")(i)
Next i
A névhasználattal kapcsolatban lenne egy másik kérdésem is. Definiálom az b1-t mint alma-t. Majd a névkezelőben átírom a $b$1 hivatkozást b1-re. Majd bármelyik cellából =alma-ra hivatkozva körkörös hivatkozás hibaüzenetet ad, és a névkezelő mutatja is, hogy most már a hivatkozó cella az alma. Itt ez hogy s mint?
Ha a név nem egy területből álló tartományra hivatkozik (Pl.A1;B2), akkor már pontokat tesz ki. (Akkor is, ha a két cella közvetlenül egymás alatt v. mellett van!!!! Ha Ctrl-t nyomva jelölted ki a két egymás melletti v. alatti cellát, akkor már nem számít összefüggőnek!)
Kicsit komolyabban: valószínű, hogy az eltolás kiszámítása "meghaladja a képességeit", ezért inkább a pontokkal jelzi, hogy vannak ám ott értékek, csak nem tudom megmutatni.
"Egyszerűen fogok egy sima oszlopot, aminek a szélességét beállítom akkorára, mint a 3 összevont cella együtt, abba beleteszem a szöveget, és leolvasom a sormagasságot."
Hogy ez nekem miért nem jutott eszembe.... Persze, feltételeztem, hogy a 3 cellád egyforma szélességű.
Íme, itt jön ki a "kollektív bölcsesség" eredménye.
Szerintem ez sem tökéletes, de már közel van. Itt is az a gondom, hogy egy cella nem azonos a három cella egyharmadával, ha érted, mire gondolok. Egyrészt az egyedi cellák nem egyforma szélesek, és esetemben egyikről sem mondható el, hogy szélessége az egyesített szélesség egyharmada lenne. Másrészt létezik olyan szöveg, ami az összevont 3 cella egyetlen sorában elfér, de mégis, a szavak hossza és elrendezése pont olyan, hogy egy cellában elhelyezve 5 sorra tördeli.
Én úgy oldottam meg, hogy létrehoztam egy userformot, azon egy labelt. A label tulajdonságait így állítottam be:
szélességét = az összevont cellák szélessége,
betűtípus = az összevont cellákbetűtípusa
autosize=true.
Programban megmódosítottam a label.caption értéket a mérendő szövegre, kiolvastam a label magasságát, és szoroztam 15/12.75 értékkel, ami úgy tűnik, egy konstans (a munkalapon a cella belső margói miatt ennyivel nagyobb a sormagasság). Ez a módszer az összes (kb. 300 db) tesztelt szövegre jól működött. Viszont azt nem tudom, hogy az említett konstans szorzó más karakterméret vagy más betűtípus esetén is ugyanaz-e, szóval itt van egy bizonytalanság.
De az ötleted rávezetett egy olyan megoldásra, amiben pillanatnyilag nem találok hibát.
Egyszerűen fogok egy sima oszlopot, aminek a szélességét beállítom akkorára, mint a 3 összevont cella együtt, abba beleteszem a szöveget, és leolvasom a sormagasságot.
Csak két problémám van vele. Az egyik, hogy a megoldás feltételezi a Courier használatát, mert abban a karakterek szélessége azonos. De mi van, ha nekem az nem jó? A másik, hogy a szavak hosszától függően a tördelt szöveg egy-egy sorában nem azonos a karakterek száma, sőt, elég nagy eltérés lehet közöttük.
Makró nélkül is meg lehet csinálni, a hivatkozásokat egy eldugott menüpont előcsalogatásával át lehet változtatni:
2010-ben:
Fájl - beállítások - menüszalag testreszabása
A választható parancsok helyénél megkeresed a Fájl lapot, ezen pedig a Fájlhivatkozások szerkesztése pontot.
Utána a jobb oldalon (menüszalag testreszabása) kiválasztod a kezdőlapot, majd új csoport hozzáadása (egyéni), ide
felveszed ezt a parancsot és OK
Ezután a kezdőlapon (valószínűleg a végén) megjelenik a Fájlhivatkozások szerkesztése. Ezt felhasználva módosíthatod az értékelő lapok hivatkozásait a kívánt mappára.
Ha mégis a makró mellett döntesz, akkor egy kiegészítés:
Az előző makróban van egy "kis" hiba. Ezzel kellene kicserélni:
Private Sub Workbook_Open() Dim alink(), mappa As String, ertekelo() As String, link As Variant ertekelo = Split("Értékelő1.xls,Értékelő2.xls,Értékelő3.xls,Értékelő4.xls", ",") mappa = Replace(ActiveWorkbook.FullName, ActiveWorkbook.Name, "") alink = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks) For Each link In alink For xx = 0 To UBound(ertekelo) If InStr(link, ertekelo(xx)) > 0 Then ActiveWorkbook.ChangeLink link, mappa & ertekelo(xx), Type:=xlLinkTypeExcelLinks End If Next Next End Sub
(és az értékelő lapokat kiterjesztéssel együtt kell beírni!)
Az is lehet egy megoldás, hogy a 3 összevont cellába írandó szöveg betűtípusát átváltod curier-re, a sablonon megszámolod hány karakter egy sor, majd a sormagasság =(integer(hossz(szöveg)/(karakter/sor))+1)*sormagasság.
Visszatérnék egy kérdés erejéig az offsetes dinamikus tartomány meghatározáshoz. Ha így deklarálok egy tartományt, akkor a Névkezelő Érték oszlopában nincsenek értékek csak három pont. Igy: {...}. Ha viszont Listásan határozom meg a dinamikus tartományt, akkor a kapcsos zárójelek közt szépen felsorolja a cellaértékeket. Miért van ez a kétféle adatközlés? És főleg: Mit jelez a három pontos változat? Azt biztos nem, hogy üres a tartomány, mert az elemei lekérdezhetők.
Ha feltételezzük, hogy az összesítő mindig ugyanolyan és a 4 értékelőlap is ugyanazzal a névvel van ellátva, akkor én a következőt tenném:
Feltételezem, hogy van egy összesítő, amelyik tartalmazza a hivatkozásokat a megfelelő értékelőlapokra (amik lehetnek üresek is akár).
Az összesítőt betenném az adott személy mappájába. A megnyitáskor lefuttatnám az alábbi makrót:
Private Sub Workbook_Open() Dim alink(), mappa As String, ertekelo() As String,xx as Integer ertekelo = Split("Értékelő1,Értékelő2,Értékelő3,Értékelő4", ",") mappa = Replace(ActiveWorkbook.FullName, ActiveWorkbook.Name, "") alink = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks) For xx = 1 To UBound(alink) ActiveWorkbook.ChangeLink alink(xx), mappa & ertekelo(xx - 1) & ".xls", Type:=xlLinkTypeExcelLinks Next End Sub
Ezzel az összes hivatkozás átkerül az adott mappában levő fájlokra, és meg is kapja az értékeket, mire kinyitod.
Ezután azt teszel vele, amit akarsz.
Hova kell tenni a makrót? Alt F11 -el megnyilik a Visual Basic Application ablak. Elvileg itt látnod kell a project felépítését.
A Thisworkbookra rákattintva megnyilik a kód ablaka.
A bal oldali lenyílóban megkeresed a Workbook-ot. A jobb oldali lenyílóban pedig az Open -t.
Elvileg a fent vastagon kihúzott szöveg jelenik meg a kódablakban. Közé másolod azt, ami közte van.
Az Értékelő1, Értékelő2 .... helyébe beírod az értékelő lapok nevét kiterjesztés nélkül.
A For ciklusban levő .xls -t megváltoztatod az értékelőlapok kiterjesztésére.
Ezután elmented a fájlt makróbarátként (.xlsm kiterjesztés) és bezárod.
Amikor újra kinyitod, látni fogod a kitöltött értékelő lapot.
Az összes többi embernél csak annyit kell csinálnod, hogy bemásolod a mappájukba az összesítőt és megnyitod.
Esetleg rákérdez arra, hogy a csatolásokat frissítse-e, akkor azt mondod neki, hogy igen.
Az összesítő táblából egy darab van valahol az emberek mappáin kívül? Igen a mappán kívül van az összesítő.
Az összesítő tábla mindig ugyanaz a formátum és a négy értékelőlapról tápálkozik? Igen mindig ugyanaz és mindig 4 értékelő lap tartozik egy emberhez
A négy értékelőlap mindig ugyanazt a nevet viseli minden embernél és ugyanolyan szerkezetű? Igen minden ugyanaz bennük
Mi történik az összesítő táblával, miután kitöltötted ilyen módon? Kinyomtatod, elmented, elküldöd? Utána megsemmisül? Vagy kezded újra az új emberrel? mentem az összesítőt és a lapokat is, mert meg kell őriznem mindenkiét
Az összesítő táblából egy darab van valahol az emberek mappáin kívül?
Az összesítő tábla mindig ugyanaz a formátum és a négy értékelőlapról tápálkozik? A négy értékelőlap mindig ugyanazt a nevet viseli minden embernél és ugyanolyan szerkezetű?
Mi történik az összesítő táblával, miután kitöltötted ilyen módon? Kinyomtatod, elmented, elküldöd? Utána megsemmisül? Vagy kezded újra az új emberrel?
És kőbe van vésve, hogy külön mappában kell lenniük?
Első körben azzal próbálkoznék, hogy az összesítő munkafüzetben valahova felírom a feldolgozandó neveket, és abból kreálok hivatkozást. Így átnevezés esetén csak ott kell módosítani.
Nos, Jönnek hozzánk emberek akiket különböző adatok alapján kell értékelnünk. Ezeket egy értékelőlapon tesszük. Egy embernek 1 mappája van és négy értékelő lapja. Párhuzamosan történnek az értékelések.
Az eredmények egy összesítő táblába kerülnek ahova egyszerű cellahivatkozással gyűjtöm az adatokat. A mappa neve lenne a személy neve, ezt azonban nem tudom módosítani, mert akkor elveszik (logikusan) a hivatkozás. Hogyan tudom megoldani, hogy ne legyen gond a mappa nevének átírása vagy hogyan tudom átstrukturálni az egészet?
Én sem egészen értem, hogy mi a helyzet nálad, de talán az alábbi megközelítés viszonylag könnyen hozzáigazítható. Ez konkrétan azt csinálja, hogy egy külső füzet celláját hívja be.
A munkalapodon egy elkülönített részre, a példában az a1:a6-re, beírod az alábbiakat:
a1: Path a mappáig
a2: mappa
a3: filenév
a4: munkalap
a5: cella
a6: +a1&a2&a3&a4&a5
|gy az a6 tartalmazza az első hivatkozást. Ha bármelyik változik , akkor csak a megfelelő cellát írod át.
Majd ezt a makrót futtatod:
Sub gabocahivatkozas() Dim a$ a = Range("A6") ActiveCell.Formula = "=" & a End Sub
Az a1:a5-t úgy tudod a legegyszerűbben kitölteni, ha manuálisan csinálsz egy megnyított fűzetből egy cellabehívást, majd ezt a hivatkozást használod mintának, a forrás fűzet bezárása után.
Mindkét esetben "elveszted" a képletet, csak az érték marad meg, tehát célszerű a munkalapról másolatot készíteni és azzal dolgozni.
A 2. verzió azért jó, mert több cellát is ki lehet jelölni és átalakítani ilyen módon egyszerre - de ezeknek összefüggő területen kell lenniük (Pl. A1:C4 esetén működik, de A1 és C4 kijelölése (2 cella) esetén nem).
Sziasztok! MS Excel 2007-ben hogyan lehetne megoldani hogy egy cella - függvény által kiszámolt - értéke megmaradjon az után is, hogy a függvényt eltávolítom? erre azért van szükségem, mert webes sql adatbázisból exportált táblázatot szeretnék szerkeszteni ( pl: cellaérték=munkafüzet1!A1*0,8 ) majd visszatölteni a szerverre. csakhogy az adatbázis kezelő nem tudja értelmezni a függvényekkel tűzdelt xlsx-et. köszönöm a segítséget!
Egzakt megoldást akkor lehet javasolni, ha egyértelműen leírod a helyzetet és a feladatot. Amit eddig leírtál, távolról sem egyértelmű, legfeljebb saját magad számára. Próbáld más szemével nézni, és részletezd még egy kicsit.
Gondban vagyok, nagyon hálás lennék ha tudnátok segíteni. Nem vagyok nagy exceles.
Egyszerű cellhivatkozással egy munkafüzetből és mappából kell adatokat egy összesítenem egy másik mappában lévő excelbe. A forrás excel mappájának a neve folyamatosan változik. Ez alapján tudjuk megkülönböztetni az embereket.
Ha változik a mappa neve a hivatkozás sem lesz jó és állandóan módosítani kell. Hogyan tudnám ezt megoldani?
Szerintem is kerülő út kell. Mivel csak az egész sor magasságát tudod változtatni, kétféle megoldást gondolok:
Az egyesítést megszüntetni. Az első cellába beírni a szöveget, sortöréssel több sorba kapcsolóval. Sormagasság automatikusra állítása. Megállapítani, hogy most milyen magas a sor. Ha 3 cella lesz egyesítve, akkor ennek a harmada lesz a sormagasság. Ezt beállítani a teljes sorra, majd újra egyesíteni a 3 cellát.
Addig egyezik az elsővel, hogy megállapítjuk a sor magasságát. Megnézzük, hogy mennyi a munkalapon egy normál sor magassága. Ezzel elosztjuk a magasságot, azaz ennyi sort kell egyesítenünk. Most megszüntetjük a sortörést. Kijelölünk 3 cella szélesen x sor magasan egy területet és ezt egyesítjük. Visszaállítjuk a sortörést, beállítjuk az igazításokat.
A második verzió előnye, hogy nem az első sor magasságát állítjuk át, hanem a "magyarázat" területet növeljük meg. Ez akkor működhet, ha ezt a területet (mármint a "magyarázat" alatt levőt") nem használjuk.
Adott egy sablon munkalap, amit egy (SK, ne figyelj ide) adatbázisból feltöltök adatokkal.
A sablon egyik részén 3 cella vízszintesen egyesítve van, ebbe egy változó hosszúságú szöveg kerül, konkrétan egy szöveges leírás arról a tárgyról, amiről az egész munkalap szól. A szöveg hossza 3 szótól felfelé, határ a csillagos ég.
Ez a munkalap ugyebár nyomtatva lesz, ezért jól kell kinéznie. Szeretném az összevont cellák magasságát programból akkorára állítani, amekkorában pont elfér a szöveg. Az AutoSize erre pont jó lenne, csak éppen nem működik egyesített cellák esetében, ezt Billy Gates is elismeri. Akkor hogyan?
Kerülő úton megoldottam, de kíváncsi lennék, kinek milyen ötlete van erre.
Sebaj, a listával bevitt alcsoportoknál továbbra is tudja az ofszetes hivatkozást. Az utóbbit azért díjazom, mert a választ-hol.van párossal több tétel esetén már nagyon észnél kell lenni a képlet bevitelekor (elírás, szintaktika).
Nekem úgy tűnik, az adatérvényesítési képletben az indirekt nem képes érzékelni az elnevezett tartomány eltolással(offsettel) történt meghatározását. Nem tudom, hogy amíg jól működött, akkor hogyan volt a név meghatározva.
Viszont a =Választ(hol.van(a1;F1:F2;0);Név,Város) működik az eltolásos verzió esetén is. (sorry,sorry,sorry).
Egyenlőre azt látom, hogy a névhez tartozó tartományt nem képes "megfogni". Nem működik a names(1).referstorange.select, pedig a refersto kiirja a képletet rá.
Ha többet tudok, jelentkezek, ha net közelben leszel írj.
Ma reggel óta érvényesítésben nem működik nálam az INDIREKT függvény. 3 Excel verzió van fent a gépemen, és egyikben sem tudom rábeszélni, pedig eddig mindhárom elfogadta.
Előbb mindháromnál beindítottam a javítást, majd törlés, újra telepítés. Eredmény: semmi.
A lapokon nincs gond a függvénnyel, csakis az érvényesítésben.
A kép alapján a 4 adatsor most térhatású. Induljuk ki ebből az állapotból.
Próbáld meg a következőt:
a diagramra valahol jobb egérgombbal kattintasz (célszerűen egy olyan helyen, ahol nincs sem adat, sem tengely)
kiválasztod a más diagramtípust
megjelenik a képeden is látható beállító ablak
itt kiválasztod az oszlopok közül a másodikat - halmozott oszlop
OK
Ezzel átalakítottad a diagramot 2 dimenziósra.
Most kijelölöd az összesítő adatsort:
jobb egérgomb
sorozat-diagramtípus
vonaldiagram típusból kiválasztod a neked tetszőt
OK
Ezután úgy formázod a vonalat ahogy szeretnéd. Az oszlopdiagramok színezését is tetszés szerint alakíthatod, akár színátmenetesre is, hogy úgy nézzen ki mintha térben lenne.
Remélem, sikerülni fog.
Most egy darabig még itt leszek, várom az eredményt.
Szerintem ne fecséreld el a drága idődet erre. Nézz körül a készletnyilvántartó programok között, azokat már megírták profin és szinte biztos, hogy lehet excelbe exportálni belőlük.
Vagy:
prog.hu állás rovatban hirdesd meg, biztosan lesznek akik profin és gyorsan megcsinálják Neked.
Úgy gondolom, ezek lehetnének a legjobb megoldások számodra.
(Itt minden lépéssel külön kellene foglalkozni, az összefüggések pedig ugye nálad vannak....)
Azt hiszem, közben rájöttem mi a hiba: Nem lehet 2 dimenziós és 3 dimenziós elemeket kombinálni, illetve a 3D diagram csak egy fajta lehet.
Ha összesítős diagramot akarsz, akkor 2D-s megjelenítést kell választanod, pl a második oszlop diagram és ehhez tudod az összesített adatokat vonaldiagram formájában hozzáadni.
Kijelöltem az összesítő adatsort, majd a sorozat-diagram módosítása után az egész diagramon átállította, nem csak a kijelölt adatsoron. Vajon mit rontok el?
Microsoft Office for Mac Excel 2011 (ott rohadjon meg ahol megszületett az aki ellopta thinkpadem, emiatt az asszony régi macbookjára vagyok száműzve) :(
Sosem tanultam az excel használatát, igazából vendéglátós vagyok és egy frankó, részletes, gongyölíthető, pivot táblásítható, standot szeretnék létrehozni, amiből statisztikák, stb. is lehívható, illetve tudja kezelni a napi bejövő árukészletet, stb.
De az excel ismerete egyébként hihetetlenül megkönnyíti egy vállalkozó életét, egészen elképszető dolgokat lehet vele csinálni. Ennek lenne értelme informatika órákon.
Ha elkészül majd feltöltöm nektek véleményezésre. Igazából van még egy nagyon nehéz rész benne, ha ezt a csoportosítós részt megoldottam akkor majd azzal még hozzátok fordulok, de egyébként utána csak adatfelvitel és sziszifuszi munka.
Bocs az OFF-ért.
De visszakanyarodva. A következő probléma az lesz, hogy fel fogom vinni az adatokat, kvázi, mintha bevételeket összesítenék dámutom alapján.
Ekkor egy mérést kell végezni, aminek az eredmélnyeit fel kell vinni. És a felgönyölített bejövő áru mennyisége minusz a mérés adja meg a fogyást.
És ezt a fogyást kéne majd Pivot táblába rendezni.
Ugye a rengeteg adat lesz, ilyen kb egy sor:
jan1; Rövidek; Vodkák; Sobieski; 1l; 3600 Ft
És ezekből nagyon sok. Ezeket mind göngyölíteni, akár kiemelni időszakokat,stb. Tulajdonképpen egy készletnyilvántartó táblát szeretnék összehozni, amiben van lehetőség az ellenőrzésre is.
Azért mondtam ezt el, mert ha esetleg lapul a winchestereteken egy ilyen készlet tábla, akkor lehet, hogy annak az átszabása egyszerűbb volna, mint felépíteni egy vadi újat a nulláról. :)
Előre is köszi a segítséget, még ma éjjel szerintem megnézem a "Choose-Match" módszert.
Én is találkoztam ezzel a jelenséggel, mikor google spreadsheetről másoltam be számsorokat sima excelbe. Én úgy oldottam meg, hogy a forrás helyén format cells alatt sima numbers-re állítottam és kivettem a 1000 separator-t.
Sajnos a szóközös keresős nem veszi ki belőle, én is próbálkoztam ezzel. Egyébként meg az szerintem ctrl+f.
Megkeresed a Keresés és csere párbeszédpanelt, ahol
Keresett szöveg: szóközt gépelsz be
Csere erre: nem írsz be semmit, vagy ""
majd az összes cseréje gombra kattintasz.
Ha olyan cellák is vannak a munkalapon amelyekben nem akarod kiszedni a szőközöket, akkor a cseretartományt kijelölöd.
Érdekes, hogy a súgóból nem lehet megtudni, hogy hol van a Keresés és Csere panel. Legalábbis nem találtam a 2007 sugóban. Ebben a Kezdőlap menűszalag jobboldalán. A 2003-ban meg a Szerkesztés menüpont alatt.
A segítségeteket szeretném kérni! Egy oszlopban 650 soron keresztül számok vannak, amivel számolni szeretnék, de a számok ezres értékenként szőközökkel vannak elválasztva tehát így néz ki: 112 897 654 254. Hogyan, mivel tudom egyszerűen, gyorsan átalakítani a számokat úgy, hogy számolni tudjak velük, ergo eltüntetni a szóközöket?
Nem kell offsetes definiálás akkor sem és listának sem kell lennie, ha a névvel megjelölt tartományba beszúrsz egy cellát és oda írod be az új értéket.
Ilyenkor az excel módosítja az összes hivatkozást.
Bocsánat, de csak most tudok válaszolni. Köszönöm szépen, azt elfelejtettem írni, hogy Excel 2007-ben kell valahogy megoldani. Itt pedig nem találom az alábbi beállítási lehetőséget:
"kiválasztod a vonaldiagramot és bejelölöd, hogy csak erre az adatsorra"
Közben megnéztem az SQL által belinkelt YouTube-os változatot, ahol a tartomány elemeit egy listává alakított tartományba foglalja a videó készítője. Ebben az esetben nem kell az ofszetes hivatkozás.
az "egyszer szerepeljent" úgy értettem, hogy oszloponként egyszer szerepeljen. Természetesen azonos adat lehet A-ban és B-ben is, De C-ben csak az legyen ami A-ban is van
A dinamikus tartományt így tudod beállítani (a példában az E oszlopra) a hivatkozás rovatban:
=offset($E$1,0,0,counta($E:$E),1)
A counta a magyar darab2 eredetije, ami megszámlálja, hány kitöltött cella van az E oszlopban. FONTOS, hogy a cellák egymást követően legyenek kitöltve, és ne legyenek más, nem az elnevezendő tartományhoz tartozó adatok az oszlopban. Bár ha tudod, hogy mondjuk 20 értéknél nem lesz több a kategóriában, akkor a counta($E$1:$E$20) is jó. A következő kategória kezdődhet a 30. sorban, ahol a képlet
=offset($E$30,0,0,counta($E$30:$E$50),1)
Az első azt jelenti, hogy az E1 cellából kiindulva kezdődik a tartományod. A kezdet helye ettől nulla sorral lentebb, és nulla oszloppal jobbra (tehát E1-ben) lesz. A sorok száma annyi, ahány cella pillanatnyilag ki van töltve az oszlopban, az oszlopok száma pedig 1.
Mikor a 2-3, vagy több kategóriát elnevezted, jöhet az első érvényesítés bevitele. A Forrás mezőben állva F3-ra megkapod az elnevezett tartományok listáját, onnan kiválasztod a példa szerinti Kategóriák nevet.
A második érvényesítésnél a forráshoz beírod az indirect függvényt.
Egyrészt, szerintem kaptál arra is megoldást (Delila 10 23963).
Másrészt most sem egyértelmű a kérdésed.
"azt szeretném hogy a C oszlopban csak azok az adatok jelenjenek meg amelyek csak A-ban vannak. Viszont mindegyik oszlopban egy adat csak egyszer szerepeljen"
Ez így mindjárt két kérdésnek látszik:
ne legyen az A és B oszlopban ismétlődés
a C oszlopban azok az adatok jelenjenek meg, amelyek csak A-ban vannak.
Az ismétlődés eltávolítására ajánlom az adatok - ismétlődések eltávolítása menüpontot.
Ha már nincsenek ismétlődések az oszlopokban, akkor a C1 képlete:
tegnap már kérdeztem, de lehet,hogy rosszul fogalmaztam, ezért megpróbálom ismét:
olyan képletet szeretnék hogy:
van három oszlop, A és B oszlopban adatok vannak és azt szeretném hogy a C oszlopban csak azok az adatok jelenjenek meg amelyek csak A-ban vannak. Viszont mindegyik oszlopban egy adat csak egyszer szerepeljen
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.)
Hát nem leányálom valóban. Pl. épp most jöttem rá, hogy a Neomatiknak javasolt nap() függvény használata se 100-as, mert az meg a hónapokat vágja le. Tehát a nap(32) eredménye is 1, mert a febr 1 napját jelöli :))).
Még annyit hozzáfűznék: Ha a szumma idő formátumát átállítod általánosra 1,279942-t fog mutatni, amiből a törtrész a 6:43:07, amihez 1*24-t kell hozzáadnod, ha órákban akarod a teljes időhosszt kifejezni.
Az idő és dátum adatok nagyon ravaszul viselkednek az excelben. Ami a legfontosabb:
Az excel ezeket is számként tárolja és számként számol velük, a következők szerint:
A szám egész része jelenti a dátumot, a törtrésze pedig az időt. Ezért a megformázott idővel különösen nehéz bánni, célszerű a számolások idejére átalakítani számmá:
1 nap=24 óra =1, tehát 12 óra=0,5 , 3 óra 20 perc (=3*60+20)/24
Ezután már minden összeadás "normális számként" múködik. Utána pedig megformázhatod időnek.
Nekem legalábbis így sikerült használható és jó időadatokat kapni.
(De az időformátumból közvetlenül számított értékekben soha nem bízok meg, az sajnos az excel "jóindulatától" függ, mennyire stimmel.) Na jó, biztos van erre valami más szabály is, de arra még nem jöttem rá.
Nem rontottál el semmit. Nem kell csinálnod semmit. Csak engedni, hogy az excel [ó]:pp:mp formátumban közölje az eredményt. Vagy ha nem abban adja, átállítod manuálisan. Az ó:pp:mp formátum ugyanis csak az utolsó (töredék) nap óra-perc-mp-t mutatja. Tehát ennél a formátumnál a nap() függvény is kell a korrekt időhosszhoz.
A legegyszerűbb megoldás a sor magasságának állítása: range("A1").rows.autofit /vagy a menüben kezdőlap-formátum-automatikus sormagasság. Persze ekkor az egész cellatartalmat látod.
Köszi, hogy ennyit dolgoztál vele. Azt hittem, van ennél egyszerűbb megoldás, a beállítások terén vagy valami ilyesmi :) Őszinte leszek: nagyobb az esélye, hogy ezt a makrót nem fogom alkalmazni, mint az, hogy fogom alkalmazni.
Ha a cellából enterrel kilépsz, az utolsó 5 sort látod. Ha visszalépsz a cellára, akkor az elejétől látsz 5 sort. Most a FONTOS! Ha visszaléptél a cellára, F2 és utána enterrel lépj ki, akkor ismét az utolsó 5 sort fogod látni (ha nem így teszel, marad az első 5 sor). Ha alt+entert hagytál üresen a végén, azt levágja a makró.
Private Sub Worksheet_Change(ByVal Target As Range) mutat Target End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) vmutat Target End Sub
Function mutat(ByRef cl As Range) Dim aml() As String, xx As Integer, yy As Integer If Not IsEmpty(cl) Then Application.EnableEvents = False If Right(cl.Value, 1) = vbLf Then cl.Value = Left(cl.Value, Len(cl.Value) - 1)
aml = Split(cl.Value, vbLf) yy = UBound(aml) If yy > 4 Then cl.Value = "" For xx = yy - 4 To yy cl.Value = cl.Value & aml(xx) & vbLf Next For xx = 0 To yy - 5 cl.Value = cl.Value & aml(xx) & IIf(xx <> yy - 5, vbLf, "") Next cl.Value = cl.Value & "FORD" End If Application.EnableEvents = True End If End Function
Function vmutat(ByRef cl As Range) Dim aml() As String, xx As Integer, yy As Integer If Not IsEmpty(cl) Then If Right(cl.Value, 4) = "FORD" Then Application.EnableEvents = False cl.Value = Left(cl.Value, Len(cl.Value) - 4) aml = Split(cl.Value, vbLf) yy = UBound(aml) If yy > 4 Then cl.Value = "" For xx = 5 To yy cl.Value = cl.Value & aml(xx) & vbLf Next For xx = 0 To 4 cl.Value = cl.Value & aml(xx) & IIf(xx <> 4, vbLf, "") Next End If Application.EnableEvents = True End If End If End Function
Van egy cella, alt+enterrel több sor van benne. Kb 5 sor fér el láthatóan egymás alatt a cellában, mert ekkora a sormagasság. Ha 5-nél több sor van, akkor nem látszik ez a többi.
A cella aljába írok amint írnom kell valamit bele, azaz a legalsó sor az aktuális, ez a legfrissebb. De az igazításnál nem sikerült úgy beállítanom, hogy ez az alsó látszódjon mindig és felfelé "csorduljon". Van ilyenre megoldás?
Azért az valahol nem normális, hogy míg a split-re a Dim ho as Variant-ot képessé lehet tenni addig a Dim ho() as Variant-tal ez nem megy. Én legalábbis hiába próbálkoztam.
Sőt! A ho = Replace("Valami", "m", "k") helyett elég ho="valami". Tehát az értékadás beállítja a $változótípust, amire a split nem képes valamiért. Lehet hogy bug. Viszont képes valami nagyon meglepőre. Ami szintén meghökkentett. A makródban sima változóként definiált ho-t, képes tömbbé alakítani. Amit aztán egy újabb értékadás visszalakít változóvá J))))
Sub bont() Dim ho As Variant ho = "valami" Debug.Print ho ho = Split("jan-feb-marc-apr-maj-jun-jul-aug-szept-okt-nov-dec", "-") Debug.Print ho(11) ''Debug.Print ho ENNÉL KIAKAD ho = "tbando" Debug.Print ho End Sub
Sub bont() Dim ho As Variant ho = Replace("Valami", "m", "k") Debug.Print ho ho = 12 Debug.Print ho ho = Split("jan-feb-marc-apr-maj-jun-jul-aug-szept-okt-nov-dec", "-") Debug.Print UBound(ho) End Sub
Itt már nem kényes arra a split, hogy a ho változó variantnak van definiálva!
Kösz. Az első kérdésemmel kapcsolatban azonban van még egy kis hiányérzetem. Miért nem jó a variant? Én abban a hiszemben voltam/vagyok, hogy a variant bármelyik változótípus helyett használható. Ezek szerint nem minden esetben. Tudsz még eseteket amikor nem?
Sub pamparam() Dim Sh As Object, bat As String, RC As Long Dim FilePath As String, rng As Range, ws1 As Worksheet, ws2 As Worksheet
Set Sh = CreateObject("WScript.Shell") bat = "E:\valami.bat" RC = Sh.Run(bat, 1, True)
Set ws1 = ActiveSheet FilePath = "E:\ez a textfájl készült.txt" Workbooks.OpenText FilePath, xlWindows, , xlFixedWidth Set ws2 = ActiveSheet Set rng = ws2.Range("A1").Resize(ws2.UsedRange.Rows.Count) rng.Offset(, 1).Formula = "=RIGHT(A1,8)" rng.Offset(, 1).Copy ws1.Range("A1").PasteSpecial xlPasteValues
ThisWorkbook.Names.Add Name:="tabla", RefersTo:=ws1.Range("A1").Resize(rng.Rows.Count) ws2.Parent.Close SaveChanges:=False End Sub
Én a favágós Opentext módszert használtam a szövegfájl magnyitására. Alternatively, használhatod a tbando által közreadott QueryTables módszert, nekem azzal csak az a bajom, hogy nem ismer(t)em, és nem áll rá a kezem.
2.Akkor érvényesül a compare, ha a delimiter nem különleges karakter, hanem pl. egy betű. Próbáld ki pl. a példát úgy, hogy a delimiter - helyett felváltva x és X.
A compare állásától függően más-más darabra bontja a szöveget.
Azt nem tudom, hogy az excelből, hogyan lehet bat filet futtatni. De ha már megvan txt file, akkor a vágólapos becopyzása már kiválható a txt file megnyításával. Excel 2007-ben: Adatok/Külső adatok átvétele/Szövegből/file . A 2003-ban is hasonlóan: Adatok/Külső adatok importálás/Adatforrás/file. A többit tudod. Majd a végén töröld az adatokat. Ha folyamat elkezdésekor bekapcsolod a makrórögzítőt kész is a nyers makród, amin nem sokat kell már csiszálni. Ahogy saccolom csak a szövegfile nevének a specifikását kell megoldani és az adattörlést a makró elejére helyezni. A szövegfile specifikálst valahogy így csinálnám: Egy cellába mondjuk a H1-be beírnám a szövegfile nevét(xxxx.txt), majd a beolvasó makróban ennyi változtatást:
With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:UserstbandoDocumentsxxxx.txt", Destination:=Range("$a$1")) _ stb
helyett:
filenev:Range("h1")
With ActiveSheet.QueryTables.Add(Connection:= _ "TEXT;C:UserstbandoDocuments" &filenev, Destination:=Range("$a$1")) _ stb
Most, hogy leírtad a megoldást, bevillant, hogy mintha már kérdeztem volna hasonló problémáról. De nem kizárt, hogy megint ki fog menni a fejemből a megoldás :)
Az első részét jól látod! Ha lefutott, akkor kell a szövegállománnyal foglalkozni. A létrejött szövegállomány állandó helyen van és a sorok végén levő 8 karakterre van szükség. Ennek kellene mondjuk egy tabla nevű tartományban lennie, ami mindig újra generálódik, a hossza futtatásként különböző lehet, ezért az előző tartományt törölni kell és a helyére létre hozni az új elemszámú, ugyanolyan névre elnevezett tartományt. Ezt a tartományt arra használnám, hogy egy excel lapon levő táblázatban az fkeressel ellenőrizzem, hogy szerepel egy bizonyos azonosító a "tabla" nevű listában.
Jelenleg úgy működik, hogy kézzel futtatom a bat állományt, a létrejött szövegállományt megnyitva, az egészet kijelölve vágólapra teszem. Az excel táblában egy lapra másolom a1-től beillesztem a vágólap tartalmát. A szomszédos oszlopban levágom a jobb() fügvénnyel az engem érdeklő részt. A kapott adatokat kijelölöm, elnevezem "tabla" néven és örülök! :)
Pontosítsunk. Az alábbit véltem kihámozni a leírásodból.
1. Megnyitod az Excel munkafüzetet.
2. A munkafüzet megnyitásakor automatikusan lefut egy batch fájl (valami.bat)
3. A batch fájl létrehoz egy szövegfájlt, aminek az elérési útvonala és neve előre tudható, és nem az adott futás során dől el. (Ugye?)
4. A munkafüzetben futó programnak érzékelnie kellene, hogy a batch fájl befejezte a futást, utána pedig a 3. pontban létrehozott szöveges fájlt kellene feldolgoznia.
Itt jönnek a kérdéseim.
Mit jelent az, hogy "névvel ellátott lista"? Hol van ez a lista? Mindig újat kell létrehozni, vagy naplószerűen, folyamatosan írni bele az új dolgokat? Mit értesz tartomány alatt? A szövegfájl minden sora külön cellába kerül, vagy az egész szövegfájl egy cellába? A szöveg sorainak az utolsó 8 karakterét törölni kell, és a többi marad, vagy fordítva, pont az utolsó 8 karakterre van szükség?
Szeretnék szövegállományt feldolgozni az excellel. A szövegállományt egy dosos parancsállomány generálja (mondjuk k.bat). A szövegállomány azonos hosszúságú sorokból áll és a sorok jobboldalából 8 karater hosszan levágva szeretném egy névvel ellátott listában látni a tartalmát.
A megoldandó problémám az, hogy a parancsállományt kellene futtatni a táblázat megnyitásakor és a kapott szövegállományt elhelyezni a névvel ellátott listába. Természetesen a lista mérete változik, minden futtatásnál.
Van egyszerű megoldás arra, hogy egy szövegállomány sorait egy tartományba helyezzük el, vagy meg kell nyitni az állományt és sorról-sorra fel kell dolgozni?
Először is gyanús nekem a sok pont a fájlok nevében. Ez nem igazán "kompatibilis" megoldás.
De, ha tudod a fájl kezdő karaktereit és a könyvtárat, akkor a dir() függvénnyel le tudod kérdezni a fájlok neveit és azt be tudod írni egy munkafüzet celláiba.
Pl
sub fileok
dim konyvtar as string,filenev as string, file as string
konyvtar="könyvtár neve" ' teljes elérési úttal, a végén
filenev="Kezdet*"
file=dir(konyvtar & filenev)
sor=1
do while file<>""
range("A" & sor").value=file
sor=sor+1
dir()
loop
end sub
A másik kérdés, hogy az a bizonyos Q1 cella milyen nevű munkalapon van.
Ha az elsőn, akkor egy "szép" hivatkozással elő tudod csalni az értékét a loop után folytatva az előző makrót:
pl. range("B1").formula="='" & konyvtar & "[" & range("A1").value & "]munkalapneve'!Q1"
a munkalapneve az a név ahol az adat van. Teheted változóba is, akkor & "]" & munkalapneve & "'!Q1" a forma a végére.
A hivatkozás aktualizálásához nem kell nyitva lennie annak a fájlnak, ahonnan veszed az adatot, de ha nem volt pontos a hivatkozás, akkor megkeresteti veled.
Egy kis makrós segítségre lenne szükségem. Egy mappában ugyanabban a struktúrában hetenként vannak lementve adattáblák excelben amiknek nekem az egyik fix cellájának az értéke kellene.
Pl. van egy adattábla 2013.01.01.xls és nekem ebben a táblában a Q1 cella értéke kellene,
következő tábla adattábla 2013.01.08.xls és szintén a Q1 cella értéke és így tovább amíg a végére nem ér az összes fájlnak.
Ehhez kellene egy olyan megoldás ami aztán kihozza egy munkalapra a fájl nevét (ideális esetben a benne szereplő dátumot de azt már megoldom) illetve ennek a q1-nek az értékét egy másik cellába, fájlonként külön-külön sorba.
Azért lenne fontos, hogy elkerülhessem az elmúlt két év összes fájljának egyenkénti megnyitását ami elég időigényes lenne.
Nem ismerem a dolog elméleti hátterét, mostanáig nem tűnt fontosnak :)
Annyit mindenesetre megállapítottam empirikus úton, hogy azok az ablakok akkor is dokkolhatók, ha egyáltalán nincs is kódmodul megjelenítve. És jobban átgondolva revideálom a korábbi álláspontom, miszerint a dokkolt ablakok egymáshoz kapcsolódnak. Inkább úgy tűnik, hogy a szülő ablak (VB editor) külső széléhez tapadnak, és e tapadásnak a jellemzőit, lényegében a kapcsolódási (sor)rendet lehet húzogatással módosítani. A kódmodul meg, ha éppen látszik, legfeljebb csak kitölti a maradék, rendelkezésre álló felületet.
Kösz. Így most már azt is érteni vélem, hogy a vba tools/options/docking által felajánlott ablakok között miért nem szerepel a code ablak. Felteszem azért, mert egy ablak sikeres dokkolásához lennie kell legalább 1 másiknak is, ami szintén dokkolható állapotban van. És ezt biztosítja a Code ablak, ami ezek szerint obligát dokkolható.
Korrekt ez a magyarázat? Vagy pontosításra szorul?
A dokkolás valójában azt a jelenséget takarja, amire korábban úgy hivatkoztam, hogy az ablakok egymáshoz vannak ragasztva. Az ablakoknak van egy olyan tulajdonságuk, hogy "Dockable", vagyis dokkolható.
Ha ez be van kapcsolva, akkor a rendszer figyeli az ablak pozícióját, és ha bizonyos helyekre húzod, akkor felajánlja a kapcsolódást más ablakokkal, vagyis a dokkolást. Tehát nem biztos, hogy az ablak dokkolt, mert lehet, hogy nem az, de megvan a lehetőség a dokkolásra.
Ha a tulajdonság nincs bekapcsolva, akkor a rendszer nem figyeli az ablakpozíciókat, nem ajánl fel kapcsolódási lehetőséget, és csak manuálisan tudod mozgatni és átméretezni az ablakokat.
Igen. Így lehetett.Igazgathattam az ablak jobb szélét és belekattintottam. Most mióta a segítségeddel helyrehoztam, újra megszívtam. Fferi dokkolási információit ellenőríztem, dokkoltam a project, a property és a local ablakokat, illetve nem is kellett dokkolnom őket, mert dokkolva voltak, és néztem hogy el lehet-e őket húzni a helyükről. El lehetett. De olyan sikeresen, hogy mostanáig tartott, míg újra sikerült visszacsinálnom :)))). Tehát változatlanul homályos, hogy mi a fenét dokkolt a dokkoló. De nem kísérletezem vele tovább. Inkább örülök annak, hogy most megint normális :))))).
Dokkból úgy lehet kivenni az ablakot, ha a címsoránál fogva odébb húzod. Szerintem nálad sem egyszerű kattintás volt, hanem afféle "csúszó kattintás", amikor azt hiszed, hogy csak klikk, de közben mozog az egér. Én rendszeresen megszívom ezt, amikor pl. egy mappalistában ctrl+bal gombbal jelölök ki bizonyos mappákat, és egyszer csak az egészet bemásolja valahová (mert kattintás-nyomva tartás alatt húztam az egeret).
A dokkolás elvileg a képernyő egyik sarkához - praktikusan a bal felső sarkához - való rögzítést jelenti. A dokkolt ablak helye nem változtatható, csak a szélessége és a magassága (ha teljes képernyős módban vagy, akkor csak a magassága). Ha nem dokkolt az ablak, akkor a nevét tartalmazó fejlécet megfogva bárhová teheted a képernyőn belül (akár kívülre is húzhatod egy részét).
A VBA menü Tools = > options párbeszédpanel Docking lapján állíthatod be, hogy melyik ablakok legyenek dokkolva.
Szia. Ezekkel próbálkoztam magam is. De még arra sem jöttem rá, hogy mit csinál a docking ablak, mert semmi látható hatása nem volt az ablakok ki/be kapcsolgatásának. Az ablak elrendezések, meg annak az ablaknak a subablakait rendezgették, amelyik épp aktív volt. Tulajdonképpen hová lehet dokkolni az ablakokat?
Még annyit hagy kérdezzek, hogy nincs-e véletlenül tipped arra, hogy miféle kattintással sikerült elbarmolnom. Úgy dereng egy jobb felső sarok körüli katt eredményezte, de ennél többet nem tudok rekonstruálni.
A project és az immediate ablakon próbáld a jobb egérgomb után a docable tulajdonságot beállítani.
A kód ablakokat ezután alá tudod húzni és méretezni.
(Esetleg megpróbálhatod az ablakok elrendezését (windows -cascade, tile vertically, horizontally -, nagyobb kavart, mint ami van már nemigen tud csinálni, viszont legalább látod az ablakokat és húzgálhatod azokat.)
Ez valahogy úgy megy, hogy van a "szülő" ablak (ez a VB editor maga) és vannak a "gyerek" ablakok (kódmodul, Intermediate, Locals, Project Explorer, Properties, stb). A szülő ablakon belül az egyes gyerek ablakok állhatnak függetlenül, kvázi "lebegve", és lehetnek "egymáshoz ragasztva", mint abban az állapotban, amit most nem tudsz visszaállítani. Bármelyik gyerek ablakot bármelyik másik gyerek ablaknak bármelyik széléhez lehet pozicionálni.
Ehhez meg kell fogni az egyik ablak címsorát (bal gomb katt és nyomva tart) és odahúzni a másik ablak kívánt széléhez. Például hagyományosan az Intermediate v. Locals ablakokat a kódmodul alsó széléhez, a Project Explorer és a Properties ablakokat a kódmodul bal széléhez szokás állítani. De persze lehet másképp is. A pozicionálandó ablakot egészen addig kell húzni, amíg az ablak leendő helyét jelző téglalap mérete meg nem változik. Akkor kell elengedni. Lehet, hogy kell párszor próbálkozni, mire oda kerül, ahová szeretnéd, de előbb-utóbb biztos jó lesz.
Lenne egy technikai kérdésem. A VB editorban az ablakok átméretezése során sikerült egy olyan helyre kattintanom, hogy az ablakok közös keretbe foglalása megszűnt, és nem találom sehol, hogy ezt hogyan lehetne visszacsinálni. Így most, ha ez egyik ablak méretét szűkítem vagy tágítom, a vele korábban ellentétesen változó ablak mérete nem változik, így azokat manuálisan kell hozzá ígazítanom. Mit kéne tennem, hogy az eredeti helyzet helyreálljon?
Köszönöm szépen:) Még nem használtam ezt a függvényt és ezzel kezdtem ezért nem is volt helyes az eredmény. Még a sortávolságot szeretném csökkenteni cellában
Segítséget szeretnék kérni abban ha egy cellában több eredményt, szöveget összefűzök akkor hogy tudom ezeket enterrel rendezni. Tehát cellán belül szeretnék új sort kezdeni a következő értéknek.
Szivesen segítettem. Ha többet akarsz megtudni az excelről, akkor irány egy excel tankönyv, de minimum a help.
A képletről pár szót:
Az excel az idézőjelben levő értéket konstans szövegnek tekinti. Tehát a "!C52" -ből soha nem lesz más érték.
Az indirekt cella címeket vár, amit az összefűzéssel lehet megadni, ahogyan a képleted is adta.
Ha azt akarod, hogy az 52 változzon, akkor azt ki kell venni az idézőjelek közül és számként kell "hozzáfűzni".
A hozzáadandó érték (változás) számítása:
Az oszlop függvény az adott cella hivatkozás oszlopát határozza meg.
Amikor a képletet jobbra húzod, de a hivatkozásban levő sor számát akarod növelni, azt kell megnézni, hogy az új hely oszlopszáma és az eredeti hely oszlopszáma között mennyi a különbség, ezt kell az eredeti (itt 52) számhoz hozzáadni.
Ezt a számot adja meg az oszlop()-oszlop($AD1) számítás.
Mivel 2 oszlopban levő képletben azonos a sor számának értéke, ezért kell az így kapott különbséget elosztani kettővel, mert 3 cella jobbra lépéshez tartozik egy cella sornövelés. Ezért is kell párosával másolni a képletet.
Kösz. Így tényleg sokkkkkkal áttekinthetőbbbbbbb :))))
De ha már ilyen szép lett, akkor verbálisan is megfogalmazok két hivatkozási szabályt:
A cells tipusú hivatkozásnál a vízszintesen figyelembe veendő cellák csak a Range szélességéig terjednek. Tehát ha a Range a C1 cella akkor a Range/Names(x) hivatkozás a Cx cellára mutat, ha C1:D2 akkor páratlan számuak a Cx/2+1 cellára, a párosak meg Dx/2-re.
Asor/oszlop hivatkozásnál viszont a range szélessége sem számít, mivel a Range/Names(x,y) hivatkozás egy olyan offset-tel ekvivalens, amelyben Range kezdőcella hivatkozása (1,1) Tehát C1 range esetén az offset kezdőcella nincs is a munkalapon :)))).
Amit Te szeretnél, azzal a képlettel soha nem fog működni. Vízszintesen (oszlopirányban) akarod húzni a függőleges (sor) értékeket.
Ezért írtam át a képletedet, ami pontosan azt csinálja, amit kértél. Az első 2 cella képletének eredménye indirekt(C52) és indirekt(E52), a második két cella képletének eredmény pedig indirekt(C53) és indirekt(E53) lesz. És így tovább. Kipróbáltam.
Kérlek, írd be az általam adott 2 képletet az ad és ae oszlop megfelelő cellájába.
Másold át a mellette levő 2 cellára. És pont az az érték lesz, amit szeretnél. De ugyanígy húzhatod egérrel is a képletet.
Ne a képlethez ragaszkodj, hanem az eredményhez lsz.
Megpróbáltam de nem jó! Nem tudom hogy jól fogalmaztam e és értitek a dolgot? Amikor beírom az excelbe egymás alá hogy 1 2 3 és ezt kijelölöm a sarkában lévő kis négyzetet megfogom és lefelé húzom akkor beírja a következő cellákba hogy 4 5 6 .... és így tovább amíg húzom. Na most vizszintesen van ez a képlet 1. oszlopban: =INDIREKT("Munka" & SOR()-1 & "!C52") második oszlopban: pedig csak a C52 változik E52 re így: =INDIREKT("Munka" & SOR()-1 & "!E52")
Azt szeretném hogy ha egyszerre kijelölöm mind a két egymás mellett lévő cellát akkor a következő cellákba ugyan ez a képlet legyen mint fent csak 52 helyett 53 és ha tovább húzom megint két cellával akkor már C és E 54 legyen abba a két cellába. Na most megcsináltam 3 db ilyen egymás mellett lévő cellát és kijelöltem mindegyiket vizszintesen de a 4 páros cellába nem vitte tovább a számot 52 53 54 és nem lett 55 hanem 52-t írt be. Értitek? :D
Az a problémám van hogy vizszintesen szeretnék 2013 as excelbe másolni képletet. Egy termék alá két képlet tartozik. az egyik =INDIREKT("Munka" & SOR()-1 & "!C52") a másik =INDIREKT("Munka" & SOR()-1 & "!E52") Csatoltam is egy képet. Amikor vizszintesen akarom másolni ugyan ezt a képletet másolja. Azt szeretném ha kijelölöm a két egymás mellett lévő cellát például a képen a Racer alattit és áthúzom a Duracer alatti két cellába akkor mind a két képletbe az 52 az 53 ra változzon. Eddig ha ezt megcsinálom akkor ugyan az marad tehát 52 és így egyenként kell átírni az összeset.
Remélem nem írtam le túl bonyolultan! Köszönöm szépen!
Igazad van, a sima range "magában" csak az aktív munkafüzetre(ha a név munkafüzet szintű)/munkalapra(ha munkalap szintű) használható.
Viszont a másik munkafüzetnél sem mindegy, hogy a név munkafüzet vagy csak munkalap szintű. Előbbi esetben elég a munkafüzet + név, utóbbinál viszont ott is tudnod kell a munkalap nevét is.
Hibakezelésnél bizony nem ártalmas egy ilyen sor beszúrása a hiba lerendezése után.
Illetve: a hibakezelő rutin akkor is él, ha abból az eljárásból, amelyikben definiáltad, meghívsz egy másik eljárást és annak nincs külön hibakezelése!
Ilyenkor hiba esetén a meghívó eljárásban levő hibakezelő rutin "kapcsolódik be", visszaugorva a hívó programba és a resume utasításra ismét meg fogja hívni a hibát okozó eljárást.
Az egész példa a B3:E7 tartományból indult ki.(Az első 2 sor mutatta a cellák számát és a tartomány címét.)A folytatás is ebből következett.:)
Viszont, amit mutattam/tunk, az igaz ám a "sima" range("tartomany") meghatározásból kiindulva is, ahogy az előző hozzászólásomban is írtam.
Vagyis az elnevezett tartományon kívül is van élet a munkalapon! A baj csak akkor következik be, ha pl. a negatív cellaindexekkel a munkalapon kívülre kerülsz. Azaz a fenti példában a cells(-3,0) hivatkozás már hibát fog generálni, mivel a munkalapon a sorok kezdő értéke 1 és nem nulla.
Már hogy ne lennének itt gondolatolvasók? Anélkül nem is lehetne a kérdések zömére válaszolni :))))
Na most ez az eltolt kezdőpontú cellameghatározás igencsak rafinált. Érdemes volt feltenned néhány varit. És bár volt amit nem bírtam kigondolatolvasni, pl. hogy melyik tartományban van 25 cella, és hogy melyik tartomány 45-ik cellája a B17, de a többi megfejthető volt. Kiegészítettem a példatárad, hátha másoknak is hasznos lesz. Jól mutatják a cells és a sor/oszlop hivatkozások különbségét, a tartomány Nulla celláját, a nulladik és a negatív sor,oszlop hivatkozással meghatározott cellákat. Csak a makrót kell hozzá lefuttatni. De felteszem képben is.
Sub cellatartomanyhivatkozassal() Dim a, b, c, d, e, f, g, h, i, j, k, l, m, n, o
''Ha tartomany2=d4:e5 akkor a cellacim
a = Names("tartomany2").RefersToRange.Address 'd4:e5
b = Names("tartomany2").RefersToRange(1).Address 'd4 cells típusú cimzesek c = Names("tartomany2").RefersToRange(20).Address 'e13 e = Names("tartomany2").RefersToRange(0).Address 'c4
f = Names("tartomany2").RefersToRange(-1).Address 'd3 g = Names("tartomany2").RefersToRange(-2).Address 'c3 h = Names("tartomany2").RefersToRange(-3).Address 'd2 i = Names("tartomany2").RefersToRange(-4).Address 'c2 j = Names("tartomany2").RefersToRange(-5).Address 'd1
d = Names("tartomany2").RefersToRange(3, 4).Address 'g6 row,column típusú cimzések
k = Names("tartomany2").RefersToRange(-1, -1).Address 'b2 l = Names("tartomany2").RefersToRange(0, 0).Address 'c3 m = Names("tartomany2").RefersToRange(0, -2).Address 'a3 n = Names("tartomany2").RefersToRange(0, 6).Address 'i3 o = Names("tartomany2").RefersToRange(-1, 5).Address 'c3 End Sub
Annyit pontosítok, hogy a függvényből történő visszaugrást úgy értem, hogy csapot-papot otthagy, tehát a függvény további része nem fut le, hanem a hibás sorról azonnal visszalép a behívó részhez.
Újabb rejtélyek. Ma kétszer is találkoztam olyan olyan jelenséggel, hogy amikor hülyeséget írtam a programba, az nem hibát jelzett, hanem nemes egyszerűséggel visszaugrott a függvényből és folytatta tovább a munkát, mintha mi se történt volna. És csak a hibás eredményből jöttem rá, hogy valami nem stimmel.
Az egyik az volt, hogy a find parancs eredményét egy váltoóban kapom meg, aminek a típusa range, és egy cellát ad vissza. Legyen mondjuk eredm as range. És amikor tévedésből a cellatartalomat az eredm.name hivatkozással akartam kiolvasni, a vezérlés visszaugrott a behívó sorhoz, mintha rendesen lefutott volna.
Aztán a másik eset az volt, hogy volt egy numerikus (long) változóm, legyen x. Több helyen teszteltem, hogy az értéke 0-e, vagy sem (if x=0 then...). Namármost egy helyen elütöttem és azt írtam be, hogy if x = "". És ahelyett, hogy type mismatch hibával leállt volna a program (ha jól tudom, 13-as hibakód), itt is tovább ment.
Nagyon kellemetlen, mert ilyenkor csak hosszas nyomkövetéssel tudom megtalálni a hibás sort.
Meg lehet az ilyeneket előzni? Esetleg valami hibás beállítás, hogy nem jelzi a hibát?
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.
Többszörös (beágyazott) ha függvényt ajánlok: ha(c2=1;B1;ha(c3=1;B2*B3;ha( stb.)))
Bár azért azon el kell gondolkodni, hogy a mutatott példádban mit is szeretnél kiírva látni... (mármint hogy minden hivatkozott C oszlopbeli cella értéke 1).
D1-be szeretném az értéket beíratni, Ti milyen függvényt ajánlotok? Amit szeretnék: Ha a C2=1, akkor B1, ha C3=1, akkor B2*B3, ha C4=1, akkor B2*B3*B4, ha C5=1, akkor B2*B3*B4*B5
Nagy szerencséd van, mert én csináltam egy ilyet, kellett a munkámhoz. A Wikipédiából töltöttem le a férfi és női keresztneves cikkek címét. Írjál e-mailt, a hétvégén majd elküldöm.
Köszönöm. Ilyenekkel egyelőre szerencsére nem találkoztam az én közel 3000 nevet tartalmazó listámban. De, ha majd lesz ilyen, akkor majd elkezdek sakkozni:-)
Szeretnék egy férfi és női keresztneveket tartalmazó listát Excel által kezelgető formában. (Vagy legalább az egyiket a kettőből) Láttam, hogy Delila 2010 augusztusában (#12523) feltett egy listát a data.hu-ra 2300 utónévvel, de az ma már nem elérhető.
Megvan még valakinek, vagy van valami hasonló?
Mert szeretném megállapítani egy neveket tartalmazó adatbázisból a szereplők nemét. A név szétszedése vezeték-, kereszt, születési vezeték-, és születési keresztnévre (ahol ezek is vannak) gyönyörűen megy (jó néhány órai programozás után), ahol asszonynév van (-né a vége valamelyik résznek), ott is tudom, hogy nő, csak a legegyszerűbb esetekben a Gipsz Jakab és a Gipsz Ilona esetében nincs eszközöm a nem megállapítására. És több ezer adatról van szó, úgy hogy nem szívesen csinálnám kézzel.
Köszönöm, és működik is. Szamár vagyok, hogy nem jutott eszembe. Hiszen amikor beírtam a vbCompareText szöveget, aminek az értéke 1, a program ezt a kezdőpontnak értékelte.
De nem szeretnék az elütések különböző lehetőségeivel foglalkozni. Azt szeretném, hogy akár Fsz, akár FSZ az eredeti, mindenképp kisbetűs legyen. És mivel más hasonló rövidítéseket is vizsgálok (példának csak ezt az egyet hoztam fel), jó lenne, ha mindegyiket egy lépésben tudnám transzformálni.
Sziasztok, egy nagyon elemi kérdésem van. Lehetséges a replace parancsban a case szenzitivitást kikapcsolni. A következő paranccsal próbáltam elérni, hogy a lakcímben akár kis, akár nagy kezdőbetűvel írták a földszint rövidítését, egységesen kisbetűs legyen. A következő szintaxist használtam:
A leírások szerint a vbTextCompare használatával lesz érzéketlen a kis és nagy betűkre a keresés. A fenti sornak ennek megfelelően azt kellene eredményeznie, hogy ha az eredeti kifejezésben akár Fsz volt, akár fsz akkor is cserélje, ami az utóbbi esetben a változatlanul hagyást eredményezi.
De nem jött össze. A paraméter elhagyásával sem. A VbBinary-val nem próbálkoztam, mert elvileg az lenne case sensitive.
Ha minden igaz az ALT+F11 gomb együttes lenyomásával előjön a Visual Basic ablak. A felső sorba levő menüből kiválasztod az Insert - majd utána a Module lehetőséget.
Sub cserel() Dim intvanS As Integer, intvanSh As Integer, rngvannak As Range, cl As Range Const G = "G", F = "F", S = "S", K = "K", GSZER = 4, FSZER = 2 With ActiveSheet.UsedRange .Columns(1).Copy .Columns("G") .Columns("G").AutoFilter field:=1, Criteria1:=Array("*S*", "*F*"), Operator:=xlFilterValues Set rngvannak = .Columns("G").SpecialCells(xlCellTypeVisible) For Each cl In rngvannak.Cells intvanS = InStr(cl.Value, G) If intvanS > 0 Then intvanSh = InStr(intvanS, cl.Value & " ", " ") - intvanS cl.Value = Replace(cl.Value, Mid(cl.Value, intvanS, intvanSh), S & Mid(cl.Value, intvanS + 1, intvanSh - 1) * GSZER) End If intvanS = InStr(cl.Value, F) If intvanS > 0 Then intvanSh = InStr(intvanS, cl.Value & " ", " ") - intvanS cl.Value = Replace(cl.Value, Mid(cl.Value, intvanS, intvanSh), K & Mid(cl.Value, intvanS + 1, intvanSh - 1) * FSZER) End If Next .Columns("G").AutoFilter End With End Sub
Kiegészítésül:
A columns("G") mint cél oszlop átírható pl. így columns("B") és akkor a "B" oszlopba kerülnek az új adatok.
A const -konstansként definiált - G,F,S,K átírható más betűre is, pl. mondhatod a G-re hogy ="H" és akkor a H-t fogja kicserélni "S"-re, vagy mondhatod az S-re hogy ="Z" és akkor a G-t "Z"-re fogja cserélni stb.
A GSZER és FSZER értéke ugyanígy módosítható
Ha további betűs cserére lenne szükség, akkor a const sorba felveheted az új betűket és a szorzót a minta szerint folytatva és a vastag betűs sorokat annyiszor ismétled, ahány új betűpárost vettél fel -természetesen a két betűt kicseréled -
Ha az előzőek szerint új betűket vettél fel, akkor ezt a sort is módosítanod kell: .Columns("G").AutoFilter field:=1, Criteria1:=Array("*S*", "*F*"), Operator:=xlFilterValues a következők szerint: .Columns("G").AutoFilter field:=1, Criteria1:=Array("*S*", "*F*","*újbetű*), Operator:=xlFilterValues (természetesen csak a betűt írod az újbetű helyére, és annyi plusz betűt teszel be, ahányat cserélni akarsz majd)
Nem egészen értem az adatkezelési stratégiádat. Számomra ilyen a választás:
a) Sok adattal akarok dolgozni, számítógéppel csinálom, ehhez nyilván be kell vinnem a gépbe.
b) Nem akarom bevinni a gépbe, mert nem ér annyit => golyóstoll.
Ha már bent van a gépben, akkor
a) Megőrzöm, mert máskor is szükség lehet rá.
aa) Igyekszem elrendezni az adataimat, és szűrésekkel válogatom ki az éppen szükségeseket (elsődleges preferencia).
ab) Feladatonként külön tárolom.
b) Eldobom, mert számított, nem elsődleges adat, bármikor újból generálni tudom (lényegében az aa) egy alesete).
c) Eldobom, mert komolyan gondolom, hogy már nem lehet szükségem rá (ritka).
"feleslegesen rögzíteném az adatbázisba, mert utána annyi cím és név lenne, hogy nehézkes lenne a keresés" -- ez szerintem az adatbázis fogalmának a félreértése.
Valahogy be kell vinni a gépbe. Ha tényleg el akarod dobni, nem mindegy, hogy az adatbázisodba viszed be, és onnan dobod be, vagy pedig egyenként gépeled be egy Word dokumentumba?
Az adott levél után folytatólagosan csinálsz egy új szakaszt (lap elrendezése = töréspontok= szakasztörés következő oldal), ezután megformázod csak a szakaszra vonatkozóan a papírméretet, átmásolod rá a címet - ahogy a borítékra is - és utána kinyomtatod.
Ha több tv. kell akkor több oldalt adsz hozzá. (A lényeg, hogy a levél formázása és a hozzáadott tv. szakaszok formázása eltérő!)
Vagy úgy hogy mauálisan beírom a körlevél helyére, de akkor is külön dokumentumot kell emgnyitnom, az én általam mondottnál meg egyből abból a dokumentumból nyomtatok.
A másik kérdésedre pedig az a válasz, hogy nagyon sok olyan cím van amit csak egyszeri esetben használnék, és feleslegesen rögzíteném az adatbázisba, mert utána annyi cím és név lenne hogy nehézkes lenne a keresés.
Félreértesz. Ha rámegyek a "levelezés" fülre és után a bal szélen lévő "borítékok gombra" akkor ott nincs lehetőség szerkesztésre, max a borítékok -> beállítások fülön kitudok választani egy másfajta borítékméretet, de szerkeszteni nem tudom hogy belőjem a tértivevénynem megfelelő szöveg elhelyezést. Vagy ebbe a boríték méret listába lehet valahol tenni egyénileg szerkesztettet?
Kiválasztod azt a papírméretet, ami megfelel a tértivevény méretének és tájolásának (fekvő, álló).
Azután készíts egy levélmintát, ahova a címlistából beteszed a címzett adatait oda, ahol a tértivevényen szerepelnie kell, a feladót is odaírod, ahova kell. Egy-két próbanyomattal (üres lapra) szerintem be tudod igazítani.
Ezután már csak be kell tölteni a nyomtatób a tértivevényeket.
Nem rossz amit írtál, tudom is hasznosítani az előre felvett címekkel. Viszont nekem sokszor más-más címet kéne írnom mint amit a körlevél listába már egyszer rögzítettem.
Találtam egy olyan funkciót a "levelezés" fülön hogy "boríték". Ez tökéletesen megfelelne nekem mert itt amit kijelölök egy levélen azt borítékra teszi és nyomtathatok is. Ugyan ezt kellene megoldanom hogy tértivevényre is működjön. Mert mért is ne teljesen más helyre kell hogy kerüljön a tértivevényen a címzett (ball fent-közép tájra és nem jobb lentre), és ugye itt (boriték fülön) nincs olyan funkció hogy csak átrendezem az elhelyezést. :S
A boríték tartalmát a saját szöveged (pl. feladó adatai) és a címlistából való mezőválasztással -pl. címzett adatai - tudod összeállítani. Közben válthatsz a mezőnevek és a behelyettesített értékek között.
Formázni ugyanúgy tudod a mezőket, mint a normál szöveget.
A legjobb elhelyezés "próbanyomattal" illetve nyomtatási nézettel tudod megállapítani.
Nos akkor szánj rá néhány (x10) percet és saját kezűleg megcsinálhatod az alapot:
Levelezés:
Címzettek kiválasztása => új lista létrehozása: A megjelenő ablakot értelemszerűen kitöltöd (akár valódi cimzettekkel is), elmented a javaslat szerinti kiterjesztéssel egy neked megfelelő névvel a saját dokumentumaid közé vagy egy új helyre tetszés szerint.
Utána körlevélkészítés indítása = > borítékok: címzettek kiválasztása
A többit próbáld megoldani.
Ha további segítségre lenne szükséged, írj.
Üdv.
Ps. Ezt szerintem akkor tudod a legjobban használni, ha Te magad hozod létre.
Nem vesztette aktualitását, folyamatosan szeretném használni. :)
A második variáció megfelelő lenne, hogy csak a levél alján lévő címeket kéne borítékra és tértivevényre nyomtatni, nem kell átcímezni az eredeti levelet.
Mert pl. a 2010-ben már a levelezés, körlevélkészítés indítása esetén felajánlja a boríték, cimke verziót is, továbbá a címzettek kiválasztásánál az új lista létrehozását.
Lehet, megérné egyszer ezeken a lépéseken végigmenni:)
De ugye azért az "egy levelet" a címzettek mindegyike külön-külön megkapja papír alapon (másolatban vagy neki címezve)?
Ha neki címezve, akkor ez klasszikus körlevél bizony. Ha csak úgy, hogy az eredeti címzettre van megcímezve és a többi neve, címe ott van a levél alján akkor borítékot v. cimkét is csinálhatsz körlevél módon, csak a formátumát kell megfelelően beállítani a word dokumentumnak és a nyomtatónak.
Másrészt - lehet azóta már megcímezted a borítékokat a levél másolatoknak :) - és az egész feladat aktualitását vesztette.
De szerintem még egy excel tábla létrehozása sem hosszabb, mint amióta polemizálunk.
Ha a levél egyforma, akkor külön dokumentumból nyomtat vagy fénymásol, és csak a boríték meg a tértivevény képezi a körlevél tárgyát. Ezt érzékelhetnénk körborítéknak vagy körtértivevénynek, de technikailag ez is körlevél.
Érteni vélem a problémát. Amit szeretnél azt sem az excel sem a word nem tudja natív módon (magától, külön programozás nélkül) megcsinálni.
A félreértést ha jól látom az okozta, hogy neked csak egy leveled van, de több címzett kapja (mint a hivatalos levelek az alján van a lista a további címzettekről). A körlevél esetén n darab címzett van és n darab levél készül.
Nem, a "törzsdokumentumnak" (vagyis a levélsablonnak) és az adattáblának külön állományban kell lennie. És az összefésülés után egy harmadik jön létre belőlük, de azt nem muszáj menteni, lehet, hogy csak kinyomtatod és eldobod, hiszen redundáns.
Használtan már körlevelet, de csak olyan esetben mikor egy adatbázisban rögzített állományból képeztem a címzetteket. Most pedig az lenne a cél hogy egy levél pár címzettjéből csináljon borítékot és tértivevényt. Magyarul nem akarok pár név miatt adatbázist csinálni mert az tovább tartana mint ha manuálisan megírogattnám a borítékot. A levélre mindenképp rá kell írnom a 3-4 címzettet, és azt szeretném ha ezt a 3-4 nevet nem kéne újra beírogatnom mikor borítékot csinálok.
Azt szeretném megoldani, hogy egy hivatalos dokumentumot ha írok Word-ben és több címzett van akkor mindegyiknek egyből lehessen borítékot és tértivevényt nyomtatni. Úgy képzeltem el hogy a levél végén a "kapják:" után írnám be a címzetteket és ezekből az adatokból kéne borítékot és tértivevényt képezni, akár excelben is jó, csak maga a levél wordben kéne hogy legyen a szerkeszthetőség miatt.
Gondolom megoldható, csak nemtudom hogyan. Ha kérhetem ne csak kétszavas válaszokat írjatok mert azt nem fogom megérteni.
Az is jó lenne, ha a feladatot egyben láthatnánk. Mert arra, amit kérdeztél, Delila megadta a megoldást. Amit most kérdezel, az viszont egy kicsit "homályos":
"mert nem csak B oszlopom van hanem több is."
Hány oszlopod van és melyiket kell szűrni, mi alapján?
"A név mellé még akarok számot, is ami az A oszlopban nem szerepel."
Azokat a számokat honnan veszed? Van egy listád? Vagy csak úgy jön?
"A HA függvénnyel próbáltam az nem rossz,de ha betűt írok akkor hibát ír:("
Milyen hibát ír ki? Mert pl. a betűt idézőjelben kell használni, akkor lesz betűként értelmezve.
Az elsőre: így van jól, de a beállításokban valahol kikapcsolható, ha zavar.
Általában ritkábban akarunk beírás közben a betűk között mozogni, mint a nyíllal átlépni a másikra. Ha mégis, akkor az F2 megnyomásával elérhető a kívánt hatás.
Mindig előjön, ha írok egy cellába valamit és a kurzor billentyűzettel előre (vagy hátra) akarok menni, akkor kilép a szerkesztő módból, vagyis kilép a cellából és a tőle balra eső cellára megy (ha a balra nyilat nyomtam).
Ez nálatok is így van? És miért van így?
A másik, ami engem zavar. Hiába van megadva a magyar terület, a dátumot mégis úgy írja be, hogy az utolsó pontot "letörli". Hiába írom be, hogy
2014.01.18.
az lesz belőle, hogy
2014.01.18
A magyar helyesírás szerint a pontra végződő a jó. Át lehet állítani erre az Excelt?
A következővel nem boldogulok: Minden hónapban készítek egy táblázatot arról, ki melyik műszakban dolgozott és hány munkaórája van.
Amit szeretnék: A oszlopba beírom a műszak számát 1-8-ig. C oszlopba jelenjen meg a műszak kezdete. (pl. 2-es műszak 08:00) D oszlopban a műszak vége. (pl. 16:30) E oszlopban a nettó idő, ami 30 perccel kevesebb, mint a kezdet és a vég időpont között eltelt idő.
Tehát ha az A oszlopba beírok egy számot, a többiben ennek megfelelően jelenik meg a műszakhoz kötődő többi adat.
A kritériumlistát szövegként kell bevinni!!! (A cella elejére ' - aposztróf - kell).
A kritériumként használt tartomány fejéhez rendelj egy nevet (pl. Fej).
A kritériumlistához is rendelj egy nevet (pl.KritList) a következő képlettel : =ELTOLÁS(Fej;1;0;DARAB2(Munka1!$D:$D)-1;1) , ha a kritériumokat a D oszlopba teszed. Ez a képlet dinamikusan kezeli a nevhez tartozó területet. Ha írsz hozzá, bővül, ha törölsz belőle, akkor szűkül (az offset és a darab2 miatt).
Ezután a makro:
Sub szuri() Dim rngcrit As range
Dim vcrit as variant Set rngcrit = Range("KritList") vcrit = rngcrit.Value Columns(1).AutoFilter field:=1, Criteria1:=Application.Transpose(vcrit), Operator:=xlFilterValues End Sub
Ez szépen szűri az A oszlopot. Viszont bármi mást (változót) írok a criteria1-hez, nem veszi be a "gyenge gyomra", nyilván ez még kevés neked az automatizáláshoz.
(Bár, ha arra gondolok, hogy a D2:Dakarmi tartományba be kell írni az értéket, azt elvileg a makróba is beírhatod a szűrés előtt.....)
Ehhez az kell, hogy az A1 cellába írj be egy fejlécet (Pl.fej), a d1:f1 cellákban ugyanezt, majd a d2-be 1, e3-ba 3, f4-be 5.
Ha folytatódik a kritérium, akkor a fejlécet folytatni kell tovább és mindig a következő sorba kell írni a kívánt értéket.(ez jelenti a vagy logikai kapcsolatot a feltételek között azaz a feltétel fej=1 vagy fej=3 vagy fej=5 stb.)
Szerintem számodra az advancedfilter lenne a jobb megoldás.
Azért még nézegetem egy kicsit az autofiltert is, hátha lesz más megoldás.
A "D2:D4" tartomány értékeire kellene az "A2:C16" tartomány "A" oszlopát rászűrni autószűrővel, makróval, tartománymegadással. (Ha a szűrésnél bezavar, hogy a szűrendő tartomány és a megadott egyedeket tartalmazó tartomány egy lapon van, természetesen ez utóbbit lehet külön lapra tenni.)
Milyen excel verziód van? Mert attól függ, hogy mit lehet makróból is csinálni az auto szűrővel. Illetve, kérdés, hogy nem jó-e az irányított szűrő? Jó lenne egy kicsit pontosabban ismerni a feladatot.
Egyébként két lépésben meg tudnám oldani a dolgot (a tartományból beszínezem a kívánt értékeket, majd színre szűrök), de ez valahogy nagyon favágó módszernek tűnik.
1. autoszűrő - ennek a feltétel értékét a megjelenő listából választhatod, vagy kifejezéssel adhatod meg (2010-ben már több egyedi értéket is kiválaszthatsz). Tartományt nem tudsz autoszűrő értékként közvetlenül használni. Makróból viszont be lehet állítani tartományból vehető értéket.
2. irányított (2010-ben már speciális) szűrő - itt előre megadhatsz szűrő feltételeket egy tartományban és ezt használhatod fel a szűrésre, ami történhet helyben vagy más helyre másolással. Természetesen makróból is működik a tartományból szűrés.
A szűrők viselkedése és makróból használata verziótól is függhet.
Excelben, a szűrő működésével kapcsolatban azt szeretném kérdezni, hogy lehet-e a szűrőnek tartományból értéket adni (aminek az lenne a célja, hogy ne egyesével kelljen a lehetséges értékekre rákkatintani), vagy makróban lehet-e tartományból az autofilternek értéket adni?
A felépítése állandó de ha ennyire bonyolult akkor maeada ctrl c p v verzió a képek tekintetében és a szűrők aprod.hu oldalon a feltöltötthirdetéseklekérdezése miatt kérdeztem
Nekem, ha jól értem a kérdést, napokba telne összerakni egy ilyen programot. Ráadásul nem tudnám szavatolni a hosszan tartó működőképességet, mivel a dolog nem tőlem függ, hanem attól, hogy a lekérdezendő weblapnak mennyire állandó a felépítése.
Akkor excelfrissítenem kell. Ahogy ittvagyok a fórumon mindig újabb részeket fedezek fel. Nos akövetkező szintre eljutva (ami nálam nem egy magas szint) szeretném egy honlap adatait lekérdezni
Eljutottam arra a szintre, hogy ezt hogyan is kell adatok megjelennek stb.De mindezt képekkel lehetséges lenne?
Adott egy ismert hirdetési portál. Felviszem a hirdetéseimet mindig ujabbakat mindig bővül ez a termékpaletta stb. A profilomban láthatom a hirdetéseimet szépen egymás alatt fényképekkel árakkal stb. Nos ezeket az adatokat képeket árakat le tudommenteni importban excelre?
Van itt egy érdekesség. Leellenőríztem, hogy jól emlékeztem-e. És meglepve láttam, hogy az ajánlatom a 2007-es excelben nem müködik. Ugyanúgy nem lehet a szerkesztőlécbe írni, mint nálad. A 2003-as excelben viszont minden további nélkül. ??????
Szöveget manipulálni sokkal egyszerűbb Excelben, a pgadminba csak a kész lekérdezés megy.
Eredetileg plpgsqlben akartam megírni, de aki már próbálkozott vele, az tudja, mennyire komoly dokumentációja van egy ilyen nyelvnek... Egy idő után feladtam, és így jutottam a hosszú SQL-kódok birodalmába.
Egyébként csak a hajónapló kedvéért: a legösszetettebb lekérdezés 2330 karakter lett, van benne 17 select, 10 union, 4 intersect és egy except. És ahhoz képest villámsebesen fut. :-)
Ezzel csak az a probléma, hogy az Excel nem engedi 546 képpontnál nagyobbra állítani a sormagasságot, így a sortöréssel együtt sem látom ott egyben, de szerencsére a pgadminban már igen, úgyhogy ezt nem kell megoldani. :-)
Ha sortörést akarsz beszúrni, használd a vblf konstans, ez a linefeed-nek (soremelés) felel meg. Ezen kívül van még a vbcrlf ami pedig a soremelés kocsivissza karaktert szúrja be.
Hogy lehet függvénnyel egy megadott helyen sortörést beszúrni?
Éppen azzal szórakozom, hogy bonyolult SQL lekérdezéseket állítok össze Excelben szövegkezelő függvéyekkel, majd ezek kombinációiból még bonyolultabbakat, és aztán ismét.
Most éppen egy 1559 karakteres lekérdezésnél tartok, ami a DD oszlopban ér véget, úgyhogy félig vakon vezetek, de úgy tűnik, működik. :-) És még messze a vége, a legbonyolultabbat még halogatom.
Viszont ha el akarnám tördelni, akkor nem mindegy, hova kerül a sortörés.
Ilyenkor azért jó a 2010, ezt nem tudnám 2003-asban megcsinálni. :-)
Jó kérdés ahhoz, hogy az ember eltűnődjön a számítógép és a matematika kapcsolatán. Az általános érvényű megoldás nem az Excel formázása, hanem a Word mezőkódjainak a beállítása.
Ez a számábrázolás sajátosságai miatt lehet, mivel a számítógép mindent kettes számrendszerben tárol. Egy átváltás és egy visszaváltás pont elég ehhez.
Sziasztok, egy furcsa jelenség, ami előtt értetlenül állok:
a1 cella: 1,999
a2 cella: 1,998
a3 cella: =a1-a2
Eredmény 3 tizedesjegyig értelemszerűen 0,001
De ha 20 tizedesjegyig állítom be, akkor az eredmény 0.00100000000000011 !
Oké, hogy alaphelyzetben nincs szükség ennyi tizedesjegyre, a dolog úgy bukott ki, hogy a cella értéket beillesztettem egy Word dokumentum körlevélbe, és hiába van az Excelben beállítva, hogy 3 tizedesjegyig számoljon, beillesztésnél a cella teljes értékét beírja a Wordben.
Ötlet, vagy tipp hogy ezt miért csinálja?
Most úgy sikerült áthidalni a dolgot, hogy a kerekítés függvénnyel egy újabb oszlopban megkaptam azt az eredményt, ami kell a Word körlevélbe, csak ez így macerás.
Nálam vegyesen fordul elő - mármint cells és range - mivel elég sokszor oszlopszámot kapok vissza és akkor már kényelmesebb a cells(sor,oszlopszám), mint az oszlopot még betűvé is alakítani. A betűs verzió akkor játszik általában, ha cella címből tudok kiindulni.
Ezért mostanában rátértem arra, hogy cella tartalom/érték helyett inkább magával a cellával (tartománnyal) dolgozom, amiből több mindent ki lehet nyerni, ha szükséges és talán egy kicsit jobban el lehet kerülni a futási hiba keletkezését.
Én viszont nagyobb programban szívesebben paraméterezek. Tehát a "W" az nálam a program elején deklarált beszélő public oszlopnév. Ha például filmcímekkel dolgoznék, és az első 3 oszlop tartalma a sorszám, a rendező és a cím lenne, akkor ssz="A", rendezo="B" és filmcim="C", és onnan kezdve a névvel hivatkozom rájuk. És ha évek múlva hozzá kell nyúlni a programhoz, akkor véletlenül sem tudom eltéveszteni az oszlopnevet. De néha kitüntetett sorok számát is paraméterezem. Ha például többsoros a fejléc, és a 6. az első tényleges adatsor, akkor annak is neve van: elsoadatsor, így nem probléma, hogy a ciklusokat melyik sortól kezdjem szervezni. Sőt, ha egyszer be kellene szúrni a fejlécbe még egy sort, akkor sem kell végigbogarásznom a programot, hogy fordul elő a 6-os szám, mint első sor, amit így 7-re kell javítani.
Így aztán néha a program fejlécében több tucat public változó van deklarálva, és egy - az elején meghívott - függvényben pedig ezek deklarációinak felsorolása (lehetnének konstansok is, de bizonyos okokból az Excelben jobban szeretem a public-ot)
Viszont mostantól át fogok térni én is a cells(sor, oszlopnév) formára, mert az megspórolja a jelenleg használt oszlopszámmá alakító függvényem meghívását.
Egy ideje szívesebben használom a cells(sor, "W") formátumot – ha fixen, nem változóval hivatkozom az oszlopra –, mintha a W helyett 23-at írnék. Könnyebb visszakeresni, miről is van szó.
És szerintem nem is célszerű pusztán a dátum számjegyeit használni fájlnév gyanánt. pontosabban nem szerencsés azzal kezdeni. Célszerű legalább egy szövegkaraktert elétenni. Konkrét exceles példát ugyan nem tudok hozni, hogy zavarokat okozhat-e de valahogy régesrégi gyakorlat, hogy megnevezéseket általában nem kezdünk számjeggyel. Úgy tudom, hogy biológiában az állat- és növényneveknél ez kötelező előírás, személyneveknél, de más tulajdonneveknél sem szokás. A királyoknál is római szám, azaz betű volt a kezdet :-) Szóval kerülendőnek gondolom itt is.
Hát nem feltétlenül bőbeszédű a Help. De a cells-nek ezt a tulajdonságát valami miatt én kezdettől fogva tudtam és használtam, azt már ne kérdezd meg,hogy honnan, mert ha megkövezel akkor sem tudom megmondani. Nehéz is volt megszokni, hogy a Range-ben a betűszám (oszlop-sor), viszont a cells-ben a szám,betű (sor,oszlop) a sorrend. Sokszor összekevertem, néha még ma is. De ha betűd már van, akkor miért nem használod inkább a Range-et, sokkal egyszerűbb a Range("Betű" & sorszáma), mint átalakítgatni a betűt számmá.:))
Szerintem a fájlnévhez nem használhatod fel egy az egyben a dátumformátumot, mivel abban olyan karakterek vannak, amelyeket nem lehet ott használni. Azokat át kell alakítani, pl. a replace függvénnyel a pontok helyére tehetsz aláhúzást, stb.(Illetve ez nyilván dátumformátum függő, vagy használhatod a számalakját is a dátumnak, hiszen a dátumot is számként kezeli az Excel).
Hogyan lehet egy dátum változóhoz hozzáadni pontosan egy évet pl: 2013.01.01 helyett 2014.01.01 legyen. Ezt egy datdátum változóban tárolom ezt szeretném valahogyan növelni egy évvel.
A második kérdésem ehhez kapcsolódik:
Meg lehet valahogy oldani, hogy ez az új dátum legyen a makró által elmentett új fájl neve is egyeben?
És a probléma megoldva..bizonyára a szövegszámok angol formátuma ami gondot okozott...maga a pontok cseréje vesszőre nem oldotta meg automatikussan , de utána Delila javaslata vagy Érték képlet már pozítiv eredménnyel zárult.
A makro nyelve független a területi beállításoktól, internacionalista. Azt írtad, hogy az utolsó sort már meg tudod találni, erre írtam, hogy annak a sorszámához egyet hozzáadva megkapod a következő cellát a sorban.
A cellakereső makró ügyében PImre 23712-es hozzászólására gondoltam, utólag írtam is, hogy bocs mindkettőjük felé.
Igen, csak éppen azt nem gondoltam, hogy a keresés megőrzi az utolsó makróban végrehajtott keresés paramétereit a következő kézi keresésnél.
Egyébként egyre több ilyen elemi felfedezésem van. Például jó egy órája fedeztem fel a cells() függvény egyik újdonságát. Hosszú ideje használom a cells(sor, oszlop) formátumot, és mostanáig meg voltam győződve róla, hogy mindkét paraméternek numerikusnak kell lennie. Ezért ahol string formában áll rendelkezésemre az oszlop értéke, ott mindig átszámítottam azt sorszámra. De néhány hete egy helyen eltévesztettem. Akkor észre sem vettem, most döbentem meg, hogy mitől működik jól. Hát nem elfogadja mindkét változatot? És sajnos a cells() leírását nem találom a VBA helpben.
Ennél egy kicsit bonyolultabb a helyzet. Másik topikban - de lehet, hogy itt is - volt már errő szó és majdnem késhegyre menő vita alakult ki, hogyan találjuk meg az oszlop/sor utolsó celláját, amibe már írhatunk.
Ha folytonos a cellák kitöltése, akkor az End(xldown), illetve End(xltoright) +1 sor/oszlop (offset) megfelelő.
De ha vannak üres cellák közben, akkor ez már nem jó, hacsak nem a "lukakba" akarunk írni.
Ezért sokkal jobb és minden helyzetben használható a Jimmy által leírt mód. ahol a legutolsó sorból, oszlopból indulunk ki és visszafelé nézzük az első tele cellát az End(xlUp), illetve az End(xltoleft) móddal, majd erre jön a +1 sor v. oszlop.
Nem olyan bonyolult és kísérteties, mint amilyennek látszik.
A keresési feltételt úgy kell beírni, hogy "<>" & "szöveg".
Ha tehát a szöveged ="" azaz üres sztring, hogy fogod látni ezt a kifejezést: "<>" & ""? Kitaláltad: "<>". Tehát ez a két kifejezés az excelnél ugyanazt az eredményt adja, azaz nem üres feltételként értelmezi. De ugyanezt jelenti a "*" feltétel is, mivel a * a bármely karaktert helyettesítő "jóker".
Ennek ellentettje, a "=" pedig mit jelent? "Természetesen" azt, hogy üres(!) cellákat keresel.
Viszont amit te írtál be:"<>""" az a nem egyenlő két db idézőjel feltételt jelenti, olyan pedig ugye nem sok cella van/volt az oszlopban.
(Kísérletezéshez javaslom a függvény beírása után a szerkesztőlécen az fx-re kattintva előjövő párbeszéd ablakot, amibe beírhatod a különböző paramétereket és azonnal látod az eredményt.)
Nem egészen a te kérdésedre a válasz (arra Fferi tökéletes választ adott), de azért mégiscsak a kérdéssel kapcsolatos. Én, ha egy táblázat utolsó sorát akarom meghatározni makró nélkül, az alábbi függvényt szoktam használni (ha a táblázat az A oszloppal kezdődik, ha a választott kezdőcellától a táblázat végéig nincs üres cella az oszlopban, utána viszont csak üres cella van):
=darabteli(a10:a10000;"<>")+sor(a10)-1
A problémám e képlettel csak annyi, hogy nem értem a "<>" feltételt. Eredetileg nem ezt akartam beírni, de véletlenül így sikerült. És müködik. Amit meg akartam volna, azaz az "<>""", meg nem a táblázat utolsó sorát adja :))).
Megmagyarázná valaki az első feltételt? Mármint azt, hogy az excel szerint mivel nem egyenlő a nem egyenlő?
Most fogtam csak fel, mi történt. Engem a keresési beállításoknak a makrós keresés utáni megmaradása zavart meg kézi üzemmódban. És ezt most ki is próbáltam, és tudtam reprodukálni a jelenséget. Amikor a programom utoljára olyan keresést hajtott végre, ami pontos kifejezésre keresett, és a program leállítása után az Excelt nem kapcsoltam ki, megmaradt a program beállitása, sőt, még az utoljára használt keresőkifejezés is.
És a program leállítása után is bármely fájl megnyitásakor ezt a beállítást találom, amig ki ne lépek magából az excelből. Nagy reveláció volt:-) Köszönöm.
Akarok egy macrot írni. Egy lapon akarom megtalálni egy oszlopban az utolsó elem alatti cellát. A ctrl lenyillal megtalálom az utolsót, de még egyet lejjebb szeretnék lépni. Hogy tegyem?
A "teljes cellatartalomra való keresés" beállítás nem mentődik munkafüzettel. Lásd a súgót (Range object, Find method):
The settings for LookIn, LookAt, SearchOrder, and MatchByte are saved each time you use this method. If you don’t specify values for these arguments the next time you call the method, the saved values are used. Setting these arguments changes the settings in the Find dialog box, and changing the settings in the Find dialog box changes the saved values that are used if you omit the arguments. To avoid problems, set these arguments explicitly each time you use this method.
Köszönöm. A problémám nem a makróval, csak a kézi kereséssel volt. Megnyitottam egy üres excelt, ott nem volt beállítva a teljes cellatartalom keresése. Akkor viszont lehetséges, hogy a most épp használt fájlomat én mentettem el így, csak nem foglalkoztam azzal, hogy mentés előtt legyen kikapcsolva ez a beállítás. Ezért jelent meg újra, és újra. Most mentettem jó beállítással, újraindítottam a gépet, és most jónak tűnik.
A keresés megőrzi az utolsó beállításokat. Nincs más teendőd, a megnyitott üres excelnél a keresés egyebeknél kiveszed a teljes cellatartalomra vonatkozó jelölést. Ezután mindaddig amíg nem keresel másként, ez a beállítás fog érvényesülni. De a biztonság kedvéért zárd be az Excelt, majd indítsd újra. Ha most keresni akarsz, akkor az a jelölőnégyzet már üres kell legyen.
Egy egészen az alapokat érintő kérdésem van, amit illenék már tudnom ennyi év használat óta. Szóval néhány hete dolgoztam egy adatállománnyal, ahol többször szükségem volt arra, hogy a keresésnél bejelöljem a 'Ha ez a cella teljes tartalma' melletti négyzetet.
Azóta viszont képtelen vagyok megszabadulni tőle. És mivel az a gyakoribb eset, hogy nem a teljes tartalomra keresek, mindig bosszúságot jelent, hogy ezzel az alapértelmezéssel indul a keresés. És nem találom, hogy hol tudnám kikapcsolni.
"Csak" annyi a probléma, hogy a számok angol formátumban vannak a szövegben, ígya amikor az érték függvény átalakítja, akkor a pontok miatt minden olyan számot, amit lehet dátumként értelmezni, dátumnak vesz (pl. 1.20 = január 20-a folyó évben), amit meg nem tud dátumnak értelmezni, arra mondja, hogy értékhiba.
Ugye akkor tudunk igazán segíteni, ha leírod, milyen excelt használsz és kis mintát teszel fel a problémából.
Próbáld meg Delila javaslatát.
Ha angol verziód van, akkor nincs tippem se, mert annak a viselkedését nem ismerem.
Hát azt még elképzelni sem tudom, hogyan lesz 1.20-ból , 41659, de az 1.20 miatt arra gyanakszom, hogyha az exceled tizedesvesszős számábrázolású, akkor az ÉRTÉK függvény nem fog boldogulni a tizedespontos számokkal. Ezért elötte az összes pontot cseréld ki vesszőre. A 2007-es excelben Kezdőlap/Szerkresztés/Keresés/Csere. És utána jöhet az ÉRTÉK. Bár az az igazság, hogy az excel2007-től már el is hagyható.
2.A munkalap első olyan cellájába, amelyben az eredeti munkalap számot tartalmaz, írd be a következő képletet:=Érték(Régimunkalap!cella)
3. Ezt a képletet húzd végig következetesen minden sorra és oszlopra, amelyben az eredeti munkalapon a számok vannak.
4. Ezután az így keletkezett területet jelöld ki. Másolás, irányított beillesztés - értékek.
Ezzel megszűnik a képlet eredeti munkalaphoz kötése.
5. Így a most keletkezett számokat újra kijelölve, másolás - eredeti munkalapra beillesztés. Ezután a beszúr munkalapot akár törölheted is.
Nos a..3. lépés után már ezt kaptam ..kép mellékelve
Ami bár azt mutatja hogy számformátummá alakította , ám pont ez a problémám bármilyen módon szeretném mindig pld. 1.20 szövegformátumból , 41659 számformátumot csinál
Annyiban nem, hogy akkor viszont nem illenék ráállnia és futásidejű hibát jelezni, ha ki akarja a program olvasni az értékét. Más tulajdonságoknál meg tudták oldani, hogy bizonyos beállítási hibákat, ellentmondásokat ignorál a program. Ez is fejfájás a program írójának, de legalább nem a felhasználó szembesül vele. Most még szerencse, hogy most jelentkezett, és nem egy-két év múlva a használatban.
Elég nagy mennyiségű tizedes számok vannak egy munkalapon , amik szöveg formátumban kerültek a táblázatba , ám így persze semmilyen számítást nem lehet végezni velük. Lehet-e valahogy egyszerre szám formátumra alakítani ezeket?
Gugli a barátom de ami leírásokat találtam nem müködnek nekem..
Örülök, hogy megoldódott a probléma. Ezek szerint a curline nem szereti, ha nincs még első(azaz) nulladik sor (vagyis egy karakter sem) a textboxban vagy másban. Hát ezt azért beírhatták volna a Help-be is.
Természetesen én is a form inicializálásába tettem, nem eseményhez kötve. Betettem a debug.print parancsot is, és találtam egy érdekes bugot, merthogy ez nem lehet más: Az Excel hibát jelzett, már a curline olvasásakor is, amikor olyan sorra hivatkozott curline, ami üres volt. Tehát, amikor egyetlen soros volt a szöveg, és a curline hivatkozásnak 2-est kellett volna adnia, akkor hibát jelzett. Viszont chr(13) karakterekkel feltöltve tudta kezelni a parancsot (Innen tudom, hogy a 2-es az értéke)
Sajnos nem egészen jött be. A CurLine 0 értékkel azonnal hibát jelzett (Unexpected call to method or property access), de 1-el ráállt a 2. (0-tól számitva 1.) sorra. Csakhogy amikor a dobozba egyetlen sornyi szöveg kerül csak (ami feltehetően a 0. sorban van), akkor unspecified error hibával áll le.
Viszont nem oldja meg az eredeti problémát. Ugyanis ha már scrollozott lefelé, akkor nem megy vissza, hanem csak az ablak látható tartományában áll annak a tetejére.
TextBox1.SetFocus 'ezt gondolom nem kell magyarázni TextBox1.CurLine = 0 'ez az első sorra állítja a cursort, de csak akkor érvényes, ha rajta van a fókusz a texboxon.
Nagyon köszönöm. Ezek alapján meg tudtam csinálni.
Most már csak egy problémám maradt. Amikor sok a szöveg, és megjelenik a függőleges Scrollbar, az rögtöm a doboz aljára lép. Én meg azt szeretném, hogy alapesetben a beleírt szöveg teteje lássék, és a továbbolvasáshoz kelljen lefelé görgetni. De erre nem látok kapcsolót.
Akkor az eljárás belsejében megnézed, hogy az a bizonyos cella ki van-e töltve. Ha igen, akkor mehet a bezárás, ha nem, akkor cancel=true és nem fogja bezárni a füzetet:
"expression.BeforeClose(Cancel)
expression A variable that represents a Workbook object.
Parameters
NameRequired/OptionalData TypeDescriptionCancel Required BooleanFalse when the event occurs. If the event procedure sets this argument to True, the close operation stops and the workbook is left open."
Visszatérve a 0.00 és a - esetére: Az adott egyedi cellaformázásban a 0 helyére - jel van rendelve. Nézd meg a cellára ráállva a cellaformázás-szám, egyéni formátumot. Ott látni fogod, hogy a negatív szám zárójeles, a 0 pedig - jel.
(az egyéni formázások helpje segít jobban megérteni a témát).
Ilyen lett a lekérdezés rész amelyet tudok használni árajánlatban De egy képeffekt azért jó lenne ehelyett a silány kékszín helyett. Be lehet illeszteni tartományba háttérképet?
Amennyiben a válasz igen akkor a hogyanja érdekelne:)
Bocsi, hulyesegeket irtam (reszben), meg rossz kepeket tettem be, most akkor a tenyleges kerdesek / jo kepek:
Sziasztok!
Felteteles formazassal kapcsolatban lenne kerdesem. Azt szeretnem, ha egy adott oszlopban azokat a cellakat szinezne be, amelyek erteke 0.01-nel nagyobb VAGY -0.01-nel kisebb. Tehat a 0.00-t es a 0.01-et, illetve -0.01-et NEM kellene beszineznie. Kiprobaltam 2 felekeppen is, de egyik sem mukodik tokeletesen, mert a 0.01-es / -0.01-es cellakat is beszinezi (a 0.00-t nem). Kijeloltem sargaval azokat a sorokat, ahol nem mukodik a formazas.
1. megoldas: =OR($G2>0.01,$G2<-0.01)
2. megoldas: abszolut ertek fuggveny es aztan nagyobb, mint 0.01
Mit csinalok rosszul? Kiprobaltam 0.02-vel is, de ugyanaz az eredmeny :(
A G7-es / H7-es cellaban miert - (minusz) es nem 0.00 jelenik meg? elvileg ugyanaz a formatuma az osszes cellanak (ecsettel "lehuztam" az elso sor formatumat).
Felteteles formazassal kapcsolatban lenne kerdesem. Azt szeretnem, ha egy adott oszlopban azokat a cellakat szinezne be, amelyek erteke 0.01-nel nagyobb VAGY -0.01-nel kisebb.
Kiprobaltam 2 felekeppen is, de egyik sem mukodik tokeletesen, mert a 0.01-es / -0.01-es cellakat is beszinezi. Kijeloltem sargaval azokat a sorokat, ahol nem mukodik a formazas. A harmadik sorban az egesz sor sarga lett, a hatodikban viszont a G es H oszlopokban nem szinezte at sargara a cellakat, ennek mi lehet az oka?
1. megoldas: =OR($G2>0.01,$G2<-0.01)
2. megoldas: abszolut ertek fuggveny es aztan nagyobb, mint 0.01
Mit csinalok rosszul? Kiprobaltam 0.02-vel is, de ugyanaz az eredmeny :(
A G7-es / H7-es cellaban miert - (minusz) es nem 0.00 jelenik meg? elvileg ugyanaz a formatuma az osszes cellanak (ecsettel "lehuztam" az elso sor formatumat).
Az AutoSize és a Scrollbars, valamint a WordWrap befolyásolja egymás működését.
Ha a Textbox mérete fix, akkor mindkét scrollbar működik, ha a szövegek vízszintesen vagy függőleges túlmennének a textboxon (és persze a scrollbarok be vannak kapcsolva). Kivéve Wordwrap!
Az AutoSize on esetében a scrollbar nem működik akkor sem, ha be van kapcsolva, ami tulajdonképpen érthető, hiszen a textbox mérete ilyen esetben mindig felveszi a szöveg méretét. Képes "kimászni" a formról is a textbox és akkor nem látod a végét!
A WordWrap on esetében a vizszintes scrollbar nem működik, mivel a szöveget az adott szélességben töri bele a textboxba a rendszer (ilyenkor Autosize On esetén is változatlan a textbox szélessége!).
Tehát az Autosize on-off állapotot programból kezelni kell, attól függően, hogy milyen hosszú szöveget írsz bele.
Mivel a hosszabb szöveg és fix méret esetén a scrollbar működik, az jól mutat. Viszont ugyanakkora textboxban egy rövidebb szöveg már "csúful" néz ki. Így bekapcsolt WordWrap mellett kell a rövidebb szövegre az AutoSize bekapcsolása, hosszabb szöveg esetén pedig egy előre meghatározott fix magasság megadása. Ezzel elérheted, hogy mindkét esetben "szépen" nézzen ki a textbox. (A scrollbar legyen bekapcsolva, és nem kell hozzányúlni, az magától eltűnik és visszajön, ha szükséges a szöveg mérete miatt.)
A bállításokat a Userform inicializálásánál próbáltam. Valahogy így:
Private Sub UserForm_Initialize() Dim text As String text = "Itt olvas be adatállományból egy hosszabb" & Chr(13) & "előre összeállított" & Chr(13) & Chr(13) & _ "szöveget ahol a sorok elválasztására néha egy, vagy két bekezdésjel szolgál" & Chr(13) & Chr(13) & _ "Végül még felteszi a kérdést, hogy véggezzen-e el valamilyen műveletet, vagy sem." SzovegDoboz.Value = text SzovegDoboz.MultiLine = True SzovegDoboz.ScrollBars = fmScrollBarsHorizontal SzovegDoboz.WordWrap = True SzovegDoboz.AutoSize = True End Sub
Miközben ugyanezt a feladatot a következő sorokkal könnyedén megoldom:
Set uzenetdoboz = CreateObject("Wscript.Shell") valasz = uzenetdoboz.Popup(text, 0, cimszoveg, 4)
Ahol a valasz értéke 6, ha az Igen, 7 ha a Nem gomot választotta.
Mutatnál valamilyen kódrészletet a texbox ügyében, mert az autosize és a scrollbar kellene, hogy érvényesüljön, hacsak nem gátolod meg valamivel (pl. Te adsz neki értéket: "If you manually change the size of a control while AutoSize is True, the manual change overrides the size previously set by AutoSize.")
Lehet, hogy valami ilyesmi játszik veled "ördögöt".
Kösz a makrónévadási szabályokat. Az persze nincs köztük, amit nekem sikerült roppant kreativan megszegni :))). Vagy legalábbis nem látom köztük, hogy a cellahivatkozásként is szóbajöhető betű + szám kombinációk használata sem igazán szerencsés.
Viszont sajnos valamiért nálam nem működik az AutoSize. Azt tapasztalom, hogy az egyébként megadott Width és Heigth adatot 1-1.5 értékkel (azt hiszem pixel) módosítja, de nem látom, hogy köze lenne a benne szereplő szöveg méretéhez.
És úgy látom, hogy a ScrollBars beállítás sem eredményez Scroll Bar-t akkor sem, ha szükség lenne rá.
Szóval nem tudom, mit bénázok el, de most hogy a napom nagy része elment vele szégyenszemre átmenetileg feladom, mert holnapra szeretnék eredményt produkálni.
Ezért visszatérek a Popup technikához, ami egyetlen parancssorral egy MsgBox-ra emlékeztető képet ad. Amig ki nem derül, hogy valami gond van vele.
Próbálgatással kiderítettem, hogy miként tudom a konstansokkal befolyásolni a működését. Például azt, hogy OK, OK/Mégse, Igen/Nem, Igen/Nem/Mégse stb válaszra várjon (7 féle van), valamint azt, hogy a válasz hiányában elkapja-e a képernyőt, vagy sem, és ha igen, mennyi idő után. Ráadásul függvényként használva visszaadja a választott gombnak megfelelő konstans értékét (Igen=6, Nem = 7 stb.). És eddig nem találtam meg azt a hibát, amire az MrExelbeli válaszadó azt írja, hogy "AutoDismiss sometimes dosen't work ?". Lehet, hogy csak arra gondolt, hogy az adott konstans bizonyos értékek megadását nem fogadja el. Én mindenesetre csak a 0 értékkel használom, amivel vár a program a válaszra. Nyomjon már gombot az a fránya felhasználó:-)
Szóval köszönöm a segítő szándékot, de nekem most nem jött össze az alternatív (talán szabályosabb?) megoldás.
Néha a legkézenfekvőbb dolgok kerülik el az ember figyelmét - de sokszor jártam így én is.
Másrészt, ha a képek tulajdonságai részben azt állítod be az objektum elhelyezésénél, hogy az objektum helye és mérete nem változik, akkor rendezheted akárhogy, mindig ugyanott marad.
Tehát a rendezés csak akkor működik így, ha az objektum elhelyezése : áthelyezés a cellákkal de a méret marad, vagy áthelyezés és méretezés a cellákkal együtt.
Mertem remélni, hogy nem az első verzió van nálad.
Gyors leszek. A-Z rendezés esetén a képek ugyanott maradnak. Lehetséges hogy rendezés során adott szöveg mellé adott eredeti kép kerüljön? Ha igen hogyan?
Kösz. Azt tudom, hogy a textbox méretét tudom szabályozni, csak az a nehézségem, hogy a szöveg leghosszabb sora alapján megadjam a szélességet, és a sorok száma alapján a magasságot. Egyszer már bütyköltem a szélesség beállítással egy többoszlopos listboxnál, és úgy emlékszem, hogy gondjaim voltak vele. De majd előszedem, hogy végül mire is jutottam.
Az idézett mondatot olvastam, de őszintén szólva nem tudtam mit kezdeni vele. Különösen, hogy még ő maga sem biztos a dolgában, hiszen kérdőjelet tett a megjegyzés végére.
Szerintem külön userform kellene a textboxnak. Akár még úgy is nézhet ki, mint egy MsgBox. A form méretét, rajta a textbox méretét szabadon változtathatod runtime a Height és Width tulajdonságokkal, és a textbox tartalmazhat görgetősávot.
A scriptinges megoldásban van egy sor, amire felhívnám a figyelmedet:
'// Scripting MsgBox, AutoDismiss sometimes dosen't work ?
És még valami. Úgy láttam, hogy a popup ablak dinamikusan méreteződik, azaz alkalmazkodik a benne lévő szöveg méretéhez, úgy a sorok hosszát, mint az ablak magasságát illetően. Nem vagyok biztos abban, hogy ezt a textboxnál is meg tudom-e valósítani. Mert a kevés szöveg egy nagy ablakban nem mutat jól, a sok szöveg túl kis ablakban szintén kényelmetlen, ha sokat kell scrollozni.
Át sem gondoltam. Az újdonság varázsa, és az egysoros parancs lehetősége miatt csak ezt próbálgattam. De akkor majd megnézem textbox-al is. Úgyis egy userformról hívom meg a programrészletet, ahol használni akartam.
Miért kérdezed? Láttál már név nélküli makrót? Legalább egy karaktar kell és az betű legyen. Bővebben idézet a VBA helpből (már megint, de én is innen szoktam okos(k)odni...):
You can't use a space, period (.), exclamation mark (!), or the characters @, &, $, # in the name.
Name can't exceed 255 characters in length.
Generally, you shouldn't use any names that are the same as the functions, statements, and methods in Visual Basic. You end up shadowing the same keywords in the language. To use an intrinsic language function, statement, or method that conflicts with an assigned name, you must explicitly identify it. Precede the intrinsic function, statement, or method name with the name of the associated type library. "
Sziasztok, beleütköztem a következő problémába: Változó mennyiségű üzenetet szeretnék a felhasználóhoz eljuttatni. Ehhez az MsgBox nem alkalmas, mert benne korlátozott az elhelyezhető szöveg mennyisége, és egyes esetekben még a választ lehetővé tévő gombok sem látszanak.
Találtam az interneten egy megoldást (http://www.mrexcel.com/forum/excel-questions/383208-scroll-bar-message-box.html), ahol a scriptinget ajánlja a válaszadó. Kipróbáltam, de nem találok a paramétereiről használható leírást. A megadott konkrét példával pár másodperc múlva eltűnik a doboz a képernyőről, miközben én választ várnék a felhasználótól.
Két kérdésem lenne. Az egyik az, hogy egyáltalán használható-e ez a technika a környezettől némiképp függetlenül. Mert úgy látom, hogy talán nem az Excel, hanem a Windows szolgáltatása.
A másik, hogy hol találok egy kicsit részletesebb leírást ennek a technikának a használatáról? Mert próbálgatással már sikerült ugyan megállítanom a képet az OK megnyomásáig, de azért jobb lenne ezt elolvasni.
Azért kell két munkalap, mert az egyiken kiválasztja az összetevőket, a másikon pedig a finomhangolást végzi (gondolom).
A szinkron arról szól, hogy mindkét lapon ugyanaz az listaelem legyen kiválasztva. Ez azért kell, mert ennek az állása határozza meg, hogy milyen adatok kerülnek át az egyik lapról a másikra.
Vagyis, ha a már kiválasztott listaelemet az árajánlaton megváltoztatom, annak megfelelő elemek kell,hogy odakerüljenek erre a lapra - de azt a másik lapon levő kiválasztó determinálja.
Amíg nincs árajánlata, addig viszont az áras munkalapon "játszik" a legördülő listával. Emiatt kell mindkét lapon ugyanaz.
Utána néztem, jól emlékeztem. A különböző lapokon, füzetekben levő legördülő listák minden további nélkül hivatkozhatnak ugyanarra forrástartományra, tehát felesleges az azonos listaelemeket tartalmazó egyedi forrástarományok létesítése, majd azok szinkronizálása.
Ha mindkét munkalapon kell, akkor nem úszod meg makró nélkül, mivel a legördülő lista értékét át kell adni a másik munkalapra.
Az érvényesítés tartománya lehet ugyanaz mindkét lapon (úgy a legegyszerűbb, ha elnevezed a listatartományt és névvel hivatkozol rá az érvényesítésben).
A munkalap (mindkettő) change eseményéhez kell írni a kis makrót amivel az egyikben bekövetkezett változást a másikba átmásolod.
pl.:
Az árajánlatban:
if not intersect(target,range("B8")) is nothing then
Nem igen értem, miért kell 2 füzet és 2 legördülő lista. Miért nem jó az, ha az árajánlat füzet tartalmazza az árlistát is?
Mivel csak érintőlegesen foglalkoztam a legördülő listázással, nem vagyok benne biztos, de nekem úgy dereng, hogy egy legördülő lista hivatkozhat egy másik füzet tartományára is.
Ha bármelyik eset teljesülhet, egy árajánlatos legördülő listával megoldhatod a problémádat.
Igen mindkét munkalapon kellene ugyanaz a legördülő lista és mindkét lapról változtatni kellene tudni de ha az egyiken megváltoztatom a másikon is szinkronban kell változnia mivel a legördülő listában szereplő adat alapján kalkulálódik ki az ár.
Ha jól értem a kérdést, akkor mindkét munkalapon kellene ugyanaz a legördülő lista és mindkét lapról változtatni kellene tudni. Ráadásul a legördülő lista az árlista munkafüzetben külön is változik? Vagy ott mindig ugyanaz a lista?
Megoldódott köszönöm! Egy szinttel előrébb vagyok leszerkesztettem mindent
Van két munkafüzetem egy Árlista "1.jpg" és egy Árajánlat munkafüzet "2.jpg"
Az Árajánlat munkalap B8 cellája hivatkozik az Árlista_hun adott cellájára az alábbiak szerint ="'" & (Árlista_hun!$R$25). Az árajánlatban szerepl B8 cella tehát egy lekérdezett hivatkozott adat. A lekérdezett adat pedig egy legördülő listából kiválasztott adat. Próbáltam másolni az Árlista celláját viszont beillesztés után a legördülő liosta nem jelenik meg így minden esetben vissza kell mennem Árlista oldalra majd a legördülő lista adatai ugyan megjelennek Árajánlat munkalapon de a lépkedést szerintem ki lehetne váltani ha valahogy be tudnám illeszteni a legördülő listát. Azaz ha jól teszem fel a kérdést akkor szinkronban kellene működnie a két legördülő listának. Ha egyik helyen változtatom akkor a másik munkalapon is változnia kell az adatnak. Lehetséges ez?
Kellene egy kis segítség mert még elrendezés szempontjából sincs ötletem nemhogy függvényekkel manipuláljak :)
Van kettő termék. Ami kettő különböző alapanyagból készül. Ezek az alapanyagok több forrásból is származinak Annyi csak a különbség, hogy más az ára de nekem meg kell különböztetnem készlet szempontjából.
Az igazgató megmondja hogy tárgyhéten melyiket használjuk. Ezt kellene valahogy definiálnom hogy melyiket csökkentse.
Alapelmélet az, hogy (beérkezett alapanyag)-(legyártott termék)=késztermék. A problémám az, hogy melyik árú terméket csökkentsem.
Valami olyasmin gondolkozok hogy napi intervallumok között vagy heti szinten definiálnám, hogy melyiket használja. A napinál gondolom igencsak macerás lenne.
A heti lenne a jó de úgy hogy megadom melyik alapanyagot vegye figyelembe. Ha használjuk akkor csökkenti ha nem akkor nem foglalkozik vele mert éppen azon a héten csak az 1 terméket 1 alapanyaggal gyártottuk. De ugye megeshet hogy minden nap más a forrás...
Ez összesíti az A oszlop olyan adatát, amelyhez nincs a C oszlop megfelelő cellájában adat. (Vigyázat, bármit írsz a C oszlop cellájába, az már nem üres, tehát arra, hogy oda dátum kerül, neked kell figyelned).
Egy szerintem egyszerű problémára keresnék megoldást, hátha tudtok segíteni...
A oszlop tartalmaz összegeket B oszlop tartalmaz fizetési határidő dátumokat C oszlop pedig tartalmazza az összeg tényleges beérkezési dátumát
Szeretnék egy olyan cellát ami a kintlévőségek végösszegét tartalmazza. Ha a C oszlop egyik sorába beírnám a dátumot, akkor a kintlévőségek végösszege a sor összegével csökkenne.