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.
Így érdemes, csinálni, mert megértetted a lényeget. De a nullát szerintem ne tedd idézőjelbe, mert így egy oszlopban vegyesen számokat és szövegeket fogsz kapni. Hacsak nem ez a cél.
az volt a baj, h maga a szám is függvény eredményeként jött ki, ugyanarra a cellára meg nem hivatkozhattam, mert ezt az excel nem engedi ugyebár... végül is sikerült, ez lett belőle: =HA($B$20-A5+1>0; $B$20-A5+1; "0")
Eddig is vmi hasonló képlettel próbálkoztam egyébként, de sztem túlbonyolítottam, de most végre sikerült. Köszi a rávezetést!
Visszakerestem, miféle függvényeket írtam régebben. Amelyek "csodásak", azoknál ott van a megjegyzés, hogy nem én írtam. :)
Az egyik legjobb az, ami a hivatkozott cellában lévő számot szövegesen adja vissza. De a kutya ugassa meg ezt a fórummotort, mert rusnya, olvashatatlan a formában jeleníti meg a makrókat! Egy nagyobb lélegzetű makrót sorait nem merem egyenként szóközökkel beljebb taszigálni, félek, hogy a hosszú beviteli idő miatt a felénél kidob. Volt már rá példa. :((
Azért képletekben és saját alkotású függvényekben "Veled sem könnyű a versenyt felvenni" - nem mintha bármiben is versenyezni kellene :). Amióta elkezdtem ide járogatni, mindig megcsodálom a képletes megoldásaidat.
"Most például újdonság nekem egy egycellás tömbképlet, mert a mitől tömb?"
Ebben az esetben (és általában is) attól tömbképlet, hogy a bemenő adatai cella tartományban találhatók. A képlet úgy viselkedik, mint egy for-next ciklus. Az adott tartomány minden cellájára sorban végrehajtja a műveleteket és egy tömb lesz az eredménye. Ha megnézed a képletet az Fx szerkesztőt használva a szerkesztőlécen (ahol látható a bemeneti tartomány), azt látod, hogy a SZUM bemenete egy 1 és 0 értékekből álló tömb. Viszont a SZUM eredménye egy konkrét szám, ezért az eredmény egy db cellába kiíratható.
Szerintem minden olyan esetben érdemes végiggondolni a tömbképletet, ahol segédoszlop alkalmazása jut először eszünkbe, mert a bemenő cellákon még valamilyen műveletet kell végrehajtani. Természetesen egyáltalán nem állítom azt, hogy minden esetben működik ez a megoldás.
Akár makró helyett is működhet a tömbképlet.
Egyébként én is egy olyan fórumtárstól kaptam kedvet a tömbképletekkel való kísérletezésre (azt hiszem a PC Fórumon - de akár itt is lehetett, erre már nem emlékszem pontosan), aki a vállalati -makrómentes- környezetből adódó kényszer hatására mutatott be pár igen jó tömbképletet.
Tudtam, hogy valaki elő fog állni egy tömbképlettel, csak azt nem, hogy te vagy Delila. Ezeket még mindig csak bámulom... Most például újdonság nekem egy egycellás tömbképlet, mert a mitől tömb? Egyáltalán, hogy lehet egy mondatban elmondani, hogy mikor gondoljunk tömbképletre?
A táblázatom A oszlopában hosszú, 15-18 karakteres alfanumerikus kódok vannak, teljesen rendszertelenül (>3000 adat). Hogyan tudom megszámolni, hogy hányban szerepel a speciálisnak mondott "q" betű, a kód akárhányadik helyén?
Hiába próbálkozom, csak nem akar összejönni, segítsetek legalább elindulni!
Ez valóban nagyon jó. Az esetleges kezdők számára engedtessék meg egy kis eligazítás: A kezdő nehogy a 01. fejezet, 02. fejezet stb. tanulmányozásával kezdje, mert ezek az eredeti CD mellékletek anyagai, és mint ilyenek, nem önmagukban olvasandók.
Az xlMacro.pdf olvasásával érdemes elkezdeni. És ott az egyes fejezetek mellett a lap jobb oldalán olvasható, hogy melyik CD mellékletet nézze hozzá s szöveghez.
Kovalcsik Géza feltette az Excel programozása c. könyvét a netre, mivel már nem lehet kapni, és a kiadója is megszűnt. Az új kiadáshoz jelentősen át kellene dolgoznia.
A leveléből:
"... a pdf változatát nyilvános mappába mentettem.Ebben megvannak a könyvhöz tartozó minta munkafüzetek is, még xls formátumban. Benne van két tömörített mappa is. Ebben egy jól használható menüszalag szerkesztő program próba változatai vannak benne. Az egyik a 32 bites a másik a 64 bites változat. A link ahol eléred : https://1drv.ms/f/s!AmsKK5RFf64JgZAdgJi6Oc6pUONCQg . Használjátok egészséggel."
sziasztok! Egy olyan megoldásra lenne szükségem, ami nektek valószínűleg egy pillanat alatt menni fog. A besárgított mezőkben szereplő modellek számát kellene meghatározni. Sűrűn ismétlődnek a modellek, szoval egy modellt csak egyszer kellene számolni. Köszönöm!
Legegyszerűbb a HELYETTE függvény, persze attól még nem fogja számként értelmezni a szöveget az Excel, ahhoz kell egy másik is. Az ilyen feladatokat én úgy oldom meg, hogy kinyitom a függvénybeszúrót, és megnézem a kategóriákat. Általában lehet tudni egy kis rutinnal, hogy melyik kategóriába esik a feladatod, pl. a karaktercsere klasszikus szövegmanipulációs eljárás, tehát a szöveg kategóriát kell végigpörgetni, és amelyik függvénynek a neve ígéretes, annak a röpsúgóját ott megnézni.
Az excelben átállítottam, hogy a tizedesvessző helyett, a tizedespontot vegye alapul. (úgy, mint minden országban szinte, Magyarországon kívül)
Az lenne a problémám, hogy egy olyan helyről másolok be adatot, ahol nem pont, hanem "," (tizedesvessző) van, viszont így az excelben levő függvényem nem tudja értelmezni, hiszen így nem számként kezeli a cellában levő értéket.
Azt szeretném kérdezni, hogy erre esetleg van-e függvény, hogy a tizedesvesszőt, átírja tizedesponttá (ponttá).
Persze nem kell közvetlenül a bemásolt cellát átírni, úgy is jó, ha arra a cellára hivatkozott cellát írja át.
Pl.:
Tehát mondjuk A1 cellába bemásolok 1,96 értéket. Azt szeretném, ha mondjuk a B1-be ő 1.96 értéket írna.
Nem tudom mennyire volt érhető, amit próbáltam kérni, de ha valaki esetleg tudna segíteni, nagyon örülnék.
Koszonom mindkettotoknek a segitseget. Egyelore atmasolgattam kezzel, aztan majd ha lesz egy kis idom keresek egy hatasosabb megoldast a felvazolt iranyokban.
"hogyan lehetne automatizáltan megoldani ezt a problémát, tehát nem kézzel átmásolgatni és vissza az eredményeket"
Erre találták ki a makrót:
Alt+F11 megjelenik a VBA nézet
Insert - module - bemásolod az alábbi makrót, indítása - nézet - makrók - nevet kiválasztod.
Sub szamolo() 'feltételezzük, hogy meg van nyitva mindkét munkafüzet Dim sh1 As Worksheet, sh2 As Worksheet, cl As Range Set sh1 = Workbooks(1).Sheets("T1") ' ide helyettesítsd be azt a munkalapot, amelyik számol - teljes módon, munkafüzet, munkalap Set sh2 = Workbooks(2).Sheets("T2") ' ez a forrás-eredmény munkalap ' a bemeneti adatok a T2 A oszlopában vannak For Each cl In sh2.UsedRange.Columns(1).Cells If Not IsEmpty(cl) Then ' ha van adat a cellában sh1.Range("B1").Value = cl.Value 'a bemenő adat a T1 munkalapra a B1 cellába 'ha több bemenő adat van, akkor a cl cella helyzetéhez viszonyítva az offset tulajdonsággal lehet elérni, 'pl. ha a B oszlopban is van adat, akkor sh1.range("C1").value=cl.offset(0,1).value a T1 munkalap C1 cellájába írja be 'T2 munkalap B oszlopában levő adatot cl.Offset(0, 4).Value = sh1.Range("C3").Value ' az eredményt a T2 D oszlopába írjuk be End If Next End Sub
>>Van egy kevésbé elegáns megoldás, ha nagyon gyors akarsz lenni: T1-ből az illetékes munkalapot vagy lapokat egyszerűen átmásolod T2-be, és akkor helyben állnak rendelkezésre a képletek.
Sajnos ez nem megy, T1 9 lapból áll és kb 18 különböző verziót kellene kiszámolni, azaz 18x9 = 162 lapot kellene hozzámásolni és a 9 lapokat egymást közt összekötni.
>>Az megvan, hogy egy táblázatba lehet olyan képletet írni, amely egy másik munkafüzet celláira hivatkozik? Ez így nem oldja meg a problémádat?
Ez lehet még egy megoldás, bár átírni a T1 és T2 ben cellahivatkozásokat kb akkora munka mint átmásolgatni kézzel az adatokat.
>>Egyébként nekem ilyen feladatoknál már kezd viszketni a tenyerem, hogy átrakjam adatbázisba az egészet. Ez még az az eset, amit meg lehet oldani Excelben is, ha direkt mazochista hajlamú valaki, de >>valószínűleg sokkal természetesebb és elegánsabb lenne adatbázisban. Ami pedig azt is jelenti, hogy karbantarthatóbb.
Elvileg igen, gyakorlatilag a méretetőtáblázat egy fekete doboz és nincs időm / kedvem átalakítani valami használhatóbb formátumba.
Van egy kevésbé elegáns megoldás, ha nagyon gyors akarsz lenni: T1-ből az illetékes munkalapot vagy lapokat egyszerűen átmásolod T2-be, és akkor helyben állnak rendelkezésre a képletek.
Az megvan, hogy egy táblázatba lehet olyan képletet írni, amely egy másik munkafüzet celláira hivatkozik? Ez így nem oldja meg a problémádat?
Egyébként nekem ilyen feladatoknál már kezd viszketni a tenyerem, hogy átrakjam adatbázisba az egészet. Ez még az az eset, amit meg lehet oldani Excelben is, ha direkt mazochista hajlamú valaki, de valószínűleg sokkal természetesebb és elegánsabb lenne adatbázisban. Ami pedig azt is jelenti, hogy karbantarthatóbb.
Adott egy T1 excel táblázat, ami egy gép bizonyos elemeihez terhelésfüggően szükséges HW-t számolja ki. Ennek a táblázatnak a bemenete pár szám (ami leírja a terhelést) amit a megfelelő mezőkbe kell írni, illetve a kimenete is hasonlóan pár szám amit a megfelelő mezőkben jelenik meg (ez HW komponensek száma). Ezek a mezők konstansak (tehát a bevitel mindig pl a B1 mezőbe történik és mindig pl a C3ban jelenik meg az eredmény).
Adott egy másik táblázat T2, ami különböző évekre / helyzetekre mutatja a terhelési értékeket.
A feladat az lenne, hogy T2 ben felsorol bemeneti adatokat behelyettesítsük a T1be és a T1 adott eredményeket átvigyük a T2be.
A T2 ben megadott és T1ből visszaadott adatokról feltételezzük h helyesek, tehát semmiféle ellenőrzésre nincs szükség.
A T1 logikája meglehetősen bonyolult (több oldal, table lookup stb), ezért nem lehet a T1 formuláit csak átmásolni a T2be.
Van valakinek ötlete hogyan lehetne automatizáltan megoldani ezt a problémát, tehát nem kézzel átmásolgatni és vissza az eredményeket?
A százalék ugyebár egy tizedes tört, a százalék csak egy számformázás, ahogy megjelenik. Valami ilyesmi lesz, de most tesztelni nincs időm, csak gépelek:
Szerintem is megoldhatatlan a D oszlop adatainak létrehozása az általad megadott példák alapján, ha nem tudsz megadni keresési szabályt arra, hogy milyen módon kell megkeresni a kódot a hosszú névben. De azért egy lehetőség még akkor is van, ami talán megoldja amit szeretnél. Ehhez meg kell adnod azt a másik táblázatot, vagy legalább egy mintát rá.
És akkor el tudom képzelni, hogy egy program (mert szerintem ez így már függvénnyel nem lesz megoldható) az utóbbin végigszaladjon, és megnézze, hogy az itteni A oszlopod valamelyik adata belsejében előfordul-e az adott karaktersorozat. Ha igen, akkor átmásolja D-be. Ha többen is, akkor mindegyiket. De még itt is lesz egy bibi: A 82034X keresésével soha nem lehet megtalálni a 82034-X kódrészletet. Ha csak annyi a különbség, hogy az összes ilyen kódon belüli kötőjelet törölni kell, akkor előzőleg célszerű lesz egy segédoszlopba átmásolni az A oszlopot kötőjelek nélkül, és abban keresni.
Az Fkeres függvénnyel lehet keresni a "*" (csillag) karaktert használva. Pl. Fkeres("*" & D2 & "*";A:A;1;0) keresi a D2 cellában levő érték előfordulását az A oszlopban, a keresett érték lehet a keresendő oszlopban bárhol. Ha a csillagot csak az elejére teszed, akkor azt keresi, aminek a végződése, ha a végére teszed, akkor aminek az eleje szerepel a keresendő oszlopban.
Én fordítanék a keresésen a jobb működés érdekében:
Abban a táblában, amelyikben a rövidebb elnevezések vannak onnan keresnék a hosszabb neveket tartalmazó táblában egy segédoszlopba a fentiek szerint (nyilván ott nehezebb, ahol az egyik helyen kötőjel is van ott, ahol a másikban nem, de ott lehetne alkalmazni esetleg a keresett érték "csonkítását", pl. bal(D2;szöveg.keres("-";D2)-1)).
Majd az így kapott - már kompatibilis - hosszú nevekben keresném az első táblázathoz az értékeket a másodikban.
Lehet kicsit bonyolult, leírom egyszerűbben:
1. Második táblában segédoszlop - Fkeres a rövid azonosítót csillagokkal megtoldva, esetleg csonkítva az első táblázat A oszlopában keresve. Nyilván adódhat pár hibás érték, de gondolom ez már vizsgálható nagyságrend lesz.
2. Első táblában az A oszlop alapján keresni a második tábla segédoszlopában (itt az INDEX függvényt érdemes bevetni, mivel ott nem csak az első oszlop alapján lehet keresni, hanem bármelyik szerint).
Valószínű, hogy a hiba ott keletkezett, hogy két táblázat jött létre.
De ha csak annyit tudunk, hogy nincs egységes képzési szabály, de azt nem tudjuk rendesen, hogy akkor mégis mi az algoritmus, akkor az isten se tudja megcsinálni a konverziót.
Hány kód van?
Valahol csak van egy olyan táblázat, ami a hivatalosokat és a rövideket is tartalmazza...
Vagy van legalább egy rendes szabály, hogy mit hogyan kell átalakítani? Mert akkor szövegkezelő függvényekkel meg lehetne oldani.
Van két táblázatom, amelyből adatokat szedek le egy 3. táblázatba. Mindkét táblázatban ugyanazon dologra vonatkozó elemek szerepelnek, csak az egyikben egy hosszú hivatalos típus elnevezés van(A oszlop), a másikban ugyanezeknek a típusoknak egy rövidített elnevezése(D oszlop) + a hozzájuk tartozó adat. Az első táblázatból az A oszlopba fog jönni adat, bizonyos feltételek alapján HA függvénnyel, a második táblázatból, pedig több adat is jönne Fkeres-sel, az A oszlop megfelelő elemei mellé, de abban a táblában a D oszlop szerinti rövidített elnevezés van. Azt kellene megoldani, hogy a két táblában az elnevezéseket lehessen egymáshoz viszonyítani. Vagyis ha az A oszlopba bejön egy adat, akkor ahhoz ki tudjam íratni a rövid elnevezését a D oszlopba, így az alapján tudnék bekérni adatokat a második táblázatból. Én itt a példába beraktam 3 elemet, de ezekből több ezer van... Amint a példában láthatod, nem egyforma szempont alapján szerepelnek a hosszú szövegben a rövid, kiemelendő részek. Az elsőben kellene a 6,7,8,9,10 és 12. karakter, de a többinél már nem ezek kellenek. Ehhez így nem találtam függvényt.. Esetleg makro-val megoldható?
Az A oszlop celláiban lévő adatokból szeretnék kinyerni egy rövidített verziót(ami ki van emelve, és alá van húzva), olyat, mint amit a D oszlopba írtam be.
És az Exceltől függetlenül Intézőben rákattintva a képnézegető nyitja meg? Mert akkor passz. Nem tudok róla, hogy az Excel saját fájltársítót használna.
Ne az Excelben keresd a megoldást! Ezt a Windows-al tudod beállítani.
Ha win7-est használsz, akkor Start->Alapértelmezett programok->Fájltípus vagy protokoll társítása programmal, majd ezután kapsz egy listát az egyes fájlkiterjesztésekről. Itt megkeresed a .jpg-t, ami mellett most az Internet Explorert látod és rákattintasz. A lista felett kiválasztod a Program módosítása gombot, majd a megjelenő listából kiválasztod a Fényképnézegetőt.
Van egy makróm. Azt szeretném kérdezni, hogy itt mit kell hozzáadni, ahhoz, hogy a szegélyek ne feketék legyenek, hanem más színűek?
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then With Range(Cells(Target.Row, 1), Cells(Target.Row, 11)) .Borders(xlEdgeLeft).LineStyle = xlContinuous .Borders(xlEdgeRight).LineStyle = xlContinuous .Borders(xlInsideVertical).LineStyle = xlContinuous End With If Cells(Target.Row, 10) = "" Then With Range(Cells(Target.Row, 1), Cells(Target.Row, 11)) .Borders(xlEdgeBottom).LineStyle = xlContinuous .Borders(xlEdgeBottom).Weight = xlThin
End With Else With Range(Cells(Target.Row, 1), Cells(Target.Row, 13)) .Borders(xlEdgeBottom).LineStyle = xlContinuous .Borders(xlEdgeBottom).Weight = xlMedium End With End If End If End Sub
Áh, közben az is felmerült hogy nekik azért is jó a spreadsheet, mert nem kell hozzá excel a gépen...istenem, de utálom ezt.
Elvileg lehetne publikálni ezeket a spreadsheeteket és be lehet "elméletben" linkelni sima excelbe...viszont gyakorlatilag ez nekem nem sikerült még 1x se...
Nem olyan vészes amúgy...összesen 10 ügynök dolgozna, párhuzamosan max 2-4 és évente generálnak 80000 sort.
És chat ügynökről van szó, szóval párhuzamosan is visznek ügyeket....szóval egyszerre kéne létniuk a sorokat, hogy írogathassanak ide-oda...
Az a baj, access formokban nem vagyok penge. Enyhén szólva.
A legjobb egy megosztott SIMA excel lenne...nem lenne semmi gondom a világon, ha az megoldható lenne. De nem tudom, hogy lehet azt úgy megosztani, hogy bárhonnan elérhető legyen normál excelben...
Nincs ez irányú tapasztalatom, de ha valami, akkor szerintem leginkább a Microsoft felhőalapú tárhelyszolgáltatása (OneDrive) fogja támogatni az Excel fájlok megosztását...
És ahogy nézem, commandbar témában van ott egy szakértő (Micu), aki szinte minden commandbarral kapcsolatos kérdésre azonnal próbál válaszolni. Utoljára 1 hónapja volt aktív, remélhetőleg most is elérhető. Esetleg kérhetnél tőle privátban segítséget, vagy inkább áthívhatnád ide.
Én inkább Access-ben gondolkodnék. Már lehet Webes alkalmazásként is megcsinálni, de az asztali adatbázist is meg lehet osztani. Sok ügynök, sok adat, szerintem ehhez már adatbázis kezelő kell, nem elég az Excel.
Most ezzel szívok :-(...sima excel tök jó lenne, de ez a google spreadsheet nekem tök sok nehézséget okoz.
Csomó dolog nem működik, ami sima excelben tök jó megoldás :-/...
Az online excelemben emberenként vannak füleim....és ezekre építve kéne kimutatást csinálnom.
Sima excelben írnék rá egy makrót, ami összeolvassa a dolgokat, majd arra építenék egy pivotot.
De itt basszus...utálom ezt.
Eleve korlátozottak a sorok számai. VBA makrót itt nem lehet futtatni, csak java scriptet írni, ha jól értem...
Ti használjátok?
Van valami jó tippetek, ami működhetne?
Arról van szó, hogy sok "ügynök" használna egy megosztott doksit...minden ügynöknek saját füle van, ahova rendezetten beviszi az adatokat. Majd ezekből az adatokból kell kimutatást csinálnom.
Sima excelben semmi gondom nem lenne ezzel, de ebben spreadsheet-ben..meg vagyok lőve.
Filóztam, hogy nem lehet-e sima excelt fellőni...megosztva...
Hát ez aszongya, hogy egy Commandbar-t (magyarul talán "eszköztár"?), mégpedig az "Obdobie" nevűt szeretné megjeleníteni.
Valószínűleg ez az eszköztár nincs meg azokon a gépeken, ahol a program nem fut. Rémlik nekem, hogy lehetett régen az eszköztárat munkafüzetbe beágyazni, és akkor ahová vitted az xls-t, oda ment az eszköztár is, de ezt a részt sosem tudtam igazán. Szóval ha jól sejtem, két lehetőség van: 1) beágyazni az eszköztárat, vagy 2) létrehozni őket a célgépeken.
Ha esetleg valaki jobban tudja, javítson ki bátran...
Amikor az első képen látott hibaüzenethez ér, kattints a Debug gombra, és mondd el, mit látsz. Pontosabban: sárgával kiemelve fogod látni, hogy melyik programsornál akad ki a futás. Na erről csinálj egy screenshot-ot, és töltsd fel.
Ebből a leírásból nem sok minden derül ki, de esetleg érdemes lenne összehasonlítani a működő és nem működő gépeken, hogy milyen referenciák vannak beállítva a munkafüzethez.
ALT+F11-gyel eljutsz a Visual Basic Editorhoz, azon belül Tools menü, References menüpont. Ha a nem működő gépeken a listában "Missing" tétel van, akkor ott a gond.
Nem tudom jó helyen járok-e a problémámmal de megpróbálom , mert mar néhány napja böngészve a netet nem találok megoldást.
Adva van egy Excel füzet amelyben makrók vannak , ami win xp futva , Office 2003-on használandó. A probléma ott kezdődött hogy új PC-t kapott az adott személy , átraktam a szóban forgó fájlt reá amin Win 7 és Office 2007 van telepítve, de nem indul el, ezt írja ki: Run-time error "5" Invalid procedure call or argument. A legrosszabb az hogy egy másik gépen is próbáltam futtatni a fájlt, amin ugyanúgy win XP és Office 2003 van telepítve , és csodák csodájára ott is ugyanaz a hibaüzenet jelenik meg :-(((((
Veled ellentétben nem az átlagból indulnék ki, hanem az "aktuális"-hoz hasonló tömegű jószág adatait venném alapul, lásd a csatolt füzetet.
Az eredeti Sheet2-t átneveztem, az újon kihagytam a %-számítást, az A oszlop szerint emelkedőbe rendeztem a táblázatot.
A Sheet3 lap B2 cellájába kell beírni az aktuális csirke tömegét. A további (C:...) oszlopokba be lehet majd vinni a különféle műveletek árait, vagy ami szükséges.
A Sheet2 lapon kell a mért értékeket bővíteni.
Jeleztem a Sheet3 lapon, hogy komoly hiba van a mérési adatokkal.
Jaja. Én pl. az összeszerelő üzem vezetője vagyok. Bedleg meg a központi szerviz és ügyfélszolgálaton van. Csak nálunk úgy megy, hogy az alkatrész-utánpótlást a késztermék szétszedésével biztosítjuk.
Hát, ha az elvi problémák nem érdekelnek, akkor itt egy lehetséges megoldás.
A "MELL CSONTTAL" nevű alkatrész %-os arányát az alábbi képlettel lehet megadni:
=HAHIBA(FKERES(cellahivatkozás az egész csirke tömegére;Sheet2!$A$21:$L$36;2;HAMIS);ÁTLAG(Sheet2!$B$22:$B$36))
ahol a piros részt értelemszerűen helyettesíteni kell valamivel.
A kék színű paraméterek pedig az alkatrésztől függően változnak. Pl.
Alkatrész 2 helyett $B$22:$B$36 helyett
COMB CSONTTAL 3$C$22:$C$36
HÁT 4$D$22:$D$36
stb.
Első közelítésben ennyi.
Nyilván, ha az adatbázis bővül, ez a $A$22:$L$36 tartomány már nem lesz jó. Ha rám hallgatsz, a %-os értékeket külön oszlopokba rakod, pl. Sheet2-n M oszloptól kezdődően, és akkor nem kell sorindexekkel foglalkozni.
Pontosan ez lenne a cél, ahogyan azt megfogalmaztad. A csatolt fájl, ez az egész árkalkuláció eddig csak egy nagyon kezdetleges dolog. Tehát az elvi problémáktól adatok hiányában eltekintenék (ebbe nem is szándékoztam belemenni), mivel tény, hogy ez ennyi adattal még nem támaszthatja alá a valóságot. Viszont az adatbázist folyamatosan bővítve, figyelembe véve a befolyásoló tényezőket, előbb vagy utóbb ezek mind pontosítva lesznek.
Tehát én ez az elképzelés szerinti számolásra, algoritmusra, beképletezésre lennék kíváncsi, mivel ezt nem tudom nem, hogy összeállítani, hanem elkezdeni sem. Ha nem is a pontos számolást, csak valami útbaigazítás szeretnék kérni, hogy miként tudom a két munkalapot ilyen módon "összekötni.
Köszönöm türelmeteket, és csak sikerül rájönnünk mi is kell nekem pontosan!
Az utolsó betűig egyetértek veled. Csak szándékosan el akartam kerülni, hogy a szakmai részletekbe belebonyolódjak. Az az érzésem, hogy bedleg barátunknak az a problémája, hogy nem tudja a saját maga által elképzelt feladatot algoritmus formájában megfogalmazni. És attól tartottam, hogy ha belebonyolódok a szakmájába, akkor félreviszem a beszélgetést, ráadásul olyan területre (csirke fel(!)pucolás), amihez magam nem értek.
Sőt abba sem akartam ismét belebonyolódni, amit már korábban futólag megemlítettem, hogy nem szabadna tizedgramm pontosságig megadni az adatokat. (Ez az átka annak, ha az embernek a legmodernebb digitális Sartorius mérleg, vagy hasonló áll a rendelkezésére)
A tényleges különbségek bizonytalanságának igazolására egymás mellé tettem bedleg mérései közül az 1.475 és a 2.36 kg-os csirke részadatait, és mivel az utóbbi pontosan 1.6-szerese az előbbinek, annak a részadatait felszorozgattam a fenti táblázatban. És egymás alá téve szerintem nincs érdemi különbség a kettő között. Az a néhány deka különbség az egyes részek között bőven a hibahatáron belül van. Az eredeti táblázat százalékos adataiból látszik, hogy általában 1-2%-nál nagyobb különbség nincs köztük.
Szóval szerintem is aggályos a szakmai koncepció, csak első közelítésben nem akartam erre kitérni.
És nyuszinak is igaza van, a kérdés nem Excel kérdés, ahogy korábban már magam is jeleztem, hanem algoritmus megfogalmazási.
Ha jól értem az a cél, hogy egyetlen bemenő adatból (az egész csirke tömege) előálljon több kimenő adat (az alkatrészek tömegei). Na már most, kísérleti tények igazolják, hogy különböző csirkék esetében más és más az alkatrészek tömegének %-os aránya, és éppen ezért nem tűnik jogosnak minden csirke esetében ugyanazokat az arányokat használni. A kérdező azt feltételezi, hogy az arányok az egész csirke tömegével vannak összefüggésben, és - ha jól értem - azt szeretné, hogy:
1) néhány kiválasztott csirke esetében elvégzi a bonclást, leméri az alkatrészek tömegét, ebből létrejön egy kisebb "adatbázis", kb. ilyen oszlopokkal: "csirke neve", "csirke tömege", "szárny tömege", "comb tömege", stb..
2) minden további vágás esetében csak az egész csirke tömegét akarja lemérni, és az adatbázisból szeretne választ kapni arról, hogy mi az alkatrészek tömege: ha van az adatbázisban pontosan olyan tömegű csirke rögzítve, mint az ismeretlen "minta", akkor annak arányait felhasználni, ha pedig nincs, akkor az összes mérés átlagát alapul véve.
Ez a megközelítés akár algoritmusként is megfogalmazható, beképletezhető (legalábbis elsőre annak tűnik), de van itt néhány elvi probléma.
A) Honnan tudjuk, hogy a csirke tömege valóban összefüggést mutat az alkatrészek arányaival? Más szóval, biztos, hogy egy 5000 g-os csirke melle minden esetben 1300 g lesz? Vagy esetleg van olyan csirke, akinél 1800, meg van olyan, akinél csak 900? Baromfira nem mindegy.
B) Ha van is kimutatható korreláció, honnan tudjuk, hogy nincs más tényező, ami az eloszlást befolyásolja? Például
- a csirke fajtája (szerintem mondjuk elég ésszerű ezt feltételezni, ha már modern korunkban mindent a genetikából próbálunk levezetni)
- a csirke neveltetésének körülményei (pl. tanyasi legeltetett, avagy napfényt sosem látott tápolt csirke)
- a csirke életkora vágáskor (emberből is tudjuk, hogy az életkor előrehaladtával jelentősen megváltoznak a testrészek arányai, ráadásul ez nem mindenkinél ugyanabban az életkorban következik be)
Szóval ahhoz, hogy itt egy tudományosan alátámasztott megoldás legyen, először is fel kellene deríteni az összefüggéseket, mi függ mitől és hogyan, és ehhez rengeteg mérés, plusz nem kevés statisztikai kiértékelés lenne szükséges.
Vagy éppenséggel meg lehet csinálni a kérdező elképzelése szerint a számolást (már ha jól értettem, mit szeretne), csak azt nem lehet garantálni, hogy az ezzel a számolással kapott, becsült alkatrésztömegek köszönő viszonyban lesznek a valósággal.
Az egyik ötletem az, hogy feldarabolsz mondjuk 10000 csirkét, és ezen csirkék alkatrészeinek tömegét elmented.
Aztán amikor egy következő csirkét csak úgy lemérsz egyben, akkor meg fogod tudni tippelni(!) az alkatrészek arányát. De ez még mindig olyan általános megállapítás lesz, mint pl. az a kijelentés, hogy "az emberi láb 35 kg". Kié? A 210 kilós obes férfiemberé vagy a 40 kilós, 90 éves, rákos nagymamáé?
Igazából ez a probléma nem is Excel, hanem simán bármilyen mérhető értékű sokaság problémája (emberi testmagasságtól elkezdve akármi).
Ha viszont azt mondod kellőensok mérésből, hogy a mell az a teljes csirke 27%-a, akkor meg csak annyi a dolgot, hogy az egész csirkét leméred, és a mért értéket beszorzod 0,27-tel és nem kell nagymintaszámú kísérletet végezned. - de gondolom felmerült benned is.
Akkor tisztázzunk valamit! Sem az Excel, sem egyetlen más számítógépes program nem fogja tudni megoldani a Te szakmai feladatodat. A program arra alkalmas, hogy amit az ember fárasztó munkával, esetenként kisebb-nagyobb hibákkal ki tudna számolni, azt a program segítségével a számítógép nagyságrendekkel gyorsabban elvégzi. És nincs rossz napja, nem fáj a feje, nem kell másra figyelnie, ezért nem is hibázik.
Azt viszont, hogy mit szeretnél elvégezni azt neked kell szájbarágós pontossággal megadni. Ezt nevezik algoritmusnak. Ennek alapján aztán gyerekjáték megírni a programot, ami a munkát majd elvégzi.
A korábban csatolt táblázatod mintája alapján légy szíves, mondd meg, mit kell tennie a gépnek, ha mondjuk van egy 1.790 kg-os csirkéd!
Ennek a táblázatod szerint a melle csonttal 0.67 kg, a combja csonttal 0.545 kg stb. kell, hogy legyen. Ha jól értelmezem, akkor ezeket most nem méred le újra, hanem a megtalált súlya alapján kiszámolod belőle az árát, amennyiért így egészben szeretnéd eladni.
És ha jól értem, akkor ezek alapján szeretnéd kitölteni a sheet1-ben szereplő táblázatot. Azt ugyan még nem sikerült megfejtenem, hogy honnan kerülte ide a 2.5 kg-os csirke esetén a 37.20% meg 30.23%-os stb. adatok és ezek nyomán a 0.78, meg 0.64 kg-os stb. értékek mert ilyeneket az egész sheet2-ben nem találtam,
De ha jól értem, akkor Te ezek alapján egy árat szeretnél kérni a számítógéptől.
Szóval magyarázd el légyszíves a feladatot úgy, mintha egy hülyegyereknek magyaráznál, tehát semmi magától értetődő fogalmat nem használhatsz. Csak olyat, hogy melyik sor, melyik oszlopban mit keressen a program. Onnan mit vegyen át, hova tegye, és ha mindez megvan, akkor hogyan számolja ki az eredményt. És végül a kiszámított eredménnyel mit kezdjen. Hova írja, milyen formában.
Lényeg a költségek eloszlása, amennyiben felszeletejük a csirkét. Az eloszlás viszont függ a felpucolt egész csirke súlyától. Erre azért van szükség, hogy amennyire lehet pontosan kitudjam számiolni az önköltségleti árait egyes testrészeknek.
Lényeg, hogy azt szeretném elérni, majd folyamatosan bővítve az adatbázist, hogy ha egy adott felpucolt egész csírke átlagsúlyát kicserélem, akkor az adatbázisból automatikusan kicserélje az eloszlást (Sheet1). A megoszlások átlaga pedig abban az esetben lennének hasznosak, amennyiben a felpucolt egész csirke átlagának értéke pont nem szerepel az adatbázisban.
Sziasztok! Egymás alatt lévő cellkákban szeretnék írni úgy, hogy több cellát átér egy cella szöveges tartalma. Annak a módjára, ahogy a vízszintes irányban a "kijelölés közepére" módon lehet. Függőlegesre ott nincs ilyen lehetőség sajna. De van-e valami megoldás erre? A cellaegyesítéssel nem akarom viszont.
Szeretnék segítséget kérni egy exceles projektemhez. Egy kereskedelemben munkálkodó cégnél dolgozok, rengeteg terméket forgalmazunk, az azonosítás cikkszámok alapján működik. A mi területünk a kiegészítő termékekkel foglalkozik, egyik terméket ajánljuk a másikhoz.
A problémám a következő lenne:
Van egy adattábla, ahol cikkszám alapján a "keres" függvénnyel behozunk bizonyos adatokat. Ezzel egy olyan probléma merült fel, hogy mivel nagy méretű az excel és sokan akarnak belépni több területről, ezért sokszor lefagy. ( A gépek nem a legmodernebbek)
Egy olyan megoldást keresek, ahol ezt az excel fáljt, több kisebb részre szétbontom, viszont, hogy ne legyen továbbra is órisái az adattábla, ezért keres függvénnyel hoznám be a szükséges infókat.
A gond az, hogy egy adott cikkszámú terméket, több területre is kitudunk helyezni, viszont a sima "keres" függvénnyel csak az első helyen szereplő cikkszámhoz tartozó érték kerül át. Van egy másik azonosításra szolgáló oszlop is mindkét táblázatban, ahova a területek elnevezései vannak megadva, itt is egy területre több különböző termék kerülhet.
A "ha" és a "keres" függvény összemosásával próbálkoztam, próbálkoztunk.
A logikai menetem, hogy "ha" a két excelben megegyezik a kihelyezés oszlopba írt szöveg, akkor az ott lévő cikkszámhoz tartozó értéket vigye át.
Érdekes kísérlet lenne megvizsgálni, hogy mitől függ az "alkatrészek" tömegaránya. Pl.
- ahol a baromfiudvarban macska is van ott sokat kell szaladni, tehát a comb jobban megerősödik,
- ahol a tyúkól emelt szinten van, ott többet kell repülni, tehát a mellizom erősödik meg jobban,
- a csirkefarmon, ahol a csirkék dobozban állnak egymás mellett, és csak annyi mozgásterük van, hogy kidugják a fejüket a dobozból a kajáért, ott a nyakizom lesz relatíve erősebb, stb.
De ez már sztem meghaladja egy vágóhíd dimenzióit.
Nekem az a gyanúm, hogy itt nem Excel problémáról van szó. Az más kérdés, hogy ha sikerül megtalálni egy elvi megoldást a kérdésre, akkor annak konkrét alkalmazása Excel segítségével megoldható lesz.
Előrebocsátom, hogy soha életemben nem foglalkoztam sem baromfiak, sem más élőlények feltrancsírozásával és a testrészeik belső arányainak megállapításával, de azért teszek egy kísérletet a feladat megértésére (és talán a megoldására). Szóval:
A táblázatokból (Sheet2) nekem az derül ki, hogy nem nagyon látszik összefüggés a csirke súlya és az egyes testrészek súlyának arányai között. Sőt az a gyanúm, hogy ha több azonos súlyú állatot trancsíroztál volna fel, akkor is egész különböző arányok adódtak volna. Mert még csak olyan tendenciát sem látok, hogy mondjuk a kisebb csirkék combfilé aránya kisebb lenne. Mondjuk a mellfilénél látszik valami nagyon enyhe trend, de nem igazán meggyőző.
Szóval én igazán az átlag használatában keresném a megoldást, amire egyébként magad is teszel utalást:
"...lehetséges-e valamiféle középértéket venni, amennyiben az adatbázisban nem található meg pont az az egész csírke súlya és annak eloszlása?"
Én is ebből indulnék ki, csak a kérdésed második felétől tekintenék el. Tehát úgy tenném fel a kérdést, hogy "...lehetséges-e valamiféle középértéket venni?"
Megnéztem az átlagokat (szigorúan egészre kerekítve, mert szerintem itt nemhogy a 4 tizedes, de még az egy tizedes pontosság is felesleges és félrevezető), és azt találtam, hogy a mellfilé 27%, a combfilé 24% stb.
Mi az akadálya annak, hogy mindenféle adatbázis nélkül ezeket a számokat használd az árkalkulációnál (Sheet1). Azt nem tudom, hogy találtál ott 37, illetve 30 %-ot, de nem is az én dolgom. A lényeg, hogy az átlagokból számolnék minden csirke esetén, függetlenül a felbontás eredményétől.
A vevőt nem zavarná, mert vagy jobban jár egy kicsit, vagy rosszabbul, de nem hinném, hogy ezért reklamálna, és az eladó is a pénzénél lenne.
Persze nem tudom, milyen célra kell a számítás, de meglepne, ha lenne olyan cél, ahol csirkénként szükséges az állat szétbontása alapján elvégezni az árkalkulációt.
Igen, értem. Az imént Jimmynek válaszolva lényegében ugyanerre jutottam, azzal a különbséggel, hogy a forrás táblázat tényleges kezdősorát adtam meg első paraméterként, így azzal már nem kell korrigálni az eltolás mértékét, a második paraméternél pedig a léptetéssel való szorzást nem 1-ről, hanem 0-ról indítom, így azt sem kell már korrigálni.
Nem volt könnyű, de nagy nehezen megértettem az ofszet/eltolás függvény működését. Köszönöm a segítséget.
Ha a Munka1-en az első sor 4, a továbbiak 19; 34; 49; 64, akkor a másik lap első cellája
=OFSZET(Munka1!A$1;SOR()*15-12;0)
Itt mindig a Munka1!A$1-ből indulunk ki, ami a hivatkozásban az első sor.
Első esetben a sor()=1, ez szorozva 15-tel=15. 15-12=3. Ennyivel toljuk el a Munka1!A$1-et, vagyis Munka1!A4-re hivatkozunk.
Második esetben a sor()=2. 2*15=30, 30-12=18, A$1+18=19, és így tovább.
Az F9 segít a levonandó érték meghatározásában. A szerkesztőlécen kijelölöd a sor()*15-12 -t, F9-et nyomva kapcsos zárójelek között látod az értékét. Addig variálsz a levonandóval, míg jó eredményt nem kapsz. :) Ha javítani kell, Esc billentyűvel lépj ki a képletből, mert ha Enterrel tennéd, a mutatott érték marad a képletben, első esetben {3}.
Nem volt könnyű, de megvan. Szóval, kezdődjenek a forrás munkalapon a nekem szükséges cellák mondjuk az A5-ön, és minden további 15. sorban van a következő.
Ekkor, ha a cél munkalap 1. sorától kezdve akarom beírni a forrás adatokat, akkor a képlet:
Egy felpucolt baromfi árkalkuláción dolgozok, és az a "problémám", hogy a felpucolás utáni súly függvényében a baromfi úgymond főbb "alkatrészeinek" (mell, comb, szárny, hát) súlyeloszlása változik, tehát nem tudok egységes eloszlást beírni a táblázatba.
Készítettem pár mérést(nagyjából minden lehetséges súlyra találtam példányt), amelyben lemértem az egész csirke súlyát, aztán ugyanazt felszeleteltem, és "alkatrészenként" is lemértem, hogy megtudjam a megoszlást (%).
A kérdésem először is az lenne, hogy hogyan tudom "adatbázisként" használni a méréseket, és lehetséges-e valamiféle középértéket venni, amennyiben az adatbázisban nem található meg pont az az egész csírke súlya és annak eloszlása?!
Nem tudom mennyire sikerült elmagyaráznom a problémámat, de remélem a mellékletből sikerül rájönni.
Jimmy, meg kell, hogy kövesselek. Amit írtál az alapjában működik. Csúnyán elnéztem. Mert az tény, hogy a mintában Munka1 hivatkozást írtam ez egyszerűség kedvéért, de a valódi feladatomban más volt a forrás munkalap neve. Csak amikor kipróbáltam, akkor erről megfeledkeztem, és Munka1-re hivatkoztam, ami nem is volt az Excel táblámban, persze, hogy nem tudott mit kezdeni a függvény a nem létező munkalappal.
Így történt, hogy a 29595-ös válaszomban hülyeségeket írtam. Bocs.
Most látom, hogy az alapgondolat működik. Ahogy működik Delila 29598-as válaszában levő minta is. Azt ugyan még nem tudom, hogy miért a SOR(A1)*15-9 nálad, illetve SOR()*15-6 Delila képletében a 15 sorral későbbi hivatkozás. Azt már látom, hogy a saját próbálkozásom a sor értékéhez a 15 hozzáadása szintén nem jó. De ha majd holnap lesz egy kis időm, akkor tanulmányozni fogom, és valószínűleg rájövök.
Function Vezetéknév(cella As Range) Dim b As Integer, f As Boolean f = False
For b = Len(cella.Value) To 1 Step -1 If Mid(cella.Value, b, 1) = " " Then Vezetéknév = Left(cella.Value, b - 1) f = True Exit Function End If Next
If Not f Then Vezetéknév = cella.Value End Function
Módosítottam a Keresztnév makrón. A kék adatokat írd át arra, amelyik munkalapon, amelyik oszlopba írtad fel az elfogadható keresztneveket.
Function Keresztnév(cella As Range) Dim b As Integer, f As Boolean, nev As String f = False
For b = Len(cella.Value) To 1 Step -1 If Mid(cella.Value, b, 1) = " " Then nev = Mid(cella.Value, b + 1, 50) If Application.CountIf(Sheets("Munka2").Range("A:A"), nev) > 0 Then Keresztnév = nev f = True Exit Function End If End If Next
Már megvan a vezeték és a keresztnév is külön-külön. Ezt nagyon köszönöm neked, mert ezzel is nagyon sokat nyertem. Egy apróbb baj van amiben szeretnék még segítséget kérni, hogy tökéletes legyen ez a szét választás.
A Hahiba függvény abban az esetben tökéletes ha csak két szóból áll a név. A keresztnevet leválasztotta a saját függvény a vezetéknevet pedig képezte a hahiba függvény.
Viszont sajnos előfordul olyan név is ami összesen 3 vagy extrém esetben 4 szóból áll.
pl: Dr. Kiss Balázsné Nagy Evelin
Ebben az esetben A "Dr." szót veszi alapnak a függvény és csak ezt hagyja meg. Hogyan lehetne azt megadni neki, hogy figyelje a szavak számát és mindig csak az utolsó szót húzza le a vezetéknév képzésénél. Ha lehet ezt támpontnak nevezni.
Keresztnévhez kiegészítésnek:
A VB scriptnél mennyire lenne bonyolult úgy módosítani, hogy csak azoknál a keresztneveknél válassza le és tegye át a másik cellába melyek a scriptben el vannak tárolva mondjuk egy tömbben? Ezeket én tudnám megadni neki.
pl.: László, Gábor, Etelka, János meg lenne adva ezt leválasztaná, de Ilona nem akkor ezt érintetlenül hagyná.
Ahol egy név van csak azt a vezetéknév oszlopban hagynám.
A kimutatás táblába felveszed sor mezőnek a vevőkód mellé a vevőneveket tartalmazó oszlopot is. Igaz, ezzel az történik, hogy a vevőkód alá lesz bontva vevőnevenként, de ezt a bontást be is csukhatod (vagy az alapján a vevőneveket átírathatod az eredeti tábládban keres-cserél funkcióval a megfelelő - jó - értékekre).
Kösz, de sajnos nem jött össze. Ha beírom a munkalap hivatkozás nélkül, akkor megy:
=ELTOLÁS($A$1;SOR(A1)*15-9;0) (igaz, hogy a *15-9 részt egyelőre nem értem, de lényegében működik. Viszont ha a $A$1 elé írom a Munka1!-et, akkor nekiáll fájlt keresni. Ha aposztrof, vagy idézőjelpár közé teszem akkor meg hibát ad.
Azt hiszem feladom. Azt fogom csinálni, hogy összegyűjtöm az adatokat a forrás munkalapon, és ha már egy táblázatban vannak, akkor könnyű lesz átrakni őket egy tiszta munkalapra.
Így már csak elméletileg érdekel, hogy vajon miért nem akar összejönni a munkalap hivatkozás, sem az INDIREKT függvénynél, sem az ELTOLÁS-nál. Hogy én tolok el valamit, vagy az Excel?
Nagyon szépen köszönöm neked, hogy megírtad ezt a VB scriptet.
Annyiban tudnál nekem segíteni még, hogy ha az A cellában lévő nevet, szót leválasztja és átteszi a B cellába akkor az A cellában lévő leválasztott szó törlődik onnan? Ezzel teljes lenne az örömöm. Ezer hálám előre is. Mégegyszer köszönöm.
A helyedben készítenék egy segédtáblát (akár másik lapon is lehet, mint az említett táblázatod), ami tartalmazná az összes vevő kódját, mellette a nevét.
A kód beírásakor az FKERES függvény behozhatná a megfelelő helyre a nevet. Nem kell külön gépelgetni, nincs elírás.
A táblázat végén egy új oszlopban összefűzném a kódot a névvel (=A2 & " " & B2), és ezt vinném be a kimutatásba.
A füzetedben Alt+F11-re előjön a VBA szerkesztő. Bal oldalon látod a füzeted nevét, ráállsz.
Insert menü, Module. Jobb oldalon kaptál egy nagy üres felületet, oda másolt be a lenti pár sort.
Function Keresztnév(cella As Range) Dim b As Integer, f As Boolean f = False
For b = Len(cella.Value) To 1 Step -1 If Mid(cella.Value, b, 1) = " " Then Keresztnév = Mid(cella.Value, b + 1, 50) f = True Exit Function End If Next
If Not f Then Keresztnév = "1 szóból áll a(z) " & cella.Address & " cella tartalma" End Function
Visszalépsz a füzetbe, a B oszlopba beírod az új függvényt: =keresztnév(A1)
Ugyanúgy másolhatod, mint az Excel függvényeket.
Előfordulhat, hogy hibát jelez, és a szerkesztőben pirosak lesznek a sorok. Ez azért van, mert itt nincs lehetőség a VBA kód rendes bemásolására, a fórummotor nem készült fel rá. Semmi gond, az egyes piros sorok elején törlöd a szóközöket, és a Tab billentyűvel "lököd" jobbra a szöveget, míg olyan lesz a formája, mint ahogy itt látható. Ezután már működni fog.
Sajnos a táblázat felosztó algoritmussal ez nem oldható meg amit szeretnék mert van olyan szó a cellában ami több szóból tevődik össze.
Arra lenne szükségem, hogy a képlet csak az utolsó szót válassza le és tegye át a szomszédos üres cellába. Erre van valami jó kis frappáns képlet? Köszönöm a segítséget.
példa:
Ez van most
A oszlop
Kiss István
Kovács Pista
János Vitéz
Propeller Aranka
Majomkopé Harapós Erzsébet
Aminek lennie kellene:
A oszlop, B oszlop
Kiss István
Kovács Pista
János Vitéz
Propeller Aranka
Majomkopé Harapós Erzsébet
Tehát mindig csak a legvégéről venné le az utolsó szót és azt tenné át egy új cellába a régi mellé. Sajnos a szó hossz változik, ez a para. Gondolom ezt csak makróval lehetne megcsinálni. Tudna ebben valaki segíteni?
Adott egy Office 2010, ebben egy többezer soros tábla, amelyből szeretnék kimutatást készíteni. Alapvető kimutatáskészítési ismereteim vannak. A táblában vannak vevőkódok, vevőnevek és vevőforgalmak, illetve egyéb oszlopok. Azt szeretném, hogy bár a csoportosítás vevőkód alapon menjen, de a kimutatásban a vevőkódok mellett jelenjen meg a vevő neve is. Amelyet persze néha elgépelnek, de az első találat már jó lenne névnek, csak segítség. Hiszen mindegy is, hogy egy vevőnévben a kft után oda van e biggyesztve a pont vagy se.
Hiába barátom a Google, nem dob ki megfejtést erre a problémára. Bár lehet, rosszul kérdezem.
Sziasztok, most egy olyan alapszintű dologgal vagyok elakadva, hogy szinte szégyellem megkérdezni.
Egy munkafüzetbe veszek át adatokat egy munkalapról, mégpedig úgy, hogy a táblázat minden sorába a felette lévő sorban hivatkozott cellától valahány sorral lejjebb lévőből vegyem az adatot. Mondjuk 15 soronként lépjen, valahogy így:
A1: ='Munka1'!A10
A2: ='Munka1'!A25
A3: ='Munka1'!A40
Egyszerűen nem tudom megadni a folytatást. Ha kijelölök két, vagy 3 sort, és a jobb alsó sarokban megjelenő fekete kockánál fogva lejjebb húzom (ahogy számsorozatokkal szoktam), akkor majdnem jó, csak az első új sort elrontja, mert egyesével számolja, a következőknél már jól léptet, aztán megint ront és így tovább.
Azt hiszem, valami nagyon egyszerű megoldásra vagyok képtelen rájönni.
Az érvényesítésnél a Megengedve kategóriában nézz körül. Találsz ott Egész szám opciót, ahol megadhatod a min. és max. értéket. Van mód a Szöveghossz meghatározására is.
Nagyon szépen köszönöm a gyors választ, ez alapján az elsőt meg is tudtam oldani. A többivel még kicsit bajban vagyok, van egy sejtésem, hogy rosszul adtam meg a képletet.
Eddig erre jutottam:
B) ÉS(SZÁM(F5);HOSSZ(F5)=9;DARABTELI(F:F;F5)=1) C) erről sejtésem sincsen D) (SZUM(H5)>500000)
Az érvényesítési opciók között van olyan, hogy "Egyéni". A legtöbb esetben erre lesz szükséged. Ha kiválasztod az egyéni érvényesítést, akkor egy képletet kell megadnod.
A képlet egyenlőségjellel kezdődik, és utána van egy logikai feltétel, amelyre azt akarod, hogy a beírt értékek ezt a feltételt teljesítsék.
Ha pl. azt akarom, hogy az A1 cella ne kezdődhessen alulvonással, akkor az A1 adatérvényesítési képlete ez lesz:
=BAL(A1;1)<>"_"
A feltételek kombinálhatók egymással. Ha több feltétel teljesülését akarod kikényszeríteni, akkor használhatod az ÉS függvényt. Pl. ha azt akarom, hogy az A1 cella ne kezdődhessen alulvonással, és a vége ne lehessen felkiáltójel, akkor az A1 adatérvényesítési képlete ez lesz:
=ÉS(BAL(A1;1)<>"_";JOBB(A1;1)<>"!")
Amikor a felhasználó beír egy értéket, akkor az Excel kiszámolja az adatérvényesítés képletének eredményét, és ha az IGAZ, akkor mehet ha HAMIS, akkor kiabál.
Ez alapján szerintem el tudsz indulni, szólj ha mégsem, vagy elakadsz.
Egy házi feladatomban kéne segítség, adatérvényesítést kell csinálni. Az alapokat tudom, de egy ilyen szintűt már nem annyira. A tanár meg is jegyezte, hogy nehéz, gondolkozzunk rajta. Sajnos nem jutottam semmire, és hozzátok fordulnék.
"Végezd el a következő adatérvényesítési beállításokat: A) Beteg neve: nem lehetnek benne kezdő és záró szóköz karakterek B) TAJ szám: 9 számjegy és nem fordulhat elő 2x ugyanaz a TAJ szám C) Utolsó vizit dátuma: a dátum nem eshet hétvégére D) Költség: a teljes költség nem haladhatja meg az 500.000 Ft-ot"
Gondolkoztam a HA függvényeken pl. a név esetében =HA(VAGY(BAL(A21;1)=" ";JOBB(A21;1)=" ");"A név két szélén nem lehet szóköz";"Név Rendben"), de szerintem a táblázatba kell beírni az adatokat, és nem pedig egy másik táblázatból kiválogatni. Az érvényesítésben pedig egyáltalán nem találtam ilyen beállítási lehetőséget.
B oszlopban hatosával növekvő sorszám van. (pl. 1,1,1,1,1,1,2,...) =HA(DARABTELI($B$3:B3;B3)=6;HA(ÜRES(R3);B3+1;R3+1);B3) Előfordul, hogy egy-egy sorszámot ki kell hagyni. (pl. 1,1,1,1,1,1,3,...) A B oszlopban állva átírom a következő sorszámra. Abban szeretném a segítségeteket kérni, hogy amikor átírom pl. 2-es sorszámot 3-ra, automatikusan az R oszlopban az 1-es sorokkal egy vonalba beírja a kimaradó 2-es sorszámot. Most csak ez a makróm van,
Bocs, de egész nap el voltam foglalva - délben is csak benéztem... Megpróbálok a két kérdésedre egy hsz-ben válaszolni.
1. Tudomásom szerint a közös munkafüzet mások által történt változtatásairól csak és kizárólag a mentés során lehet értesülni. Tehát ahhoz, hogy megtudd a munkafüzet legutolsó (pillanatnyi) állapotát, menteni kell a munkafüzetet. Ezután meg tudod nézni, hogy a korábban feltöltött értékek jók-e még.
2. A változtatások elfogadása ill. az ütközések feloldása igazából két külön "világ" és tulajdonképpen nehezen automatizálható szerintem - hiszen el kell dönteni, ha 3 felhasználó is módosította ugyanazt az adatot (cellaértéket), akkor abból melyik érvényes most. Jó, persze lehet mondani, hogy a legutolsónak bevitt érték, vagy csak a "jános" által bevitt érték fogadható el, de azért egy kicsit valahol ez mégis rizikós egy kicsit.
Én ezt úgy oldottam meg (mármint, hogy ne kelljen foglalkozni ütközésekkel), hogy minden felhasználónak van "saját területe", ahova csak ő írhat (tkp. a program csak oda ír), ezáltal más nem tudja a területet módosítani. Nem mondom, hogy ez mindig és minden helyzetben használható, de nálam működőképes volt. Hogy jobban értsd, a terület az nem egész munkalap volt, hanem pl. az adatok tárolására szolgáló lapon egy sor, aminek a "kulcsában" benne van az adott felhasználó azonosítója, a makró mindig ebbe a sorba írja az általa bevitt ill. hozzá tartozó adatot.
Azokat a funkciókat pedig, ahol sok-sok sorba kell adatot bevinni, vagy pl. kimutatást, diagramot kell készíteni, meghatározott jogosultsággal lehet végrehajtani, ha szükséges, akkor a közös felhasználás átmeneti megszüntetésével majd a feladat elvégzése után az ismételt megengedésével.
Ha ütközéseket megengedünk, akkor szerintem kell egy olyan felhasználó, aki eldönti, hogy melyik adatot használja tovább a rendszer - ez nagyon ciki lehet pl. egy raktárkezelésnél, amikor már nem létező mennyiséget szeretnének kiadni, vagy nullás készletet látnak, holott már van bevételezve, csak még nem látja az új értéket.
Én ebben az esetben azt javaslom, hogy ki kell kapcsolni a változások követését és következetesen alkalmazni a mentés minden írás-olvasás előtt.
Ellenőrizhető e az, hogy a közös munkafüzetben történt e változás a megnyitotthoz képest? Azért, hogy a másik felhasználónál megnyitott userform képes legyen frissülni magától - ugyanis a kontrollokat egyszeri inicializálással töltöm fel egy tömbből - és ezt a tömböt frissíteni kellene ha változik a tartalom.
Közös fájlban akkor frissülnek a mások által bevitt adatok, ha mentést hajtanak végre, ehhez nem kell - nem is szabad - bezárni a fájlt. Arról kell gondoskodni, hogy adatbeírás előtt és után is legyen mentés. Más kérdés, hogy amíg a mentés folyik, addig másik felhasználó nem tud beleírni a fájlba, az ő számára addig elérhetetlen a fájl - és persze fordítva is így van. Azaz ezt az elérhetetlenséget, ami egyébként hibajelzés alapján detektálható, kezelni kell, addig kell ismételni, amíg végre nem lehet hajtani a mentést.
A beírás előtti mentés azért kell, hogy értesüljön a program az időközbeni változásokról, majd a mentés után ellenőrizni érdemes, hogy sikerült-e (ez persze nem kötelező).
Van valakinek tapasztalata közös használatból eredő problémákkal?
Userformon lévő kontrollokal írok/olvasok egy közössé tett fájlba/ból.
Ezt az userformot több felhasználó használja és azonos időben is írnak / olvasnak a közössé tett fájlba/ból.
Illetve... tennék ezt - ugyanis nem működik. Érthető okok miatt.
1.
Az userform megjeleníti a közös fájl tartalmait a rajta lévő kontrollokon keresztül. A különböző felhasználóknál nyitva lévő formok csak újraindítás után látnak aktuális adatot. (Az ok érthető, de nem elfogadható) Ez még megoldható egy "Frissítés" típusú kódsorral egy gombhoz rendelve - ha máshogy nem megy. De ez vajon csak úgy lehetséges, ha ez a frissítés kódsor bezárja/újra nyitja a háttérben a közös munkafüzetet?
2.
A többfelhasználós adatbeírás sem az elvártak szerint működik. Nem a megfelelő helyre történik a bejegyzés (Ez egy application.match –al megtalált sorban történik). Valószínűleg ez kívülálló számára most nem értelmezhető – de ennek szintén az az oka, hogy a két felhasználó által megnyitott userform csak azt látja, ami a megnyitáskor fizikailag a megosztott munkafüzetben benne van. Így az egymásra(egyszerre) írt azonos sorban lévő adatok elválnak egymástól és nem fednek
Excel 2010: Adatok -> Érvényesítés -> Lista beállítás.
Azt szeretném megkérdezni, hogy lehet beállítani azt, hogy a listából ne csak a legördülő elemek végigböngészésével lehessen választani, hanem, ha elkezdik begépelni és ha van olyan listaelem, akkor szépen ráálljon arra és így kiválasztható legyen.
Ahogy elnézem, nem kerülhető el, hogy bármelyik ComboBox változásakor az összes többinek a listáját újra kelljen építeni, ráadásul úgy, hogy az egyes ComboBox-ok aktuális értéke is megmaradjon. Ha mondjuk létezne olyan objektum - legyen az Collection, Dictionary vagy bármi - amelynek az elemeihez flag-eket lehet társítani, és a flag-ekre szűréssel le lehet kérdezni egy tömbbe, akkor talán elegánsabb módon is meg lehetne oldani a feladatot.
Hacsak nincs a ComboBox-ok között hierarchia, mert az teljesen más megközelítés. (Értsd: ComboBox#1 bármilyen értéket felvehet, #2 csak a még nem foglaltakat, és csak akkor, ha #1 már ki lett választva, #3 csak a még nem foglaltakat, és csak akkor, ha #1 és #2 már ki lett választva, stb. #1 megváltoztatásakor #2, #3 és #4 értéke törlődik, stb.)
Próbáld ki ezt. Az egész kód a userform-ra megy. Kicsit favágós, de szerintem műxik.
A piros részek környezettől függően módosítandók. A Separator lehet akár egy alulvonás is, de mindenképpek olyan karakter(sorozat) legyen, ami biztosan nem fordul elő a listaelemekben.
Dim Skip As Boolean
Private Sub UserForm_Initialize() RebuildLists End Sub
Private Sub ComboBox1_Change() If Not Skip Then RebuildLists End Sub
Private Sub ComboBox2_Change() If Not Skip Then RebuildLists End Sub
Private Sub ComboBox3_Change() If Not Skip Then RebuildLists End Sub
Private Sub ComboBox4_Change() If Not Skip Then RebuildLists End Sub
Private Sub RebuildLists() Const Separator = "#@-{}" Dim Arr, i As Long, j As Long Dim Reserved As String, Current As String
Skip = True Arr = Application.Transpose(Worksheets("Munka1").Range("A1:A10")) For i = 1 To 4 If Me.Controls("ComboBox" & i).Value <> "" Then Reserved = Reserved & Separator & Me.Controls("ComboBox" & i).Value & Separator Next For i = 1 To 4 With Me.Controls("ComboBox" & i) Current = .Value .Value = "" While .ListCount > 0 .RemoveItem 0 Wend For j = LBound(Arr) To UBound(Arr) If (Arr(j) = Current) Or (InStr(Reserved, Separator & Arr(j) & Separator) = 0) Then .AddItem Arr(j) Next If Current <> "" Then .Value = Current End With Next Skip = False End Sub
Szerintem makró kell hozzá. Az eredeti tartományodat elmented valahova. Majd egy-egy listaelem kiválasztásakor törlöd azt a cellát, amiben a listaelem van.
Valamikor csináltam egy olyan makrót, amelyik visszatenni is képes volt listaelemet (ha az egyszer már kiválasztottat mégis átírták másra), vagy itt, vagy az ITCafe, vagy a Prog.hu, már nem emlékszem rá - a fájlt meg nem őriztem meg :(.
A feladat elvileg nem okozna nehézséget, de van néhány nehezen áthidalható gond.
1. Nem tudom, miért kell az egyes szereplők adatait önálló fájlban tárolni. (ne hívjuk őket külön excelnek, hanem külön munkafüzetnek, mert ez az általánosan elfogadott neve ezeknek az Excel fájloknak)
2. Nem adtad meg az egyes munkafüzeteken belül a munkalap nevét, amelyben az adataid találhatók. Feltételezem, hogy meghagytad az Excel által automatikusan adott „Munka1” munkalap nevét, de ezt azért jó lenne tisztázni.
3. Nem derült ki a leírásodból, hogy minden egyes munkafüzetben ugyanazokban a cellákban vannak-e az adatok. Eredetileg azt írtad, hogy az A1-B4 cellákban, a mostani mintád szerint a C5-D11-ben vannak, minden második sor üresen hagyásával.
4. Az sem világos, hogy a kiértékelő táblázatban miért Tóth Gábor neve mellé kerülnek a Nagy Zoltán adatait tartalmazó munkafüzet elérhetőségei.
Javaslatom: Ha még nincsenek kőbe vésve az eddigiek, akkor át kellene gondolni a feladatot az elejétől. A teljes adat- és fájlszerkezettel. Elsőként azt mondd meg, hogy mit szeretnél megoldani? Aztán utána gondoljuk át az adatszerkezetet. Mondjuk a következők szerint:
1. Azzal kezdeném, hogy meg kellene próbálni az összes Excel fájlodat (a munkafüzeteidet) egyetlen munkafüzetbe összegyűjteni úgy, hogy a jelenlegi munkafüzeteid aktív lapjai egy-egy munkalapot képezzenek az új munkafüzetben. Ezek neve lehetne az érintett személy neve. Ezzel nem lenne szükség arra, hogy a kiértékelő táblázat nyitogassa meg őket.
Ez kézzel túl nagy munka, de ezen könnyű segíteni. Egy makró kell hozzá, ami a munkafüzeteket egyenként megnyitja, és az általad megadott munkalapok tartalmát összehozza egy munkafüzetbe. Ezt megírom neked, és egyszer lefuttatva elkészítheted vele a közös munkafüzetet.
2. Aztán, ha megmondod, hogyan képződnek az egyes Excel fájlok (munkafüzetek) akkor talán tudnék segíteni abban, hogy a későbbiek is a közös munkafüzetbe kerüljenek.
3. Az is kérdés persze, hogy szükséges-e egyáltalán külön munkalapon tárolni az egyes személyek adatait. Nem lenne megoldható, hogy eleve a kiértékelő táblázatba kerüljenek be az adatok?
köszönöm szépen a gyors segítséget, és elnézést az érthetetlen magyarázatért!
Megpróbálom mégegyszer:
Vannak beérkezö formalapok egy minta alapján:
Ezekböl az adatok átkerülnek egy kiértékelésbe:
A kiértékelésben a hiperhivatkozás szerepel, de mellé lehet írni szövegesen az elérési útvonalat is ha szükséges.
A célom az lenne, hogy az adatok hiperhivatkozás illetve az elérési út megadása után valamilyen szinten automatizálva kerüljenek át a kiértékelésbe. A rengeteg excel és a bennük lévö adatok miatt lenne erre szükség.
Az jutott még eszembe :-), hogy azt nagyon bonyi volna megoldani, hogy egy-egy adattábla csak a saját alakzatára klikkelve tűnjön el ? Tehát ha pl. kint van a négyzet táblázata, ne tűnjön el ha a rombuszra vagy másra klikkentünk, csak ha a négyzetre. Vagyis több táblázat is kint lehessen párhuzamosan.
Az Adatok táblázat jó volna ha nem a fő lapon lenne, hanem a Munka2 -n. Próbáltam átmásolni a Munka2 -be és a makróban átírni Munka2!Adatok -ra, de nem örült neki :-)
Szerintem ez sem lett érthetőbb. Kezdjük azzal, hogy mit nevezel a formalapok linkjének? Biztos vagyok benne, hogy nem linkre (azaz hiperhivatkozásra) gondolsz, mert azzal az Excel táblázatban nem lehetne mit kezdeni. Lehet, hogy munkafüzet nevére gondolsz az elérési úttal együtt (mert azzal lehet dolgozni)
Nem tudnál inkább egy mintát feltenni egy formalapról, és egy másikat a kiértékelési táblázatról? És egy picit pontosabban elmondani, hogy a kiértékelési táblázatod egyes celláiban mit szeretnél látni. azaz a kiértékelő munkafüzetben az N oszlop egyes soraiba mi kerül, és ezeket a forma munkalapokról mely cellák összegzésével szeretnéd előállítani.
Például így: /de még jobb, ha valahova (Google drive, vagy data.hu) felteszel egy-egye munkafüzetet mintának, és csak annak a linkjét küldöd el/
Ami persze rögtön felvet egy kérdést, nem lenne-e célszerűbb az 1. sorba írni a megnevezéseket, és alá az adatokat, így sok munkafüzet helyett (amit külön .xls-nek nevezel) egyetlen munkalapon kerülhetnének egymás alá a nevek, és talán könnyebben is lehetne dolgozni velük)
Ez így mostmár majdnem olyan, mint amit szeretnék :-)
Tudnád úgy módosítani, hogy ha a téglalapra ráklikkelek akkor jelenjenek meg a hozzá tartozó mezők, ha újra ráklikkelek akkor pedig tűnjenek el ? Ugyanígy ha a rombuszra klikkelek akkor az ahhoz tartozó mezők legyenek láthatók, a következő ráklikkelésig. Stb.
Nagyjából hasonlítana a Megjegyzés beszúrása funkcióra, csak itt nem akkor jelennének meg az adatok ha a mező fölé viszem az egeret hanem ha ráklikkelek az obketumra, és a következő klikkelésre tűnne el. A megjegyzésbe írt dolgokat nem lehet olyan rugalmasan módosítani és áttekinteni, ezért lennének az adatok a Munka2 -n.
Az Adatok táblázat jó volna ha nem a fő lapon lenne, hanem a Munka2 -n. Próbáltam átmásolni a Munka2 -be és a makróban átírni Munka2!Adatok -ra, de nem örült neki :-)
Várhatóan a "rajzom" nagyobb lesz mint egy képernyő, ezért a megjelenő adatoknak mindig annak a közelében kellene megjelenni, ahol klikkelek. Vagy tulajdonképpen fix helyen is megjelenhet, pl. a bal felső sarokban.
Kicifráztam. Kibővítettem az Adatok táblát úgy, hogy a megjelenő "fénykép" mérete igazodjon a benne lévő adatokhoz. A szorzókat írd át úgy, hogy a saját monitorodon jó kép jelenjen meg.
Tulajdonképpen azt szeretném megoldani, hogy az egyik lapon van egy rajz ami négyzetekből és az azokat összekötő vonalakból áll ( kb. 50 db vonal ), a másik lapon pedig táblázatos formában vannak a vonalakhoz tartozó adatok. A feladat az volna, hogy ha az egyik lapon ráklikkelek egy vonalra, az ahhoz tartozó adatokat jelenítse meg a másik lapról. A segítségeddel mostmár egy vonalra vonatkozóan megvan a megoldás, csak nem tudom a többit úgy célszerű-e megoldani, hogy annyiszor annyi makrót hozok létre és rendelgetek hozzá a vonalakhoz, vagy esetleg van egyszerűbb/hatékonyabb/gyorsabb megoldás is ?
A formalapok és a kiértékelés azok külön .xls -ek. A több tucat formalapból szeretném a szükséges adatokat kiszedni a kiértékelésbe, ahol most csak a formalapok linkjei vannak egymás alatt egy oszlopban. Azt szeretném, hogy ezek mellé a linkek mellé kerüljenek az előre meghatározott adatok a linkre mutató .xls-ből.
A következö excel táblázatot szeretném létrehozni:
"Formalapoknak a kiértékelése"
A formalapok mindíg úgyanúgy néznek ki, csak egyes cellák változnak. (PL A1:Név,B1:Nagy Zoltán vagy A2: Kor,B2:86, A3:Szemüveg szín, B3:fekete, A4:unokák száma B4:5)
A formalapok linkjét bemásoltam a kiértékelésre szolgáló táblázat N oszopába, és szeretném, hogy a többi információ, Név, kor, stb... ugyanabban a sorban legyen a link mellett.
Egyenlöség jellel próbáltam, hogy formalap adott cellájával egyenlö a kiértékelésen megfelö cella, és ami változna az a formalap elér´si útvonala lenne. A linkek mellett pedig szövegesen is lehetne a link, ha úgy könnyebb használni.
Remélem nem túl bonyolult, köszi szépen a segítséget, és bocsi, hogy csak úgy idetolakodtam!
Van egy html-ből wordben megnyitott fájlom, a szöv.szerk. felismeri a táblázatot, de az a gondom, hogy átviszi fattyúsorként bizonyos cellák sorait új oldalra és nekem valahogy meg kéne szakítani az egybefüggő táblát, hogy egy előbbi sornál tehessek pl. oldaltörést (natúr így most nem engedi).
Ha értitek a problémát és tudtok rá megoldást, légyszi...
Egy táblázatban ügyiratszámok szerepelnek (K-0032/2016). Sikeresen kiszedtem belőle a sorszámot (0032) egy másik cellába. Az adatra számként lenne szükségem (32), tehát az elöl lévő nullá(ka)t el kellene belőle távolítani. Van 0004, 0032, 0124, 1230 is (1-től párezerig).
Simán "keresés és csere"-módon ugyan eltávolíthatók, de ez kiszedi az összes nullát.
Összegezve, makró használata nélkül egy olyan képletet keresnék, amely a szövegben fix helyről kiszedett adatrészből egy másik cellába számot csinál.
Javítottam egy korábbi kódomon, mert privát érdeklődés jött (köszönöm Delila), gondoltam megosztom.
Az eredeti a 12402 hsz-ben volt (és a kontextus is arrafelé van), az új meg itt:
Sub kombi2() Dim Rng As Range, Hit As Range Dim ix As Long, Lvl As Long, Cnt As Long, iter As Long Dim LvlAct, LvlSel Dim BaseSum As Double, TestSum As Double Dim Dest As Double, small_ix As Double
Dest = Range("c3") Set Rng = Range("A3:A29") Cnt = Rng.Cells.Count ReDim LvlAct(1 To Cnt) ReDim LvlSel(1 To Cnt)
For ix = 1 To Cnt LvlAct(ix) = ix LvlSel(ix) = 0 Next
Lvl = 1 Do iter = iter + 1 Application.StatusBar = iter small_ix = Application.WorksheetFunction.Small(Rng, LvlAct(Lvl)) TestSum = BaseSum + small_ix If (Round(TestSum, 5) < Round(Dest, 5)) Then If LvlAct(Lvl) < Cnt Then LvlSel(Lvl) = small_ix BaseSum = BaseSum + LvlSel(Lvl) Lvl = Lvl + 1 LvlAct(Lvl) = LvlAct(Lvl - 1) + 1 ElseIf LvlAct(Lvl) = Cnt Then Lvl = Lvl - 1 BaseSum = BaseSum - LvlSel(Lvl) LvlAct(Lvl) = LvlAct(Lvl) + 1 LvlSel(Lvl) = 0 End If ElseIf (Round(TestSum, 5) > Round(Dest, 5)) Then Lvl = Lvl - 1 BaseSum = BaseSum - LvlSel(Lvl) LvlAct(Lvl) = LvlAct(Lvl) + 1 LvlSel(Lvl) = 0 ElseIf (Round(TestSum, 5) = Round(Dest, 5)) Then MsgBox "heuréka" 'Stop For ix = 1 To Cnt If LvlSel(ix) = 0 Then Exit For If PaintNextFinding(Base:=Rng, FindValue:=LvlSel(ix)) = False Then MsgBox "bibi van: nem találok egy számot, amit egyszer már megtaláltam..." Stop End If Next If PaintNextFinding(Base:=Rng, FindValue:=small_ix) = False Then MsgBox "bibi van" Stop End If Application.StatusBar = False Exit Sub End If If Int(iter / 500) = iter Then DoEvents Loop End Sub
Function PaintNextFinding(Base As Range, FindValue As Variant) As Boolean Dim Hit As Range, FirstAddress As String, CIndex As Long
With Base Set Hit = .Find(what:=FindValue, lookat:=xlWhole, LookIn:=xlValues) If Not Hit Is Nothing Then FirstAddress = Hit.Address Do If Hit.Interior.ColorIndex = xlNone Then Exit Do Set Hit = .FindNext(Hit) Loop While (Not Hit Is Nothing) And (Hit.Address <> FirstAddress) If (Hit Is Nothing) Then PaintNextFinding = False ElseIf (Hit.Address = FirstAddress) And (Hit.Interior.ColorIndex <> xlNone) Then PaintNextFinding = False Else PaintNextFinding = True Do CIndex = Int(Rnd() * 50) + 3 Loop While (CIndex = xlNone) Or (CIndex = 2) Hit.Interior.ColorIndex = CIndex End If Else PaintNextFinding = False End If End With End Function
Egészre kerekítve használom, mert a konkrét feladatnál nincs szükségem nagyobb pontosságra.
Amikor a táblázatot összeállítom, akkor a százalék értékét a szazalek = round(adat/osszeg*100,0) képlettel számítom ki, a százalékjelet meg simán mögébiggyesztem, és így írom ki táblázatosan.
A diagramnál pedig a következő képletet adom meg:
With ActiveChart.SeriesCollection(1)
.DataLabels.NumberFormat = "0%"
End With
És az önállóskodás ennél történik. És nem is lenne baj ez a kis csalás, csak nem szeretném, hogy a táblázatomban és a diagramon szereplő adatok egymástól eltérjenek. Azt viszont nem tudom megjósolni előre, hogy az Excel melyik adatot fogja a megszokottól eltérő módon kerekíteni. Főleg akkor nem, amikor két azonos adatot kétféleképp kerekít.
Most már nagyjából megvagyok vele. Lehet, hogy a százalékos értékeket kellett volna a kész diagramról visszaolvasni, és a táblázatba tenni, vagy pedig magamnak felírni a diagramra a feliratokat, ahogy korábban a segítségeddel a pontdiagramnál sikerült egy hasonló megoldást alkalmazni.
Még mindig a diagramoknál tartok. Most éppen az Excelre vagyok kiakadva. Kördiagramokat készítek, amelyeken a darabszámokból %-os értéket kérek feltüntetni. És mivel az eredményeket táblázatosan is meg akarom jeleníteni a diagram mellett, már egy órája azzal kell szórakoznom, hogy javítgatom a diagram százalékos adatait.
Az a mániája, hogy a kerekítések eredményeként nem lehet 99, vagy 101 a százalékok összege, hanem pontosan 100. Ezért inkább rosszul kerekít. Például két azonos darabszámnál, ahol az érték 17,57%, képes az egyiket lefelé kerekíteni 17-re, és csak a másikat írja 18%-nak. Amikor én kiszámoltam a táblázatban, akkor természetesen a szokásos kerekítési módszert alkalmaztam. Most javítgathatom át kézzel az adatokat az Excel adatpontjai mellett. Nagyon kellemetlen.
Nem hinném, de azért megkérdezem, hogy ugye nincs erre beállítási lehetőség?
A Fényképezőgép ikonnal könnyen létrehozható. A Gyorselérési eszköztárra kell kitenned az ikont. A Gyorselérési jobb oldalán lévő legördülővel behozod a Testreszabást. Ott a Választható parancsoknál a Minden parancsot választod, majd a megjelenő sok parancs közül a Fényképezőgép-et a Felvétel gomb segítségével átmásolod a jobb oldalra, OK.
A füzetben kijelölöd a tartományt, amit látni akarsz. Klikk az ikonra, a megjelenő szálkereszttel rajzolsz egy négyszöget. Ebben azonnal látod a kijelölt adataidat.
A csatolt minta alapján tegyél ki egy gombot, ami indítja a füzetben lévő makrót.
Egyik kattintásra megjelenik a négyszög, másikra eltűnik.
Segítséget szeretnék kérni. Azt szeretném megoldani valahogy, hogy ha az excel tábla egy adott elemére ( pl. egy vonal alakzatra ) klikkentek egérrel, akkor jelenjen meg egy másik munkalap adott részlete, pl. a C5 - G10 közötti része. Ne váltson át arra a másik munkalapra, hanem csak egy kis ablakban jelenítse meg, mintha pl. egy felugró help lenne.
Ha csak ennek a funkciónak a nevét vagy néhány támpontot leírtok valószínűleg az is elegendő lesz és onnan már tovább bogarászom, de egyelőre azt sem tudom mit keressek. Köszi.
A dátumot az Excel számként kezeli, ahol az alapegység 1 nap. A B3-ban lévő perceket ezét 60-nal kell osztani, hogy óra legyen belőle, majd 24-gyel, hogy nap.
Sziasztok! A következő problémával állok szemben: Az A oszlopban szerepelnek a modellek nevei, a B oszlopban a gyártási időtartam és a C oszlopban a befejezés ideje. A C oszlopba szeretnék egy képletet, ami nekem automatikusan számolná a befejezés időpontját. Például a C3-as mezőbe a C2-es mezőben szereplő időpont + a B3-as mező értékének az összege kerül. Ez így nem tűnik bonyolultnak, de azért nem sikerült megcsinálnom, mert az egyik formátum az dátum, a másik pedig sima szám(legyártás ideje percekben). Minden segitséget szivesen fogadok. Köszi!
Az szerintem sajnos kevés, mert csak cellaérték változásakor fut le ekkor is a függvény (sajnos a szín megváltozása nem váltja ki az újraszámolást).
"This example marks the user-defined function "My_Func" as volatile. The function will be recalculated when any cell in any workbook in the application window changes value."
Bocs, az előbb fordítva ültem a lóra, Neked más kell nyilván. Jól kezdtem a gondolkodást, aztán gyorsan el is "hajoltam".
Ha megváltoztatod az értékét az A1 cellának, akkor automatikusan változni fog az A2 cellába írt szám is - nálam legalább is így viselkedik a függvény.
A színváltozást tudtommal nem figyeli semmilyen eseménykezelő.
Ráadásul, ha feltételes formázás miatt változik a szín, akkor az Interior.Color értéke nem is változik. Az újabb (2010-től) verziókban van egy Displayformat tulajdonság, aminek az Interior.Color értéke adja meg, hogy a cella színe épp milyen.
Mitől változik az A1 cella értéke? Ha ahhoz kötöd az A2 cella színét, akkor szerintem feltételes formázást kellene használnod - pl. formázandó cellák kijelölése képlettel, képlet pedig =A1=valami utána kiválasztani a kitöltő színt. De lehet cella formázás érték alapján is, ahol min-max értéket is meg tudsz adni a formázásra.
A feltételes formázást pont erre az esetre találták ki.
"Összeolvasztod" a két makrót: az első végéről kitörlöd az End Sub, a második elejéről a Private Sub Worksheet_Activate() sort és már kész is van. A sorrend pont megfelel a kívánalmaidnak.
Igen. Ezt próbáltam én is, de sajnos azt írja, hogy ambiguous name detected.
Valószínűleg az a baja, hogy nekem előtte már van egy ilyen makróm. Tehát így néz ki egészében.
Ezt valahogy át lehetne úgy írni, hogy mindkettő működjön, és először a sorba rendezést végezze el, majd a sorba rendezett adatokhoz rendelje hozzá a képet?
"Private Sub Worksheet_Activate() Dim usor As Long
usor = Range("D" & Rows.Count).End(xlUp).Row
Sort.SortFields.Clear Sort.SortFields.Add Key:=Range("D1:D" & usor), _ SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal With Sort .SetRange Range("A1:E" & usor) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
Private Sub Worksheet_Activate() ActiveSheet.DrawingObjects.Delete Dim Kepneve As String, utvonal As String, sor As Long
utvonal = "d:valakivalami" '***
For sor = 2 To 23 Kepneve = Cells(sor, "A") & ".png" '***** With ActiveSheet.Pictures.Insert(utvonal & Kepneve) .Top = Rows(sor).Top .Height = Rows(sor).Height .Left = Columns(1).Left + Columns(1).Width - .Width End With Next End Sub"
Sub Kepek() ActiveSheet.DrawingObjects.Delete Dim Kepneve As String, utvonal As String, sor As Long
utvonal = "d:valakivalami" '***
For sor = 2 To 23 Kepneve = Cells(sor, "A") & ".png" '***** With ActiveSheet.Pictures.Insert(utvonal & Kepneve) .Top = Rows(sor).Top .Height = Rows(sor).Height .Left = Columns(1).Left + Columns(1).Width - .Width End With Next End Sub
Ez működik is normálisan, viszont csak akkor ha elindítom.
Az lenne a kérdésem, hogy megoldható-e, hogy ez magától lefusson, ha én a munkalapra ráklikkelek.
Köszönöm, de ez nem ment volna. Különböző munkalapokra készített diagramokat szerettem volna összehozni. Az egyes munkalapokon viszont más-más szempontok alapján (a rajtuk megjelenő más-más szövegek szélességéhez igazítva) állítottam be az oszlopok szélességét. Ez a képeket nem érintette, tehát azoknál el lehetett volna "rontani" a szélességet.
Aztán megtaláltam a megoldást. Az egyes nyomtatandó diagramok, és a hozzá tartozó szövegrészek tartalmát összehoztam (bemásolgattam) egy új munkalapra, és azon már sikerült megoldanom az egységes méretezést vonalzó nélkül. Sőt a végén még a rácsvonalakat is töröltem, így még szebbek lettek az elkészült képek.
Nem tudom, érthető-e a leírás alapján a megoldás, mindenesetre sikerült áthidalnom vele az eredeti problémát.
A diagramokat lehet egyformára méretezni, sőt az oszlopszélességet is. Próbáld meg a két munkalapot ilyen módon "szinkronizálni". Akkor nem kell a vonalzó...
Egy újabb gond. Eddig fel sem tűnt, hogy az Excelben alapesetben nincs vonalzó, és nem is állítható be normál, csak a lap elrendezése nézetben. Most kellene, ugyanis hasonló kinézetű munkalapokról szeretnék WORD-be diagramokat másolni, és jó lenne, ha legalább az egy lapra kerülő képek nem csúsznának el egymáshoz képest, mint pl. itt:
A képek két külön lapról lettek kivágva és bemásolva. És persze az egyes oszlopok rácsvonalai sem vágnak egybe, sem a diagramok.
Nem tud valaki megoldást, például egy segédprogramot, amivel vonalzót tudnék helyezni a kép fölé, hogy egységesítsem a méretezést? A a lap elrendezése nézet erre a célra használhatatlannak tűnik számomra.
Bocsánat, a kérdést kicsit pontatlanul fogalmaztam meg. Amikor azt kérdeztem, hogy "Hogyan tudnám elérni, hogy a kisebb felbontású gép is valamivel kisebb ábrákat készítsen...", akkor nem magának a diagramnak (a keretben lévő résznek) a méretére gondoltam, mert azt tudom szabályozni, hanem azon belül, magának a kör alakú ábrának a méretére, valamint a távolságára a diagram címétől. Erre nem tudok egyelőre semmilyen lehetőséget, sem kézi úton, sem programból.
Újabb gondom van a diagramjaimmal. Két gépen szerettem volna a diagramrajzoló programomat futtatni, hogy hamarabb kész legyek. Eddig egy 1280 x 1024 felbontású gépen készítettem a rajzokat, most egy 1280 x 800-as felbontású gépen is futtattam. (Utóbbit nagyobbra állítani nem tudom).
És a két gépen az Excel táblázaton pontosan ugyanarra a területre állítottam be a diagram méretezését, a belső arányok mégis mások lettek. Az elsőn, a nagyobb felbontásún olyan lett, ahogy szerettem volna, a másikon egymásba csúszott a diagram címe, és a diagram egyes feliratai. Az alábbiak szerint.
Hogyan tudnám elérni, hogy a kisebb felbontású gép is valamivel kisebb ábrákat készítsen, és az távolabb kerüljön a diagram címétől?
Van egy munkalapom. Azt szeretném elérni, hogyha erre a munkalapra lépek (kattintok), akkor automatikusan tegye csökkenő sorrendbe a 4. oszlop (D oszlop) alapján az adatokat.
Hát azért így utólag, néhány órai próbálgatás után be kell vallanom, hogy a Stop előtti utolsó sorod nélkül nem tudtam volna megoldani a feladatomat. Még egyszer nagyon köszönöm.
Ez a makró kiírja az Immediate ablakba az utolsó kirajzolt adatpontokat, amellett, hogy az utolsónak kirajzolt ponthoz illeszti az adatfeliratot:
Sub pontok() Dim ch As Chart, sr As Series, pt As Point, ponthely As New Collection, ptha As String, xx As Integer, pth Set ch = ActiveSheet.ChartObjects(1).Chart Set sr = ch.SeriesCollection(1) sr.HasDataLabels = False For xx = 1 To sr.Points.Count Set pt = sr.Points(xx) pt.ApplyDataLabels Type:=xlDataLabelsShowValue, ShowCategoryName:=True On Error Resume Next ptha = ponthely(pt.DataLabel.Text) If Err <> 0 Then ponthely.Add pt.DataLabel.Text & "!" & xx, Key:=pt.DataLabel.Text Else sr.Points(Split(ponthely(pt.DataLabel.Text), "!")(1)).HasDataLabel = False ponthely.Remove pt.DataLabel.Text ponthely.Add pt.DataLabel.Text & "!" & xx, Key:=pt.DataLabel.Text End If Err = 0 On Error GoTo 0 Next Debug.Print "Legutolsó adatpontok:" & vbLf & "Adatérték Adatpont száma" For Each pth In ponthely: Debug.Print Split(pth, "!")(0), Split(pth, "!")(1): Next 'Stop End Sub
Ha a pontnak megadod a feliratát, abból ki tudod olvasni az értékeket. Az alábbi makrórészlet ezt teszi:
For Each pt In sr.Points If Not pt.HasDataLabel Then pt.ApplyDataLabels Type:=xlDataLabelsShowValue, ShowCategoryName:=True On Error Resume Next Set ptha = ponthely(pt.DataLabel.Text) If Err <> 0 Then ponthely.Add pt, Key:=pt.DataLabel.Text Else pt.HasDataLabel = False 'pt.HasDataLabel = True 'pt.DataLabel.Text = Int(pt.Left) End If Err = 0 'End If On Error GoTo 0 End If Next
Private Sub CommandButton1_Click() If ZaroHazszam = "" Then GoTo Hiba If KezdoHazszam > "" And Not IsNumeric(KezdoHazszam.Value) Then GoTo Hiba If KezdoHazszam = "0" Or ZaroHazszam = "0" Then GoTo Hiba If Not IsNumeric(ZaroHazszam.Value) Then GoTo Hiba If Val(KezdoHazszam) >= Val(ZaroHazszam) Then GoTo Hiba
MsgBox "Felírás", vbInformation Exit Sub
Hiba: MsgBox "Hiányos, vagy hibás házszám", vbCritical End Sub
Más: Nálatok is lelassult a fórum, vagy csak nálam?
Nagyon köszönöm. Ez már egész közel van ahhoz, amit szeretnék. Egy teszt erejéig sima sorszámot tettem a feliratba, hogy lássam, milyen sorrendben sorszámozódnak be az egyes pontok. A következőt kaptam:
Tehát egy adott példában a 3,3 pontba teszi az első címkét, majd az 5. oszlopban folytatja az 5,3/5,5 és 5,4 sorrendben és így tovább.
Ez nem is lenne feltétlen baj, hiszen az egyes pontok top és left értékeiből ki tudom silabizálgatni az egyes pontok koordinátáit. De azért megkérdezem, hogy azok nem olvashatók-e ki valahogy a pont adataiból? Mégiscsak egzaktabb lenne, és nem függne a diagram terület méretezésétől.
Az alábbi makró az adott helyen látható egy ponthoz hozzárendeli az általad megadott adatfeliratot. Azt használtam ki, hogy a pontok egymást fedik, tehát a top-left koordinátájuk egyezik. Már csak azt kellett megoldani, hogy az egyszer kirakott felirathoz már ne tegyen újabbat, ezért a ponthely Collection-ban gyűjtöttem a már feliratozott pontokat, amelynek a kulcsa a top-left koordináta volt. Így minden látható ponthelyre került egy és csak is egy adatfelirat. (Az pedig nyilván mindegy, hogy melyik ponthoz került a felirat, hiszen adott helyen egyforma lenne a leírtak szerint.)
Sub pontok() Dim ch As Chart, sr As Series, pt As Point, ponthely As New Collection, ptha As Point Set ch = ActiveSheet.ChartObjects(1).Chart Set sr = ch.SeriesCollection(1) sr.HasDataLabels = False For Each pt In sr.Points If Not pt.HasDataLabel Then On Error Resume Next Set ptha = ponthely(pt.Top & pt.Left) If Err <> 0 Then ponthely.Add pt, Key:=pt.Top & pt.Left pt.HasDataLabel = True pt.DataLabel.Text = Int(pt.Left) ' ebben a sorban kell megadnod a feliratot Err = 0 End If On Error GoTo 0 End If Next End Sub
A relációkat mindenképpen meg kell vizsgálni, viszont az összehasonlítás eredménye maga logikai, tehát lehet változónak értékként adni:
g=not (ZaroHazszam.value=vbNullstring) and (ZaroHazszam.Value<KezdoHazszam.Value or KezdoHazszam.value = vbNullstring or ZarohazSzam.value=0 or KezdoHazszam.value=0)
Ez megvizsgálja, amit megadtál feltételeket és még azt is, hogy ne lehessen 0 értéket adni házszámnak.
Talán így: If (ZaroHazszam.value <> vbNullString and KezdoHazszam.value = vbNullString) or ( Val(ZaroHazszam.value) - Val(KezdoHazszam.value))<=0 then g=True
Sziasztok, egy pontdiagramot készítek programból. Ezen belül xlXYScatter típusút.
Működik is rendesen. A diagram valahogy így néz ki, benne a trendvonallal:
A gondom a következő. Szeretnék saját feliratokat tenni az egyes adatpontokhoz. Viszont az adatpontjaim száma 200 feletti és mivel bonitált adatokról van szó, amelyek mind a vízszintes, mind a függőleges tengelyen csak 1-5 közötti értékeket vehetnek fel, ezért egy-egy látható kék pötty helyén sok tényleges pont is lehet. Emiatt nem tudom elérni őket. Illetve, amikor makrórögzítéssel nézem, hogy mi történik az egyes pontokra ráklikkelve, akkor a következőket kapom:
stb. A számok nekem esetlegesnek tűnnek. Lehet, hogy aszerint változnak, hogy hány tényleges pont került az egyes látható helyekre.
Két kérdésem van:
1. A képen pillanatnyilag feliratként a látható pontnak a függőleges tengelyen elfoglalt helyét állítottam be. Ehelyett szeretnék pontonként egyedi adatfeliratot megadni. Azt hiszem, erre van lehetőség, csak nem tudom, hogy egy kiválasztott pont esetén ezt hogy tudom programból elérni. Azaz mi a szintaxisa az egyedi adatfelirat megadásának. (Mellesleg adatfeliratnak azt a számot szeretném megadni, ahány tényleges adat van azon a helyen. Ezt a programom kiszámolja)
2. Ha lehetséges a pontokhoz egyedi feliratot rendelni, akkor már csak az lenne a feladat, hogy lecseréljem a meglévő adatfeliratot. Viszont azt nem tudom, hogy programból hogy tudnám megtalálni, hogy hányas sorszámú ponthoz tartozik a pillanatnyi felirat.
Ezt most így csinálom, de azt azt hiszem, túlbonyolítom...
ha g true, akkor hibás a házszám megadás
If KezdoHazszam.value = vbNullString Or ZaroHazszam.value = vbNullString Then h = Val(KezdoHazszam.value) - Val(ZaroHazszam.value) Else h = Val(ZaroHazszam.value) - Val(KezdoHazszam.value) End If g = h > 0
A2 képlete: =HELYETTE(A1;A2 &" v ";"") vagy =KÖZÉP(A1;SZÖVEG.KERES(" v ";A1)+3;HOSSZ(A1))
Fontos, hogy az elválasztó az " v " legyen, azaz a v előtt és után is legyen szóköz, mert ellenkező esetben nem működik a képlet (másrészt akkor nem tudsz két olyan értéket szétválasztani, amelyikben van v a szavakban valahol).
Van egy cellám (A1), amiben ez szerepel: "közel v távol"
Az lenne a kérdésem, hogy valahogy megoldható, hogy az A2 cellába a "közel" és A3 cellába a "távol" kerüljön. Tehát a " v " lenne a választó, amire nem is lenne szükségem. Természetesen nem csak a "közel-távol" szó van, de mindig a " v " választja el őket.
Igazából a HOL.VAN függvényt kell "kicselezni" ahhoz, hogy különböző neveket írjon az azonos pontszámok mellé. Ez pedig egy nem túl bonyolult tömbképlettel megvalósítható:
Ez a képlet így azt a nevet irja be hamarabb, amelyik előbb van a listában. Ha a képletben szereplő kivonást összeadásra változtatjuk, akkor pont fordítva, a leghátsótól visszafelé kerülnek a nevek a D oszlopba.
A C oszlopban a képlet a normál NAGY függvény, mivel ott nem számít melyik számot írja be az egyformák közül.
COM (*.dll) addon kellene excellel együtt induláshoz, de nem tudom hogy kell.
Viszont egy trükkel meg lehet kerülni:
Class modulban kell egy saját eseményt létrehozni, ami figyeli ha új munkafüzet nytódik meg.
Private WithEvents App As Application
Private Sub App_NewWorkbook(ByVal Wb As Workbook) If AddIns("*.Xlam").Installed Then With Application.CommandBars("Formatting").Controls.Add .Caption = "Név" .Style = msoButtonCaption .OnAction = "ThisWorkBook.Module3.Makró" End With End If 'MsgBox "New Workbook: " & Wb.Name End Sub
Private Sub Class_Initialize() Set App = Application End Sub
ThisWorkBook-ra:
Private XLApp As CExcelEvents
Private Sub Workbook_Open() Set XLApp = New CExcelEvents End Sub
ThisWorkBook-ra:
Sub Workbook_AddinInstall() With Application.CommandBars("Formatting").Controls.Add .Caption = "Név" 'The button caption .Style = msoButtonCaption .OnAction = "ThisWorkBook.Module3.Makró" End With End Sub
Sub Workbook_AddinUninstall() On Error Resume Next Application.CommandBars("Formatting").Controls("Név").Delete On Error GoTo 0 End Sub
Még kell létezés vizsgálat, mert ha van, akkor is létrehozza.
Nem lehet, hogy feltételes formázás van a cellá(k)ra beállítva és pont érvényes egy feltétel, ami miatt hiába állítod át a háttérszínt, mert a feltételes formázás felülírja?
Van a NAGY függvény, amellyel megadhatod, hogy egy tartomány hányadik legnagyobb elemét listázza. Ezt egy oszlopba beírod az 1-től 10-ig paraméterrel.
Ha mondjuk ezt az F oszlopba írod F1 cella képlete: =NAGY($B$1:$B$100;Sor()) a legmagasabb pont, ezt végighúzod az oszlopon a 10. sorig, akkor megkapod az első 10 helyezett pontszámát.
Az E oszlopba pedig INDEX és HOL.VAN függvény kombinációjával megkapod a nevet hozzá:
Figyelem: Ez akkor működik megfelelően, ha nincsenek azonos pontszámok, azonos pontszámok esetén mindig csak az első nevet fogja megtalálni.
Másik lehetőség:
Feltételes formázás a pontszámot tartalmazó oszlopon - legfelső/legalsó értékek - az első 10 akkor beszínezi a 10 legnagyobb értékű cellát a kívánt színűre az oszlopban. Csinálhatod azt is, hogy az első 1-re, az első 2-re, az első 3-ra stb. állítassz be színezést, bejelölöd, hogy leállítás, ha igaz, majd a sorrendet beállítod, hogy ebben a sorrendben 1-2-3 stb. legyenek érvényesek.
Ebben az esetben mindig látod a színezésből, melyik hanyadik helyen van.
Van ez a kódsor, ami egy addon (xlam)-ben található makróra készít a menüszalagon indító ikont:
Sub Workbook_AddinInstall() With Application.CommandBars("Formatting").Controls.Add .Caption = "Ingatlan Nyilvántartás" 'The button caption .Style = msoButtonCaption .OnAction = "ThisWorkBook.Module3.IngatlanNyilvántartás" 'The Macro name you want to trigger End With End Sub
Private Sub Workbook_AddinUninstall() On Error Resume Next Application.CommandBars("Formatting").Controls("Ingatlan Nyilvántartás").Delete On Error GoTo 0 End Sub
Hogy lehet elérni azt vajon, újabb excel megnyitásával újra és újra megjelenjen?
Vagy makrót írsz rá, vagy megelégszel annyival, hogy a pontok beírása után mindig "emelkedő" sorrendet állítasz be a táblázaton (rendezés A-Z vagy AutoSzűrő).
Sziasztok! Egy bizonyos táblázatba kéne az alábbi dolgot megoldanom:
-A oszlopba nevek
-B oszlopba pontok, egymás mellett a névvel. Pl.
A B
Jakab 150
Géza 90
Feri 29
.
.
Kéne nekem olyan függvény, ami listázná nekem mondjuk az első 10 legnagyobb, legtöbb pontot, és a hozzá tartozó nevet. Módosulni fog napokon át a pontszám, így mindig tudni szeretném az éppen aktuális sorrendet, névvel együtt.
Tudnátok segíteni? Próbáltam már fkeres meg ilyesmi függvénnyel, de ehhez az excel tudásom kevés.
Közös használatú munkafüzetben más is "ga(rá)zdálkodhatott" a képleteket illetően. Az eredeti érték pedig azért maradhatott meg, mert az automatikus újraszámolás ki lett kapcsolva és még nem mentették a munkafüzetet.
Az a macskaköröm pedig aposztróf és azért nincs, mert az csak akkor kell a névhez, ha különleges karakterek vannak benne vagy nem egy szóból áll - ezt az Excel képes automatikusan felismerni (az egy szavas névhez hiába teszed oda az aposztrófot, eltünteti).
Csatlakozom Eredő Vektorhoz, magától nem képes egy képletet másik munkalapra hivatkoztatni az Excel. (Sor/oszlop/cella beszúrás esetén automatikusan módosul a hivatkozás címe, de munkalaphivatkozást csak akkor módosít, ha átírtad a munkalap nevét.)
Kérnék egy kis helpet, ha nem gond. Elfogyott az ötletem egy hibát illetően. A javítás egyszerű volt, meg is oldottam már, de nem tudom, hogy a jelenséget mi okozhatta.
Adott egy közös használatú, viszonylag nagy méretű munkafüzet, benne jópár olyan függvény, amik szomszédos munkalapokról dolgoznak. Az egyik, ilyen függvényeket tartalmazó tömb képletei másztak el, elég érdekesen és nem jövök rá, hogy mi okozhatta.
Ez az alapképlet az eltérés nevü munkalapon:
='részletes adatok'!CN3
Van még belőle három másik oszlopban más cellahivatkozással és ez ismétlődik többszáz sorban. Ezek a képletek csúsztak el, úgy, hogy az összes ilyesmi lett:
=Szerződéstípus!CN3
Amit látok: elmaradt a laphivatkozáshoz tartozó macskaköröm, a szöveg az eggyel jobbra lévő munkalap neve, azonban annak a lapnak a hivatkozott területe üres. Ezzel együtt érdekes módon az eredetei, még jó képletek által behúzott adatsor ottmaradt az eltérés lapon, függetlenül attól, hogy az egész tömbben cserélődött a laphivatkozás a rossz verzióra.
Van valakinek ötlete, hogy mi tehette ezt? A táblát sajna nem oszthatom meg, még adatok nélkül sem.
Igen az, UserInterfacOnly ... Emlékeztem hogy van valami ami a makróban használható a védelem megkerülésére. Akkor ez az.
Viszont a közös használat követelmény sajnos. Többen használják a formot egy időben. A formon lévő controlok beleírnak a közös használatú munkafüzetbe. (Kettőbe is).
Tudtam, hogy gond lesz ezzel a közös használattal. Csak a program ír bele, de most úgy van beállítva - hogy amíg a form nyitva, addig a fájl is nyitva.
Esetleg megpróbálhatom a közös használat helyett a nyitottság idejét csökkenteni, ez lehetséges - de így is előfordulhat hogy vkinek visszabeszél, hogy már nyitva van az adott file.
Szerintem a védelem nem a felfedésre vonatkozik...
Viszont az elrejtett ablak nem látszik a nézet - ablakváltás menüben, tehát csak olyan valaki tudja felfedni, aki legalább olyan képzett, mint te.
Egyébként a makrókkal a védelmet - legyen az munkalap vagy munkafüzet védelem - bármikor le tudod venni egy vagy több művelet erejéig, majd utána visszazárni - viszont ez közös használatú munkafüzet esetén nem igaz sajna.
A munkafüzet védelem viszont szerintem lehetővé teszi, hogy munkalapba lehessen írni, csak a munkalapok sorrendjén nem lehet változtatni ha a struktúrát bejelölöd (egyébként igen).
A védett munkalapra makróval írhatsz adatokat, ha a védelmet a UserInterfacOnly kapcsoló True értékével kapcsolod be - ez viszont csak addig érvényes, amíg egy fájlt be nem zársz, ha újranyitod, akkor ismét be kell kapcsolni ezt a kapcsolót is sajnos, ezért közös használatú munkafüzetben ez sem megy :(
Miért kell közös használatú munkafüzet, ha csak a Te beviteli formjaidon keresztül érhetik el? Nem lenne elég, ha csak a Te programod tudná megnyitni, amikor szükséges. (Igen, tudom, a megnyitás időigényes, viszont, ha csak Te férsz hozzá a programjaiddal, akkor nem kell felesleges védelmeket beleiktatni és lehet közös használatú is - a Te programjaid számára.)
Az előző felvetések nyilván abból adódnak, hogy nem ismerem az általad megoldandó feladatot, így csak "hangosan" gondolkodom. Ha több segítségre lenne szükséged, térjünk át privire szerintem.
A megrendelés számokat kigyűjtöd egy oszlopba (pl. átmásolod a megrendelés számot egy új oszlopba, majd Adatok - ismétlődések eltávolítása). Adatok A-C oszlop, Kigyűjtés:F oszlop, képlet G oszlop
Ezután a mellette levő cellába a képlet: =SzumhaTöbb( C:C;A:A; F2;B:B;"T")-Szumhatöbb(C:C;A:A;F2;B:B;"K")
vagy Szum(A:A;F2;C:C)-Szumhatöbb(C:C;A:A;F2;B:B;"K")
Ezt lehúzod az oszlopon, majd a D oszlopba FKeres függvénnyel megkeresed az értéket: =Fkeres(A2;F:G;2;0)
MsgBox "Workbook " & munkafuzetnev & " nincs nyitva"
End If
End Sub
Function munkafuzetnyitva(munkafuzetnev As String) As Boolean
munkafuzetnyitva = False
On Error Resume Next
Workbooks(munkafuzetnev).Activate ' Ha nincs nyitva, akkor hibát kapunk: err.code 9 (Subscript out of range)
If Err.Number = 0 Then munkafuzetnyitva = True
On Error GoTo 0
End Function
Ezt néhány éve írtam, aztán később még azzal is finomítottam, hogy ha a munkafüzet nyitva van, akkor megvizsgálom a saved tulajdonságát. Ha ez True, azaz a fájl nyitva van, de nem módosult, akkor a biztonság kedvéért egyszerűen lezárom, és újra megnyitom, ha viszont módosult, akkor figyelmeztetem a felhasználót, hogy mentse, vagy zárja le mentés nélkül (Én legalábbis a lezárás felelősségét nem vállalnám a felhasználó helyett), és kilépek a programból.
1.Ha a programod nyitotta meg, akkor megnézed, hogy a Workbooks gyűjteményed mely fájlokat tartalmazza. Ha nyitva van, akkor benne lesz a gyűjteménybe - neve alapján azonosíthatod.
2.Hivatkozol a "bezárt fájl" egy adatára, pl. egy változónak onnan próbálsz értéket adni, ha nem lesz hiba, akkor nyitva van még.
3. Ha nem a programod nyitotta meg akkor próbáld megnyitni kizárólagos használatra, ha nem megy (a readonly tulajdonsága true), akkor nyitva van még máshol - viszont sanszos, hogy nem fogsz tudni bele írni.
Mi a módja annak, ha szeretném elkerülni, hogy egy háttérben megnyitott excelből biztosan csak egy legyen nyitva.
Nyitás után be is zárom, de sajnos előfordul, hogy ott marad. ( Pl. egy hiba miatt nem jut el a prg a bezárásig) Tehát ha pl egy már nyitva van, akkor ne nyisson rá még egyet ugyanabból.
Előre is köszönöm. Képen túl nagy lenne, ezért privátban küldtem két minta diagramot a hozzá tartozó adatokkal. Hátha abból meg lehet állapítani valamit.
Elvileg jó, amit csinálsz, lehet, hogy az adatokban van a bibi.
Mutatnád legalább képen, hogy mit művel? Mi az X értékek mértékegysége és milyen nagy a köz, amit kihagysz? Mert a trendszámításnál a közökhöz tartozó tételeket is kalkulálja ám a rendszer interpolációval.
Sziasztok, nem boldogulok egy kétdimenziós lineáris összefüggést ábrázoló diagram programból történő megrajzolásával. Pontosabban szépen elkészül, ha nincs benne olyan adatpár, amit valamiért ki kell hagyni belőle. Mondjuk mert az egyik adatpár hiányos. Régen tökéletesen működött a következő technikák alkalmazásával:
ActiveSheet.Shapes.AddChart.Select
ActiveChart.ChartType = xlXYScatter ' pont diagram
With ActiveChart.SeriesCollection.NewSeries ' itt adom meg a tartományt a 113. (R113) sor adatait kihagyva
(ahol ws a „munkalap”-nak megfelelő worksheet) Ebben a sorban már azt hiszem, nem kell érvényesíteni a kihagyást, csak nem értem, miért kell újból megadni a korábbitól eltérő szintaxissal.
És a trendvonal megrajzolásakor, az egyenlet és az R2 beírásakor vagy nem veszi figyelembe a kihagyást, vagy valami egész más hiba történik, de a megrajzolt trendvonalnak, és az egyenletnek, illetve az R2 értéknek semmi köze a valóságoshoz. (Az egyenletet és az R2-et egyébként az adatok páronkénti feldolgozásával kiszámítom, és az így kapott eredmény sokszorosan kipróbált, megbízható)
El nem tudom képzelni, hogy miért működött a fenti technika néhány évvel ezelőtt, és miért nem működik most. És sajnos a diagramkészítést generálisan nem látom át. Kénytelen vagyok makrórögzítéssel kiokoskodni a készítés menetét. De az adatkihagyás érvényesítésének módjára még nem igazán jöttem rá. AZ is jó lenne, ha valaki ajánlana megfelelő szakirodalmat a témához.
Tudnátok abban segíteni, hogy miért történik az, hogy egy beállított egyéni cella formázás pp (perc perc)-ről a fájl megnyitása után hh (óra óra)-ra formázásra vált át? Excel 2013, magyar nyelvű. Ha pl. éééé formátumot állítok be, akkor a bezárás és az újbóli megnyitás után megmarad a beállított éééé formátum, csak a fenti esetben vált át a perc formátum órára (és nem óó, hanem hh szerepel ilyenkor a cellaformázás beállításnál) Köszi bármilyen ötletet!
Excelben a munkalapon vannak ábrák meg szövegek. Amik nem férnek ki egy A4-es oldalra. Hogyan tudom kicsinyíteni az egészet (tehát az ábrák ugyanolyan arányban kisebbedjenek, mint a szöveg) az összes minden egyenkénti átméretezése nélkül, hogy kiférjen egy A4-es oldalra?
Próbáltam olyan beállítást, hogy a nyomtatáskor a lapmérethez kicsinyítsen, de nem találtam ilyen opciót sajnos.
Az lehet a hiba, hogy az alsó sort 1000-től felfelé keresed, de pár lap adatainak a bemásolása után az Events lapon már meghaladják a bemásolt sorok ezt a határt.
Sub teszt() Dim lastRow As Long, i As Long Worksheets.Add.Name = "Events"
For i = 2 To Sheets.Count If Sheets(i).Name <> "Events" Then lastRow = Sheets("Events").Range("B" & Rows.Count).End(xlUp).Row + 1 Sheets(i).Range("A52").CurrentRegion.Copy Sheets("Events").Range("B" & lastRow) End If Next i End Sub
Azért lehetnél kicsit bőbeszédűbb annál, hogy nem működik. Mondjuk elmondhatnád, hogy mi a hiba. Hogy a program hibaüzenettel áll le, vagy lefut, csak éppen rossz helyre teszi az adatokat, vagy kihagy egyeseket stb.
Egyébként javasolnám, hogy csinálj egy tesztfájlt. mindössze 2-3 munkalappal, rajtuk csak mondjuk 3-3 sorral, nem az 52-262, hanem a 10-12 sorokban lévő adatokkal. Aztán azon futtasd le, mert az esetleges hibát könnyebb megtalálni, ha tesztüzemben - akár soronként futtatva, és ellenőrizve - futtatod, mintsem több tucat munkalapon egyenként több száz sorral.
Tekintve, hogy az Events munkalap B oszlopától kezdődően másolsz, a lastrow meghatározásánál is a B oszlopot kellene nézned, mert az üres A oszlopban mindig a 2. sortól másolsz.
Tehát
lastrow = Sheets("Events").Range("B10000").End(xlUp).Row + 1, vagy még szabályosabban:
Mellesleg a biztonság kedvéért betennék még egy feltételt a ciklusba, mégpedig, hogy
If Sheets(i).Name <> "Events" Then
sheets(i)...copy
endif
Ugyanis az Events munkalapod 52. sorában a B-D oszlop hamar feltöltődik, és el kellene kerülnöd, hogy saját magának megfelelő sorok adatait is bemásolja újra.
Van tippetek?...tehát össze kéne gyűjtenie mint a 100 munkalapról az adatokat egymás alá az adatokat, amik mindig A52-nél kezdődnek, csak nem tudni sose hány sor...ez mindig változik.
A formból közben készült egy bővítmény, van hozzá egy munkalap is az xlam-ben, viszont nem tudom szerkeszteni az xlam munkalapját közvetlenül - csak ha xlsm-ben megnyitom és újra mentem xlam-ben.
Hogy tudom csak a formot megnyitni a bővítményből, tehát a munkalapot ne lehessen látni.
Miért kell 2 munkafüzet amibe a form alapján írnak? Az szerintem teljesen rendben van, ha a formot tartalmazó munkafüzetet többen is megnyitják - csak olvasásra. A begyűjtött adatokat pedig a háttérben levő akár közös használatú munkafüzetbe lehet írni. Jelszavakat stb. lehet külön text fájlban is tárolni.
Most a form activate eseményben állítok a rajta lévő lévő controlokon és én bővítményben gondolkodtam. A sablon nem tudom mi, rákeresek. (Diagramot mentettem sabloként, ilyen formot még nem)
Több felhasználó nyitja meg olvasásra, írásra jelszó van. 1-1 munkafüzet nyit háttérben, amibe / ből az userform ír / olvas.
Tehát a két megnyitott munkafüzetnek többfelhasználósnak kell / kéne lennie. Ezt még nem próbáltam ki, hogy viselkedik. Tehát választanom kell, hogy közössé teszem a két munkafüzetet - vagy minden munkafüzetbe íráskor megnyitom / bezárom, mentem (most ez van) a munkafüzetet - de ez lassú... Ha addig tartom nyitva amíg a form is "él", akkor a form életéig fogva van a két munkafüzet, másnál nyitott form nem tud írni bele.
Az a kérdés, mit értesz beélesítésen... és mire szeretnéd használni, hány munkafüzetben szeretnéd elérni?
Ha egy adott munkafüzetben van, akkor a userform.show metódussal tudod megjeleníteni, userform.hide metódussal elrejteni és Unload userform utasítással kivenni a memóriából. A Userformnak van Initialize eseménye, amelyben be lehet állítani a kezdő értékeket, Activate eseménye ahol szintén lehet állítani az értékeken.
Ha a munkafüzet megnyitásakor szeretnéd azonnal megjeleníteni, akkor a Workbook_Open eseményben kell meghívnod a Userform megjelenítő eljárást - azért ezt javaslom és nem azt, hogy oda tedd be a megjelenítő sorokat, mert így a program más helyeiről is meg lehet hívni majd, ha szükséges.
Ha a felhasználó "akarata" dönti el, hogy meghívja a formot (pl. több feladat között lehet választani és a választástól függ, melyik form jelenik meg - vagy milyen adatok jelennek meg a formon), akkor menüpontot vagy gombot alkothatsz a hívásra, megfelelő címmel.
Ha több munkafüzetben is szeretnéd használni, akkor csinálhatsz belőle bővítményt (legalábbis így gondolom) vagy sablonként elmentheted.
A plusz-mínuszon nem kívánok vitatkozni, azt Te tudod, hogyan vannak elszámolva a napok (nyilván egy nap vagy "s" vagy "r"), de a képletedből most lemaradt a záró zárójel :), illetve a nyitó sem kell.
(Szerintem A-(B+C) = A-B-C, csak nem bírtam ki, hogy leírjam (: )
Megakadtam és nem tudom hogyan tovább a 2010-es excellben.
Készült egy munkaidő nyilvántartó táblázat, amiben vezetem a kollégák munkaóráit, szabikat stb.
Nem csak számokat, de betűket is használok. S=szabadság 12 órával, R=rekreációs szabi 8 órával stb.
A hó végi összegzésnél darabteli fügvényt használok, de abban csak egy kritériumot lehet megadni.
pl.
=A12-darabteli(D12:AH12;"s")*12
Ebben az esetben az A12-es cellából(az előző havi záró óra) kivonja a D12:AH12 tartományból azokat a cellákat amiben "S" szerpel term. felszorozva 12-vel.
Na most. :)
Nekem más kritérium is szükséges lenne. Ha "R" betűt írok akkor azt a 12 helyett 8-al szorozza.
Erre lenne gonolom a DARABHATÖBB fügvény, de nem igazán sikeredik zöldágra vergődni vele.
A Public nem egyenlő a Global-lal. Szerintem Userform General szekciójában Public-ként deklarálva kell, hogy lássa mindenki más a Userform nevére hivatkozva, pl. Userform1.változó=valami beállítja a formon levő változó értékét. Viszont ez csak addig él, amíg a form a memóriába van (tehát a Hide -dal elrejtéskor megmarad az értéke, Unload esetén elvész, hiszen az objektum sem marad benn a memóriában).
Ha csak simán deklarálod a General szekcióban a változót, akkor csak az adott form eljárásai látják.
Amennyiben egy általános modulban deklarálod a változót, akkor az "élete" nem függ a form memóriában levőségétől.
Standard kódlapon Public-ként deklarált változó megőrzi az értékét eljárások között/fölött is. Akkor törlődik, ha End (tehát nem End If, End Select, stb, hanem sima End) utasítást talál, vagy ha hibaüzenetnél, törésponthoz érve, stb. a Stop gombbal leállítod a makró futtatását.
Ha kvázi "mindent túlélő" változóra van szükséged, érdemes a CustomDocumentProperties környékén körülnézni.
Az Excel alap/mintadiagramoknak van alapbeállításuk, amit mindig felhoznak, ha a mintát használod.
Viszont csinálhatsz saját beállításokkal saját mintát és utána használhatod azt kiindulásnak. Makróban nem néztem még meg, hogy a saját mintára hogyan lehet hivatkozni.
A beállításokat makróból szerintem egy rutinnal meg lehet oldani, hogy mindig a "kedvenced" szerint jelenjen meg.
Köszönöm. Jól sejtetted, a DataLabels.Numberformat hozta a jó megoldás, mégpedig a "0%" képlettel, mert egészekre akartam kerekíteni.
A következő két óra azzal telt, hogy az ActiveChart.SetSourceData sor megfelelő beállítását megtaláljam. mert ugyebár programban nem írhatom be fixen a Range értékét, és szokás szerint elkeveredtem a bonyolult string kifejezésben.
Egyet szeretnék még kérdezni. Az a sejtésem, néhány kellemetlen tapasztalat eredményeképpen, hogy az Excel a diagramok beállításainál bizonyos beállításokat megjegyez. Még talán kikapcsolás után is(?). Mert időnként furcsa jelenségekkel találom szemben magam. Ilyen például a "Straight Connector", ami majdnem mindig megjelenik a diagramon, így azt ki kell törölnöm. De van egy halvány emlékem, hogy a vezetővonalak beállítása is időnként váratlanul megjelent. Nincs ezeknek valami alapbeállítása, hogy biztosíthassam az azonos viselkedését más környezetben is? Bár egyelőre csak én fogom használni, de azért nem szeretem az ilyen meglepetéseket.
A Public vagy Global deklaráció a modul elején szerintem jónak kell lennie. Viszont elképzelhető, hogy rosszul hivatkozol rá, ha nem az adott modulban van, akkor a modulnév.változónév a helyes hivatkozás, a sima változónév nullát ad, mert automatikusan mindig az éppen aktuális eljárást/modult nézi az értelmező. A Static szerintem csak az adott eljárásra érvényes.
Szerintem ott valami beállítási rendellenesség lakozik. Próbáld meg, hogy kijelölöd az adatfeliratokat és a formázás - számformázásnál beállítod a százalékot.
Ha így rendben van, akkor DataLabels.Numberformat="0,00%"
Egyébként még az a gyanúm, hogy az adataid számformátuma zavarhat be. Próbáld meg, hogy a felirat beállításnál kiveszed a forráshoz csatolva jelölést.
Az általad javasolt .ApplyLayout (1) esetén pedig ez:
A százalékos értékek helyén így is, úgy is nullák jönnek.
A méretezést kösz, de néhány hete ennél találtam egy kényelmesebbet, ahol nem kell a képpontokat számolgatnom. A 29223-as kérdés kapcsán sikerült megoldani a képnek egy konkrét cellához való igazítását. Aztán kipróbáltam, és kiderült, hogy ugyanez diagramra is vonatkozik. ezért kényelmi okokból valami ilyesmit használok a pozicionálásra. Nem tökéletes, de nagyon közel van ahhoz, amit szeretnék.
ahol felsősor és a balszeloszl annak a sornak és oszlopnak a száma amelyiknek a sarkánál kezdődik a diagram, xx = ahány oszlop szélességűnek és yy = ahány sor magasnak szeretném látni a diagramot
terulet = "$A$9:$B$14": bal = bal + 210: fent = fent + 30 Diagram terulet, bal, fent
terulet = "$A$18:$B$23": bal = bal + 210: fent = fent + 30 Diagram terulet, bal, fent End Sub
Sub Diagram(terulet, bal, fent) Range(terulet).Select ActiveSheet.Shapes.AddChart.Select With ActiveChart .SetSourceData Source:=Range(terulet) .ChartType = xlPie .ApplyLayout (1) End With Selection.Left = bal Selection.Top = fent Selection.Height = 200 Selection.Width = 200 End Sub
És, hogy még teljesebb legyen a bosszúságom, megpróbálkoztam azzal, hogy kihagytam a létszám adatot, csak a százalékot tüntettem fel, hogy két egymás melletti oszlopom legyen. Hát erre ezt művelte:
Segítsetek! Egy diagramot szeretnék készíteni. Programból kellene, mert elég sokat szeretnék létrehozni.
Egy egyszerű 3 oszlopos táblázatom van: Az életkorok, mellette, hogy egy adott csoportban hányan voltak, és mellette a százalék érték. A tortadiagramon a százalékos adatokat szeretném feltüntetni.
Makrórögzítéssel kiválasztom az életkor és a százalék oszlopot. A rögzítő a következőt hozza létre:
Igazad van, valóban nem zavarja az üres cella a keresést. Kipróbáltam Excel 2010 alatt. Az első néhány sorba írtam számokat, a köztük egyet üresen hagytam. Mégis megtalálta a mögötte lévő sorba írt adatot mindegyik verzió. Aztán írtam egy stringet az A111111-be, és azt is simán megtalálta mindegyik módon. Az utolsónál persze nem column(1), hanem columns(1) kellett
Ráadásul a Talsor változót szándékosan stringnek deklaráltam, mégis elfogadta a program. Aztán Long-nak, és azzal is működött. Tehát Eredő Vektor programjában valahol máshol kell keresni a hibát.
Szerintem egy oszlop az összefüggő tartomány, akármekkora is legyen, nem számít, hogy közben van-e üres cella. A követelmény, hogy ne legyen több oszlop, csak egy ill. ne megszakítással - több terület azonos oszlopban - jelöljük ki.
Elképzelhető, hogy a problémát a sorok számának nagysága okozza - mint Eredő Vektor kísérletei mutatják - bár nálam ez nem következett be (igaz én 2016-os Excelt használok), lehet, hogy a 2010-es Excelben még él a korábbi verziók sorszáma miatti korlát és ezt csak később javították.
stringet keresek, egyértelműen benne van. Ha teljes oszlopra állítom a keresési tartományát, akkor kiakad, ha behatárolom mondjuk a1:a10000-re, akkor talál.
érdekes, ha a1:a100000-re állítom, ismét kiakad.
Háttérben megnyitott munkafüzetben keresem - úgy tűnik mintha ilyen esetben nem látna el a match, csak bizonyos sorszámig. 2010 excel mindegyik munkafüzet, tehát nem 65536 soros
Az ilyen kereséseknél a dátum értékekkel probléma lehet, nálam olyan fordult elő, hogy két azonos dátumot nem talált meg a Match függvény (holott az Excel képlet igen!!!), viszont amikor átalakítottam számmá, akkor megtalálta - szerintem ez már mindennek a teteje...
Szerintem az lehet a probléma, hogy a keresett érték nincs az adott tartományban, mivel ebben az esetben a Worksheetfunction.Match ezzel a hibával áll le, így mindenképpen szükséges a hibakezelés programból.
Ezért helyette inkább az Application.Match használatát javaslom, azzal a Delila által írt kiegészítéssel, hogy az eredményt tartalmazó változó legyen variant. Ilyenkor az eredmény maga lesz hiba (ami a variant típusu változóba minden gond nélkül be tud kerülni), így csak azt kell megnézni a keresés után, hogy az eredmény hiba-e vagy sem. Az Error 2042 a nem talált ilyen értéket hibát jelenti (N/A).
Tehát vagy hibakezelést írsz bele a makróba, vagy lehetővé teszed, hogy az eredményváltozód hiba értéket is felvehessen.
1. Miért kell az a tömbváltozódat range-nek definiálni, lehetne sima tömb és csak a tartomány értékét átadni neki, akkor nem kell a formula tulajdonságot használni.
2. Miért kell egyáltalán közbeiktatni egy tömbváltozót, a Range-ből is fel tudod tölteni a RowSource tulajdonsággal, csak a memóriahasználatot növeled vele szerintem.
Private Sub ComboList() Dim a(1 To 6) As Range Dim sorvege As Long i = 1 For i = i To UBound(a) sorvege = Sheets("control").Cells(60000, i).End(xlUp).row Set a(i) = Sheets("control").Range(Cells(i), Cells(sorvege, i)) Debug.Print sorvege Debug.Print Sheets("control").Range(Cells(i), Cells(sorvege, i)).Address Next cb12.List = a(4).Formula cb13.List = a(4).Formula cb14.List = a(4).Formula cb15.List = a(4).Formula cb16.List = a(6).Formula cb17.List = a(6).Formula cb18.List = a(6).Formula cb6.List = a(2).Formula cb10.List = a(3).Formula cb4.List = a(1).Formula cb27.List = Sheets("control").Range("E1:E2").Formula End Sub
A legutolsónál azért van próbálgatásból átírtam, mert abban a tömb változóban egy darab tétel volt - amit a .list nem szeretett.
Szerintem nem értünk egyformán valamit. A további hozzászólásodból az derül ki, hogy tartományt - aminek változik a tartalma és hossza - szeretnél használni a ComboBox lista forrásaként. Ez nem tömb, legalábbis én úgy gondolom, hogy a tömb az VBA változó, vagy egy Excel tömbképlet tömb eredménye. Amit szerintem azért fontos megkülönböztetni, mert másképp lehet/kell vele bánni.
Ha tartományból veszed a listát, akkor a RowSource tulajdonság a legegyszerűbb, amivel hozzárendelheted a Combohoz.
Ha tömb/változó a forrás, akkor a List tulajdonság az, ami egyszerűen használható.
sor megadja a lenyíló sorok számát, ami az aktuális adataid darabszáma. Persze ha sok adatod van, nem érdemes ezt megadni, vacakul nézne ki 100 lenyíló sor. :D
Egy érdekes hibával szembesültem: egy file munkalapjai jelszóval védettek. Megváltoztattam a jelszót, elmentettem stb. A változtatás után a védelem a régi és az új jelszóval is feloldható.
Rugalmasan is kezelheted. Táblázattá alakítod az E oszlopban lévő listádat, majd a címsort kihagyva kijelölöd az adataidat, és nevet adsz a kijelölt tartománynak.
UserForm1.ComboBox1.RowSource = "MegadottNév"
Mindig az aktuálisan feltöltött adatokat mutatja majd a ComboBoxod.
Mivel Userformról és azon levő Textboxról van szó, a KeyPress/KeyDown/KeyUp eseményekben megnézheted és ellenőrizheted, hogy milyen karaktert vitt be a felhasználó, a mintának megfelelően automatikusan beviheted az elválasztójeleket, ha elérte a megfelelő hosszúságot a bevitel és átteheted egy szám típusú változóba az eredményt. Instruálhatod a felhasználót, ha nem jól csinált valamit.
Igaz, ehhez az ellenőrzési funkciókat meg kell írni - de lehet, hamarabb megvan, mint a Regex kísérletezés és talán komplettebb is...
először is nem sikerül beállítanom a megfelelőre a numberformatot, másodszor megenged a szükségesnél több számot is bevinni. Egyéb karaktert is megenged bevinni, de ez orvoslható ha pl long ra deklarálom az adattípusát és így egy adattípus hibát lehet kezelni.
Szerintem a Regex után is szöveg lesz belőle (vagyis már nem szám :( akkor sem.)
A formatnál is ki lehet zárni a betűket, a numberformat is nagyjából ugyanazt a szabályt követi, mint a format, viszont a Numberformat esetén a cellában számként lehet kezelni ami benne van.
Sub regex() Dim objRegExp As Object Set objRegExp = CreateObject("vbscript.regexp") objRegExp.Pattern = "'([0-9]{4})[^0-9]*([0-9]+)[^0-9]*([0-9]+)[^0-9]*', '1-2-3', $datum" objRegExp.IgnoreCase = True objRegExp.MultiLine = False
If objRegExp.test(Sheets("munka1").Cells(1, 1).value) Then Set matches = objRegExp.Execute(Sheets("munka1").Cells(1, 1).value) Sheets("munka1").Cells(2, 1).value = matches(0).value End If
A közterületnevek felsorolásába beletettem az általam ismert rövidítéseket,és az általad is bemutatott hibalehetőséget (utca,) és a program ezeket kijavítja.
Hát igen :S, itt nincs ennyi tétel, de minden nap le kell futtatni ezt, illetve ez egy komplex "makrócsomag" közepén van, és ezért kell kettészedni a makrókat, mert itt bele kell avatkozni kézzel :S
Én ezt így csináltam annó, és ott akadtam el, ahol te.
A "szövegből oszlopok" dolog "segített", gyakorlatilag végigkapáltam, és amikor már csak a közterület neve maradt, akkor azt meg összefűztem. Hát, 11000 tétel volt, ráment egy napom (nem akartam makrót írni rá, mert csak egyszer kellett csinálni).
Gondoltam korábban erre, azonban a probléma a következő:
Azért gondoltam arra, hogy a meglévő teljes közterület jelleges adatbázisból indulok neki, és ha ennek segítségével kiszedem az utca,út,tér stb. akkor ami onnan jobbra van, az mehet házszámnak, így ez ok lenne.
Ez azért is lenne fontos mert a házszám az én esetemben nem mindig szóköz nélküli.
pl.
21/ B
12. 3em 3
Amúgy az eredeti "cím"sorból így bontom lefele:
6725 Szeged, Városgazda sor 1
az irányítószámot: =BAL( ide 5db karakter, mert ahonnan a cím jön adatbázis, van 1db space meg úgy 4db irányítószám karakter... - 6725
a települést: =KÖZÉP(Szöveg.keres( itt megkerestem a vesszőt, mert ahonnan a cím jön, ott minden város végén van egy vessző, és innen az irányítószámig tart a város - Szeged
a közterület nevét:=JOBB(HOSSZ(Szövegkeres( megszámoltattam, mennyi karakter, majd jobbról a vesszőig, és kivontam az előzőt belőle, így megmaradt a maradék cím - Városgazda sor 1
röviden így.
Tovább meg azért nem tudom bontani, mert nincs olyan fix dolog (vessző, vagy szóköz egyéb) amihez tudnék valamit kapcsolni :(
Több lépcsőben oldanám meg, ha nem akarsz makrózni.
Felvennék néhány segédoszlopot.
1.: Megszámoltatnám, hány szóköz van a címben összesen.
2.: az utolsó (n-1.) szóköztől jobbra lévő részt eltárolnám, mint házszám.
3.: az eredeti címből a házszámot és az utolsó szóközt levágnám (az utolsó szóközt azért veszem le, hogy ne legyen üres space az közterjelleg végén(.
4.: a házszámos játékot eljátszom a maradékkal: a most utolsó (n-1.) szóköztől lévő részt külön veszem közterjellegnek.
A maradék az utca neve (ami lehet akár sokszóközös is).
(Azon gondolkozom, tudsz-e képlettel egy adott karakter utolsó előfordulására keresni. Az elsőre a szöveg.keres-sel lehet, utolsóra passz... - talán a többiek tudják.)
Ha ez megvan, akkor amit közterjellegnek talált ez a cucc, azt az FKERES-sel megvizsgálnám, hogy az "aknától a zsilipig" közterjellegek között szerepel-e. Ha szerepel, térjen vissza mondjuk egy sorszámmal, ha nem, adjon hibaüzenetet.
Én valahogy így próbálkoznék. Persze ha minden OK, akkor a végén a segédtáblázatokat lehet törölni (persze előtte az értékes adatokat "beilleszt - csak szöveg" módszerrel biztonságba tenni). :)
Abban szeretnék segítséget kérni, hogy valaki VB-ben tudna mutatni egy ciklust ami a vkerest végig viszi a soron, hogy ne álljon le az első találatnál?
"Szeretném egyetlen munkalapon megjeleníteni az összes munkalapon lévő oszlopot."
Szeretnéd egymás alatt látni a munkalapokon levő adatokat minden változtatás nélkül? Mert akkor a Másolás-Beillesztés-nél egyszerűbb megoldás bizony nincs - még akkor sem, ha sok munkalapod van. Makróhoz tudni kell, hogy van-e fejléc a munkalapokon.
Ha az első sor fejléc és az adatok folyamatosak, akkor az alábbi makró összemásolja fejléc nélkül az adatokat az általad megnevezett lapra:
Sub osszemasol() Dim folap As Worksheet, sh As Worksheet Set folap = Sheets("Elso")' az Elso helyett írd be annak a munkalapnak a nevét, ahová szeretnéd összemásoltatni az adatokat For Each sh In Sheets If sh.Name <> folap.Name Then sh.Range("A1").CurrentRegion.Offset(1, 0).Copy Destination:=folap.Range("A" & folap.Cells(Rows.Count, 1).End(xlUp).Row + 1) Next End Sub
Ha egy teljesen új,üres munkalapra szeretnéd a másolást, akkor először hozd létre a munkalapot, tedd rá a fejlécet és utána indítsd el a makrót.
Indítása - Nézet - makrók - név kiválasztás indítás.
Az összesítés a kijelölt tartományokat az általad kiválasztott függvénnyel összesíti vagy db-számot számol stb. Tudsz fejlécet ill. oldalrovatot adni (alapeseteben az első sor ill. az első oszlop), ami szerint az adott művelet megtörténik. Ez tehát már az adatok feldolgozását jelenti.
Tehát több munkalapom van a munkafüzetben. Mind azonos oszlopot tartalmaz. Szeretném egyetlen munkalapon megjeleníteni az összes munkalapon lévő oszlopot. Amikor az összesítés menüpontot előhívom, úgy látom, itt másfajta összesítésről van szó. Melyik függvény kell? Az összeg? És a lapszámokat, mint hivatkozást kell betennem? Hogyan?
Ha publikus lenne az email címed, már eleve oda írnék. Így csak azt tudom felajánlani, hogy küldj egy emailt (az enyém nyilvános), vázold benne a konkrét feladatot, és megpróbálok segíteni. Korreláció, regresszió, variancia analízis és ezek statisztikai próbái témájában van némi jártasságom.
Egy munkafüzeten belül több munkalapot szeretnék egyetlen munkalapra "gyűjteni". A kimásolom - beillesztem módszernél egyszerűbb megoldást szeretnék kérni tőletek. Előre is köszönöm.
Van két hipotézisém, amivel nem tudok mit kezdeni, és nem tudom melyiknél kellene korrelációt és két mintás próbát elvégeznem, szignifikancia vizsgálat mellett. Ha valaki értene ezekhez privátba fel tudná velem venni a kapcsolatot?
Épp egy makrót írok és szeretném szűrőfeltételbe beírni a következő karaktert "æ" de sehogy sem veszi be. Ha másolom excel munkalapról a makrómba, akkor csak egy "a" betűt ír be. Próbáltam minden fajta ASCII-os kódot,de azzal se sikerül.
Tudnátok segíteni, hogy tudnám beépíteni valahogy a szűrőfeltételembe ezt a karaktert?
Az alábbi makrót írd be lsz. az adott munkalap kódlapjára (lapfülön jobb egérgomb - kód megjelenítése).
Mivel az idő formátum miatt lehetnek eleinte bajaid a beírással, ezért a makró ellenőrzi, hogy dátum/időként elfogadható-e amit beírtál - azaz szám-e, mert mint írtam, az Excel számként tárolja a dátum-idő értékeket is.
Ha egy cellában a művelet után negatív idő jönne ki, azt a cellát nem változtatja meg a program és azt ki is jelzi, de a többit igen.
Sajnos minden hibát nem lehet kiszűrni előre, ezért benne van egy hibakezelő rész is - elképzelhető, hogy hiba után kicsit "összekuszálódik" az eredeti adatsorod, mivel a műveletek egy része nem hajtható végre, ezért mindig legyen egy másolatod arról a munkalapról, amivel dolgozol.
Private Sub Worksheet_Change(ByVal Target As Range) Dim uj As Date If Target.Column <> 1 Then Exit Sub 'ha nem az A oszlop változott, akkor kilép If Target.Row <> 2 Then Exit Sub ' ha nem a 2 sorban (A2 cellában) van az adat, akkor kilép => ha az A1 cellában van, akkor ide 1 kerüljön a 2 helyére. On Error GoTo kilep With Application .EnableEvents = False .ScreenUpdating = False End With If TypeName(Target.Value) = "Double" Then uj = Target.Value Application.Undo For Each cl In Range(Target.Offset(1, 0), Cells(Rows.Count, Target.Column).End(xlUp)).Cells If Not (IsEmpty(cl)) Then If cl.Value + (uj - Target.Value) < 0 Then MsgBox "Az " & cl.Address(rowabsolute:=False, columnabsolute:=False) & " cellában negatív idő lenne!", vbCritical, "Időellenőrzés" Else cl.Value = cl.Value + (uj - Target.Value) End If End If Next Target.Value = uj Else MsgBox "Nem időértéket írtál be, a művelet nem hajtható végre!", vbCritical, "Időellenőrzés" Application.Undo End If vege: With Application .EnableEvents = True .ScreenUpdating = True End With Exit Sub kilep: MsgBox "Hiba keletkezett az " & cl.Address(rowabsolute:=False, columnabsolute:=False) & " cellánál, mivel a cella értéke: " & cl.Value, vbCritical, "Időellenőrzés" GoTo vege End Sub
2. Amikor változtatok valamit az időn, akár a másodpercen, akár a percen, annak az értéknek megfelelően növekedjen vagy csökkenjen az első oszlop következő kitöltött soraiban lévő idő is (pl. ha a 01 05-öt átírom 02 05-re, a következő idő értéke változzon 05 59-ről 06 59-re, és így tovább az összes további kitöltött sorban). Minden második sor kitöltött, ha ez számít. Erre kérlek szépen küld valamilyen képletet, makrót, ami segíthet.
Sziasztok felmerult egy probléma és ha lehetséges egy Excel táblában látom a megoldást Próbálok érthetően fogalmazni, ha valami nem tiszta nézzétek el nekem és bátran kérdezzetek... Xd Adott egy intézmény több telephellyel ezen telephelyek közt kellene elosztani arányosan az üzemanyag költséget Arra gondoltam hogy megnezem a telephelyek távolságát a központtól majd az adott napon látogatott telephelyek közt arányosan elosztom a napra jutó költségeket Pl:A telephely 10km re van B 20km C 30km ezek összes távolsága 60 km ellenben én aznap 40 kilométert mentem csak mert sorban látogattam meg a telephelyeket Ezt a 40 kilométert kellene arányosan elosztani a 3 hely között. Gondolom valahogy úgy hogy az A a 40 km 10/60 ad, a B a 20/60ad és a C a 30/60ad része Ez valahogy megoldható egy táblázatban? Ja és a lényeg hogy 17 telephelyről van szó... Köszönöm előre is Zs
Elnézést. Az eredeti kérésben helyesen volt benne, most kimaradt. Minden második sor kitöltött. Így már nem jó. Amit hirtelen kipróbáltam, abban minden sor kitöltött volt. Azért sikerült. :(
Egy segédoszlopban a 2. cellától a következő képletet vedd fel:
=HA(B2=B1;"";B2), ezt végighúzod, valamennyi olyan tétel helyett üres cella marad, amelyben az előző cellával azonos érték van (tehát többes ismétlődés esetén is múködik).
Utána a segédoszlopot másolod - irányított beillesztés saját magára értékként - ezután az eredeti 2. oszlopra beillesztés értékként. A segédoszlop törölhető.
Megoldódott a szétszakadt sor rejtélye. Enter volt ott is, ahol nem kell. Azért szakadt szét.
A 3. kérdésre volna még valami javaslatod? Amennyiben egymás követő sorokban többször előfordul ugyanaz a név, szeretném az egymást követő ismétlődéseket kitörölni.
Köszönöm a tippet. Az 1. és 4. kérdést ezzel sikerült megoldanom. (A 4. kérdést a 3. megoldásod adja.)
A többi sajnos problémás. Az Excelbe másolás sem tökéletes, mert a 3. oszlopban hosszabb szöveg van, amit az átmásoláskor külön-külön sorba illeszt. Az "időátírás követés" , hát... :(
1. Ehhez csupán a cellaformátumot kell módosítani: jobb egérgomb cellaformázás Szám fül - egyéni [pp] mm;@
2. Vigyázz, mert az Excel az időt és a dátumot is szám formátumban tárolja, az idő a törtrészt jelenti, ahol az egész nap 1, egy óra 1/24, 1 perc 1/24*60 azaz 1/1440 1 másodperc pedig 1/86400.
A változtatás legegyszerűbben a következőképpen működik: beírod egy cellába azt a különbséget, amit változtatnál - mondjuk 1/1440. Ezután ezt a cellát másolod - utána kijelölöd az oszlopot amiben az idők vannak,
jobb egérgomb - irányított beillesztés - értéket + összeadás
3. Adatok - ismétlődések eltávolítása menüpont
4. Adatok - speciális - csak az egyedi értékek - a párbeszédpanelt megfelelően kitöltve
Olyan négyoszlopos, több oldalas táblázathoz szeretnék négy különböző makrót kérni, amelynek minden második sora van kitöltve:
1. Az első oszlopban óra:perc:másodperc formátumban idő van beírva (pl. 10:01:05), ezt szeretném perc másodperc formátumúra változtatni (pl. 01 05), ehhez az órát szeretném eltüntetni, a kettőspont elválasztót pedig szünetre cserélni.
2. Amikor változtatok valamit az időn, akár a másodpercen, akár a percen, annak az értéknek megfelelően növekedjen vagy csökkenjen az első oszlop következő kitöltött soraiban lévő idő is (pl. ha a 01 05-öt átírom 02 05-re, a következő idő értéke változzon 05 59-ről 06 59-re, és így tovább az összes sorban).
3. A második oszlopban nevek szerepelnek. Amennyiben egymás követő sorokban többször előfordul ugyanaz a név, szeretném az egymást követő ismétlődéseket kitörölni.
Változás után:
4. A táblázat második oszlopában előforduló összes nevet egy külön táblázatba kellene kigyűjteni, természetesen csak egyszer, az ismétlődéseket figyelmen kívül hagyva.
Nem lehetséges, hogy az Excel munkalapon is duplán van a kép, csak mivel fedi egymást, nem vehető észre? Próbáld elmozdítani a képet másik helyre, ha duplán van fenn, akkor alatta ott fogod látni a másikat.
Ha egy excelt munkalapot exportálok html-be, és képet is tartalmaz, akkor a mappába mindig duplán rakja a képeket, két méretben. Ez miért van, és valahogy lehetne úgy, hogy csak egy kép legyen?
Én nem látok erre most más lehetőséget, mint makróval végigmenni azokon a cellákon, amelyeknek a részletezését szeretnéd - egyébként bizonyára észrevetted, egy dupla kattintás a cellán és létrejön a részletező munkalap -, utána lehet esetleg egy munkalapra összemásolni, ami "összetartozna".
Van még olyan "elvetemült" ötletem, hogy az eredeti adathalmazt (már amennyiben hozzáférhető), szűrném le azokra a feltételekre, amelyek a pivot tábla cellaértékeit létrehozták, speciális szűréssel - makróban advancedfilter metódus.
"Ha viszont arra gondolsz, hogy a pivot táblában az értékek táblarészben levő tételek részletezése kellene, az sajnos csak cellánként működik (és mindig új munkalapra teszi ki a részletezést)."
Igen, erre gondolok. Sokat segítene, ha erre a kérdésre valaki tudná a választ.
OK, kösz még egyszer....tulajdonképpen még keresem e pillanatban az okos kompromisszumot a "mindent levédek a francba a felhasználó elől" és a "megszívatom magamat az eseményvezérlők kombinációjával" két véglet között...:))
"ezért tudniuk kell bármit csinálni, amit az excel alapértelmezetten megenged, ugyanakkor meg kell akadályozni, hogy rosszul építsék fel a tábla adatait"
Pontosan erre szolgál a lapvédelem, hogy ne tudják elrontani, ami már jó...
A sor/oszlop kezelő makrókat egy saját menüpont alatt a menüszalagra is ki tudod tenni, azaz "menütételként" lehet használni azokat.
Viszont úgy gondolom, ha szervezeti struktúra van, akkor én nem oszlopot,sort manipulálnék, hanem szervezeti egységet és munkakört stb. szúratnék be és töröltetnék - lehet, így érthetőbb lenne a felhasználóknak. Aztán, hogy mögötte mi történik az Excelben, az már nem tartozik rájuk igazán.
(Pl. van szervezeti struktúra ábra beszúrási /kezelési lehetőség is az Excelben...)
"...Levéded a munkalapot, kiteszel egy-egy gombot..."
(Csak zárójelben: olyanoknak kell elkészíteni az alkalmazást, akik feltételezhetően csak hozzávetőlegesen értenek az excel használatához, ezért tudniuk kell bármit csinálni, amit az excel alapértelmezetten megenged, ugyanakkor meg kell akadályozni, hogy rosszul építsék fel a tábla adatait. Itt nevezetesen egy szervezeti struktúra van a munkalapon - szervezeti egységekkel és munkakörökkel amolyan fa-struktúraként megjelenítve - és ezt a fát módosíthatják tetszésük szerint és ebből kell egy integrált vállalati irányítási rendszernek egy bemenő táblát készíteni úgy, hogy azonosíthatók legyenek az új/törölt/módosított objektumok az eredetihez képest)
Szóval jobb lenne egy célprogram, de ebben KELL megcsinálni
Kösz szélpen, nagyon hálás vagyok a gyors válaszért.
Ki fogom tapasztalni, amit tanácsoltál
(persze gondoltam arra is, hogy egyszerűre veszem a figurát és két globális változóval azt figyelem, nőttek-e vagy csökkentek a tábla sorai/oszlopai, csak valahogy nem tudtam elképzelni, hogy nem lehet azonosítani egyértelműen és könnyen a megszakítás (esemény) okát
Szerintem a Target paraméter címéből lehet következtetni az egész soros/oszlopos eseményre. Ha a cím egész sor és a selection sora egyezik a Target sorával, akkor sor beszúrás történhetett, ha kisebb eggyel a Target sora, akkor sor törlés történt.
Ugyanez igaz az oszlopra is (legalábbis gyors vizsgálódásom szerint).
A sor/oszlop törlésnél még a Selection_Change esemény is lefut a Change esemény után.
Esetleg meg lehet nézni a UsedRange változását, kombinálva az Application.Undo metódussal:
Megnézed a UsedRange címét/cella számát, utána Application.Undo, ismét megnézve a UsedRange adatait, kiderülhet az ok.
Ez utóbbi esetben feltétlenül az eredeti használt területen belül kell lennie a változásnak.
Tipp:
Levéded a munkalapot, kiteszel egy-egy gombot a sor, oszlop beszúrásra, törlésre és így Te vezényeled ezeket az eseményeket, nem kell találgatnod.
Keresem azt a hozzáértőt, akinek lenne ötlete arra, hogy tudnék olyan eseményvezérlőt írni, ahol az esemény elindulásakor elinduló makróban azonosítani tudnám, mi történt; pontosabban a következő események esetében kellene valamit csinálnom:
- új sort/oszlopot szúrt be a felhasználó
- sort/oszlopot törölt a felhasználó
Nem tudom, hogy lehet "lekérdezni" pl. a Worksheet changed esemény okát
"If the specified range is in a PivotTable report, it’s possible to set this property for more than one cell at a time if the range is contiguous."
Vagyis elvileg összefüggő tartományon működik pivot táblában, a csoportosításokon. (Feltételezem a nevek alapján, hogy az adott tartomány pivot táblában van.)
Nekem viszont Excel2016-ban működött az általad másodikként mutatott formula is, azzal a megkötéssel, hogy a B5:C5 mezőkben levő összecsukott értékeket nyitotta ki csak, azaz egy szintet, az alatta levő szintet nem.
Ha viszont arra gondolsz, hogy a pivot táblában az értékek táblarészben levő tételek részletezése kellene, az sajnos csak cellánként működik (és mindig új munkalapra teszi ki a részletezést).
Van két excel tábla: az egyik egy n sorból álló táblázat (tab.xls), a másik egy A/4-es oldalon megjelenítendő sablon fájl, amiből éppen n db. lesz (sab_1.xls …. sab_n.xls). A cél a tab.xls egyes soraiból az n db sablon fájl generálása (ami aztán nyomtatásra kerül).
Kérdéseim:
1./ A sablon fájl adott cellájának, a tab fájlból való kitöltéséhez beírandó képlet:
’path[tab.xls]Munka1’!P3 (pl.: a tab fájl P oszlopának 3 sorában lévő adatot vegye át,
igen ám, de a 3 helyett egy változót kellene beírni, hiszen ez minden sab_x fájlnál más és más lesz (a tab fájl x. sorának megfelelően), ráadásul e változó értéke a saját sab fájlból veendő, ugyanis ez a sab fájl sorszáma, ami a sab fájl egyik cellájának értéke is egyben, s amit kézzel is beírhetó (egyébként a sab_x fájl nevében is ez a szám szerepel). Röviden: a cellába beírandó képletbe mit írjak a 3-as helyére?
2./ A cella képletben szereplő paraméterekre is lehet keresni (illetve cserélni), mint a cella értékekre? Hogyan?
"...egy-egy automatikus javítási funkciót csak ideiglenesen kapcsolnék ki (még csak nem is dokumentum szinten, hanem, ha szükséges, egy-egy kivételes esetben)..."
Erre két lehetőséged is van?
1. Miután törölted, és éltél a nemjavítás lehetőségével, akkor vissza is tudod írni. ugyanúgy, ahogy törölted. Beírod a módosítandóhoz, hogy ay, a jó szöveghez, hogy az, és a hozzáadás gombot választod.
2. Ennél is egyszerűbb, ha kiválasztod, mint a törlésnél, de törlés helyett a jó szövegnek ugyanazt adod meg. Aztán, ha nem kell, visszajavítod.
Arra gondoltam, hogy egy-egy automatikus javítási funkciót csak ideiglenesen kapcsolnék ki (még csak nem is dokumentum szinten, hanem, ha szükséges, egy-egy kivételes esetben), mert általában jó ez és kell is, de olykor mégis zavaró. Régebben, ha jól emlékszek, az automatikus javítás külön művelet volt, tehát ha visszavontam az utolsó műveletet, akkor az Excel az automatikus javítást vonta vissza, ám most nem kezeli külön műveletként, ezért ha automatikus javítás után vonom vissza az utolsó műveletet, akkor nem az automatikus javítás vonódik vissza, hanem az én legutolsó bevitelem (pedig ennek automatikus módosulása kellene legyen az utolsó művelet). De persze, lehet, ilyen sosem volt, rosszul emlékszek, vagy keverem valamivel (LO-t is használok, így néha keverem az Excel és a Calc dolgait).
Magyar Win7 (SP1) alatt magyar nyelvű MS Excel 2010-et használok. Beírom a cellába, hogy 'ay', erre az Excel kijavítja 'az'-re. Értem én, nem tételezi fel rólam az Excel, hogy a függőleges irányú gyorsulást éppen ay-nal szeretném jelölni, és bizonyos okból nem formázom alsó indexnek az y-t, meg hát többnyire tényleg az 'az'-nak van értelme, de most éppen így szeretném jelölni a függőleges gyorsulást... Azért csak megpróbáltam az ay-t beírni a cellába, és meglepő módon, eléggé ellenállt a kísérleteimnek! Sem az aposztróffal kezdés, sem a cella szöveggé formázása, sem a kettő együtt nem segített, és az sem számított, hogy közvetlenül a cellába, vagy a szerkesztőlécbe írok. Végül, csak úgy kíváncsiságból átállítottam a billentyűzetet a Win7 alatt angol nyelvűre, és lám, máris be tudom írni az ay-t. Fura...
Van arra valami (a billentyűzet nyelvének átállításától) elegánsabb módszer, hogy ezt az automatikus javítást kikerüljem, ha akarom, és ha 'ay'-t szeretnék beírni a cellába, akkor azt megtehessem? Köszönöm előre is!
Rakd össze a két táblát egy munkalapra (úgy, hogy az azonos tartalmú oszlopok egymás alá kerüljenek - sorszám-sorszám alá stb.).
Ezután adatok - ismétlődések eltávolítása - kijelölöd a 3 szempontot tartalmazó oszlopot, fejléc bejelölés, majd enter.
Így csak azok az adatok maradnak benn, amelyek mind3 szempontban különböznek.
Szerintem ez a leggyorsabb, ha jól értelmeztem a feladatot.
Másik lehetőség - macerásabb, de szintén működik:
Mindkét táblázatban FKERES függvénnyel rákeresel a másik táblában levő adatokra - ehhez mindkét táblában kell egy segédoszlop, ahol összefűzöd a 3 szempontodat, majd ezen az oszlopon keresed az összefűzött értékekkel. Ahol hiba van, az az érték nem szerepel a másik táblában.
a segítségeteket szeretném kérni 2 excel tábla összehasonlításában. Lényegében a 2 táblázat tartalma ugyanaz, de formailag különböznek. Mindkét tábla több oszlopos, számomra legalább 3 szempont lenne fontos az összehasonlításhoz:
1. A dokumentum sorszáma
2. A dokumentumban található adatok típusai (mivel több típusról van szó dokumentum sorszámonként, az 1. pontban olvasható sorszám ismétlődik)
3. A típusok mennyiségei
A cél az alábbi lenne: A dokumentum sorszáma alapján hasonlítsa össze a két táblát, emelje ki, amelyik csak az egyik táblában van, majd a "közös" sorszámúakat hasonlítsa össze az adatok típusai ill. mennyiségek alapján.
A lényeg ebben az számomra, hogy mivel ez rendszeresen fordul elő, és nagy mennyiségben, egyértelműen kizárja az ismétlődő, majd a 2. és 3. pontban leírtak alapján egyezőeket és az eltéréseket adja ki, hogy csak azokat kelljen manuálisan vizsgálni.
Várom segítségeteket, már régebb óta olvasgatok itt a fórumban, de sajnos még nem találtam megoldást a problémámra. Ha valaki esetleg felvenné velem a kapcsolatot, tudnék küldeni példát is.
A Piros ünnepnapokat vedd fel egy függőleges segédtáblába, ezután ebben a táblában megkeresheted, hogy ünnepnap volt-e amikor dolgozott valaki. Képlet kb. így néz ki:
Nem egészen erre gondoltam! Tehát a sorokban vannak a nevek az oszlopokban a napok. Ha egy adott hónapban van ünnep nap akkor azt pirossal kitöltöm. Aki azon a napon dolgozik annak jár pótlék, amit egy másik táblázatba kell beírni. Tehát ha valakinek a beosztás tálában a piros ünnepnapon van egy "N" (Nappal) vagy egy É (éjszaka) betűje, annak a másik táblázatban az ünnepi szolgálatnál jelenjen meg "12" ledolgozott óraszám.
Például úgy, hogy szűröd az oszlopot színre, és a részösszeg függvénnyel összegzed a látható cellák tartalmát, vagy darabszámát, vagy amit akarsz. A függvényszám határozza meg az eredményt, erről a súgóban találsz felvilágosítást.
Köszönöm szépen. Tökéletes. Annyi módosítást lehetne kérni, hogy van egy makróm, ami az Excelt automatikusan sorba rendezi beírás közben, és azzal is működjön, mert így a C sort nem viszi automatikusan vele feljebb, ahogy rendeződik a sorszám, pedig a sorbarendezőben az be van állítva.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Application.EnableEvents = False Range("C" & Range("C" & Target.Row).End(xlUp).Row).Copy Cells(Target.Row, 3) Application.EnableEvents = True End If End Sub
Bocsi. :( Pl. A1 és C1 kitöltött. C1-ben képhivatkozás van. A2 kitöltésre kerül, akkor C2-be másolja a C1 képszámot és a hozzá tartozó hivatkozást. Ezt csinálja most. Sorban egymás után.
De amit most nem tud és szeretnék kérni, hogy ha pl. A3 nem kitöltött, az A4 kerül először kitöltésre, akkor a C4-be másolja a C2 értékeket, mint az C oszlopban szereplő utolsó kép és hivatkozás. Majd ha az A10 lesz kitöltött, akkor a C10-be másolja a C oszlop utolsó kitöltött értékét, esetünkben a C4-et.
Sziasztok! Az alábbi makrórészletben változtatásához szeretnék segítséget kérni. Jelenleg sorban egymást követő beírásra érvényes a makró, helyette azt szeretném, hogy ha bármennyi sor kimarad az A oszlopban, a C oszlop másolása akkor is működjön.
Sub teszt() Dim AF As AutoFilter, F As Filter, i As Long
Set AF = ActiveSheet.AutoFilter For i = 1 To AF.Filters.Count Set F = AF.Filters(i) If F.On Then MsgBox "Az AutoFilter " & i & ". oszlopában bekapcsolt szűrő, feltétel: '" & F.Criteria1 & "'" Next End Sub
Igen, ezért figyeli a program azt, hogy az AG oszlopban történt-e a módosítás (persze lehetne szűkíteni az 1-23. sorokra, de ezzel nem akartam pepecselni). És abból a feltételezésből indul ki, hogy ha abban az oszlopban módosítás történik, az befolyásolhatja az AG24-et. És mivel az AG24-ben megjelenő tartalom változását nem tudja vizsgálni, biztos, ami biztos, törli, és újra rajzolja a képet. Ha volt változás, akkor az újat, ha nem, akkor ugyanazt, ami eddig volt.
A 29230. hozzászólásban leírtam, hogy ez lehetetlen. Ha a cella képletet tartalmaz, akkor az Excel nem tekinti módosulásnak azt, hogy a képlet mást jelenít meg, mint előzőleg. Más szavakkal válaszd külön gondolatban a cella tartamát (a függvényt) és a cellában megjelenített látszólagos tartalmat.
Ha viszont a cella tartalmát írod át, az módosulás lenne, de akkor csak egyetlen lehetőség lenne a cella tartalma alakján a képet megjeleníteni, ha a hozzátartozó fénykép nevét írnád a cellába. De nyilván nem akarod.
Igazából arra gondoltam, hogy ha az AG1 cella érték változik, akkor az AG1 cellába beszúr egy képet. Ha az AG2 cella változik, akkor az AG2-be szúr be egy képet. Tehát ezek tök függetlenül működnének egymástól.
És ez egészen AG1-től AJ24-ig lenne érvényes minden egyes cellára mondjuk. Hogy ezt hogy lehetne megcsinálni? Erre gondoltam.
Az igazat megvallva nem igazán értem a kérdést. Inkább elmondom, melyik sor, mit csinál.
A három konstans sor az elején megadja a kép helyét, az oszlopot, amelyiket piszkálunk, és azt a cellát (célcella), amelyiknek a tartalmától függ a megjelenített kép, és amelyiknek a felső bal sarkához igazítjuk a képet.
Az If Target.Column = Range(celcella).Column Then sor arról gondoskodik, hogy csak a megadott oszlopban (AG ) történő változásokkal foglalkozzunk.
Most látom, hogy el is szúrtam, mert a céloszlop helyett a célcella oszlopát vizsgáltam. A kettő most egybeesik, így nem okoz hibát, de elvileg lehetne más. Ez a sor helyesen úgy nézne ki, hogy
If Target.Column = Range(celoszlop & 1).Column Then
A következő néhány sor értelmét kommentben beírtam
A kép nevét megadó sor értelemszerű. Összefűzi a kép helyét a célcellában lévő névvel.
Ezután a with-el kezdődő rész beszúrja képet a helyére, és egyben megadja a kép tulajdonságait. A bal sarkának meg a tetejének a helyét, valamint a magasságát és a szélességét,
De ha csak annyi a cél, hogy ne az AG24 legyen a célcella, akkor az elején lévő konstansot írd át.
Ha azt szeretnéd, hogy az AG1 is célcella legyen, akkor a programban az if és az End if közötti sorokat megduplázod, és a benne szereplő neveket (celcella és Kep) újra (pl. celcella2 és Kep2) cseréled. Az elején létrehozol még egy celcella2 nevű konstansot AG1-tartalommal. A kepneve változónév maradhat.
Még egy olyan kérdésem lenne, hogyha ezt nem csak az AG24-es cellára szeretném, hanem mondjuk AG1-AG24-ig, tehát ha A1 változik, és olyan érték kerül oda, amilyen kép szerepel a mappába, akkor oda beillesztené. Ha pedig már volt ott kép, akkor ugyanígy törölné az előzőt. AG2-re szintén. Persze ezek tök függetlenek lennének egymástól. Mit kéne változtatnom? Ez csak az érdekesség kedvéért kérdezem, ami kellett nekem az már működik.
Időközben megnéztem, feltehetőleg mégsem a bővítmény hiánya okozza a bajt. Töröltem mindkettőt, mégis működik nálam a program.
Viszont azt találtam, hogy ha hibásan adom meg a fájl nevét (vagy az elérési útját), akkor jelentkezik a hiba.
Próbáld meg a következőt: Amikor a program megáll a hibajelzéssel, akkor válaszd a debug-ot. (A hibás sort sárgán látod.)
Ekkor a VBA képernyőn menj be az immediate ablakba! (ha nem látható, akkor a fenti View menüpont alatt előzőleg jelöld be.)
Itt írd be a következőt: ?dir(kepneve), majd ha az Enter után nem jelenik meg semmi, akkor nem találta az adott helyen. Mert, ha megtalálta, akkor kiírja a nevet.
Ebben az esetben írd be, hogy ?kepneve, majd az Enter után megjelenő szöveget nézd meg, és keresd meg benne a hibát. Ha nem fér el a képernyőn, akkor a cursorral végig tudsz sétálni rajta. Lehet, hogy csak a könyvtár és a kép neve között hiányzik a backslash, vagy valami más apróság.
(Ha nem látod a hibát, akkor másold ki a sort ide, hátha tud valaki segíteni.)
"...gyakorlatilag annyi kéne, hogy ha az AG24-es cella értéke változik..."
Ez is történik a programban, azzal a kis eltéréssel, hogy magának az AG24-nek a változását nem tudom érzékelni. Ugyanis ott egy képlet van, ami nem változik attól, hogy a képlet mást jelenít meg a cellában.
A Worksheet_Change esemény alapesetben annak a cellának a változását vizsgálja, amelyikben az Enter-t lenyomva változást idéztél elő. A leírás szerint ez egy külső függvénnyel is megvalósítható, de ez itt nem jön szóba.
Ezért - mivel a leírásod szerint az AG3-AG23 cellákat töltöd fel, és ez okoz változást némi áttételeken keresztül az AG24-ben - azt vizsgálja a program, hogy változtattál-e valamit az AG oszlop bármelyik cellájában. Ha igen, akkor törli, majd újra kiteszi a képet, csak éppen ezt nem érzékeled, hiszen a másodperc egész kis törtrésze alatt következik be a törlés és az újrarakás.
A kép formátuma nem hinném, hogy gondot okozna.
Delilának meg köszönöm a segítséget. Ez magamtól nem ugrott volna be, és eltartott volna egy darabig, míg megtalálom a hiba okát. Ha egyáltalán:-)
With ActiveSheet.Pictures.Insert(Kepneve).ShapeRange
.Name = "Kep"
.Left = Range(celcella).Columns.Left
.Top = Range(celcella).Rows.Top
.Height = 13 ' A kép magassága
.Width = 15 ' A kép szélessége
End With
End If
End Sub
- A három konstans sort módosíthatod a feladatnak megfelelően.
- A képek meglehetősen kicsik, ha mégis növelni szeretnéd a méretüket, akkor a magasság és a szélesség értéket tudod módosítani.
Azt nem tudom pontosan, hogy mik a feltételei annak, hogy a képet megfelelőre kicsinyítse. Azt tapasztaltam saját képeimen, hogy a fekvő képeket jól tudja méretezni, állóképnél ez nem mindig sikerült
Egy-két dolgot nem tudom, hogy jól értelmeztem-e.
Az egyik, hogy az AG oszlopba írogatsz/módosítgatsz/feltöltesz adatokat, és ezek változásának függvényében módosul az AG24 cella tartalma. Ezért a program az AG oszlopban történő változásokat figyeli, egyéb oszlopokban történt változásokra nem reagál.
A másik, hogy a képnek a neve az AG24 cellában lévő adattól függ. Ha nem így van, akkor a kép nevének összeállítását végző sort kell javítanod.
A Kepneve = kephelye & "" & Range(celcella).Value & ".jpg" sorban a Range(celcella).Value & ".jpg" helyére írd azt a képletet, ami a kép nevét megadja.
Van egy munkafüzetem. Azt szeretném elérni, hogy ha egy bizonyos szó kerül egy cellába, akkor rendeljen hozzá egy képet. Tehát abba a cellába szúrjon be egy 0.4 cm magas , és 0.5 cm széles képet.
Inkább leírom pontosan, hogy is néz ki.
AG3-AG23-ig töltöm fel bizonyos nevekkel a cellákat. Csináltam egy segédtáblát. AM cellában van a név, AN cellában van hogy ez a név hányszor szerepel AG3-AG23 tartományban. (sima darabteli függvény)
AG24-es cellában csináltam egy ilyen függvényt: =INDEX(AM5:AN6;HOL.VAN(MAX(AN5:AN6);AN5:AN6;0);1)
Tehát, ahogy töltöm fel a AG3-AG23-as tartományt, mindig változik, hogy ki a leggyakoribb. Azt szeretném elérni, hogy, amint változik ez a név, akkor az előzőhöz tartozó képet törölje, és az új névhez tartozó képet szúrja be.
Egy más jellegű kérdés. Az F billentyűkhöz szeretnék makrót rögzíteni. Lehetséges valamennyinél, vagy nem? Mert eddig csak az F1 és az F12 billentyűhöz sikerült. Vagy az én készülékemben van a zavar?