Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Hát már bocsánat, én sem vagyok nagy véleménnyel ennek a fórumnak a technikai színvonaláról, és 2000 óta nézem, ahogy egyre rosszabb és rosszabb verziókkal cserélik le, de kódokat inkább a pastebinbe írjál.
Azért dobja a 'subscript out of range' hibaüzenetet, mert olyan munkalapra hivatkozik, aminek a neve egy üres string (szöveges változó), tehát egy üres cella tartalma a G oszlopban. Esetleg bele lehet tenni egy ha függvényt, hogy ne másoljon, ha a G oszlopban levő cella üres az adott sorban. Beleírtam a kódrészletbe.
Az nem teljesen tiszta nekem, hogy miért nem másol amikor üres a B oszlopban a cella, erre nem tudok mit mondani.
A G oszlop másolásához valóban a resize metódussal kell babrálni, ezt is beleírtam. Ha nem stimmel, szólj!
For Each Rng In Sheets("leltárlista").Range("G4:G" & Lr)
Azért dobja a 'subscript out of range' hibaüzenetet, mert olyan munkalapra hivatkozik, aminek a neve egy üres string (szöveges változó), tehát egy üres cella tartalma a G oszlopban. Esetleg bele lehet tenni egy ha függvényt, hogy ne másoljon, ha a G oszlopban levő cella üres az adott sorban. Beleírtam a kódrészletbe.
Az nem teljesen tiszta nekem, hogy miért nem másol amikor üres a B oszlopban a cella, erre nem tudok mit mondani.
A G oszlop másolásához valóban a resize metódussal kell babrálni, ezt is beleírtam. Ha nem stimmel, szólj!
For Each Rng In Sheets("leltárlista").Range("G4:G" & Lr)
- a For..Each ciklus végigmegy a "leltárlista" munkalap G oszlopán a negyedik sortól az Lr-edik sorig.
- az Rng változó mindig az adott cellát jelenti (először G4, majd G5, stb.)
- If Rng.Value <> "" Then Ha a cella nem üres, akkor
- Sheets(CStr(Rng.Value)) a Rng cellában található érték nevével fémjelzett munkalap (a CStr szöveges változót csinál belőle, hogy ne számként értelmezze)
- .Range("B" & Rows.Count).End(xlUp) B oszlop utolsó sorából indulva felfelé haladva az első nem üres cella (pl. B3)
- .Offset(1,0) az eggyel alatta levő cella (pl. B4)
- .Resize(,6) a kijelölés átméretezése egy celláról hat cella szélesre jobbra(tehát pl. B4:G4)
- .Value és ennek az értéke
legyen egyenlő ezzel:
Rng.Offset(,-6).Resize(,6).Value magyarán a Rng cellától hattal balra levő cella (a "leltárlista" munkalap G oszlopában van a Rng, mint emlékszünk, tehát pl. G4-ből lesz B4)
átméretezve jobbra hat cella széles területté (pl. B4:G4), és ennek az értéke
Ha az utolsó helyett a Z oszlopba teszed a képleteket, azzal szerintem semmit nem nyersz.
A képlet módositása úgy, hogy a Replace feleslegessé váljon, járható útnak tűnik. Ki kell próbálni, hogy működik-e. Azért én nem várnék tőle túl sokat. A Replace elég gyors dolog egy 60-80 soros táblázatnál.
A futtatás előtti aktiv cellát meg úgy őrzöd meg, hogy:
Dim Talon As Range
Set Talon = Activecell
aztán jön a program többi része
a végén pedig
Range("A1").Activate
helyett
Talon.Activate
kell.
A vessző és a pontosvessző körüli kavarodás pedig azért van, mert a VBA részt nem magyaritották az Excel többi összetevőjével. (Hála Istennek :o))
Sziasztok! Szeretnék egy pici segítséget kérni, excelben szeretnék vérnyomásnaplót vezetni. Ehhez találtam egy majdnem minden szempontból megfelelő template-et, amin egy dolgot szeretnék megváltoztatni: azt szeretném, hogy ne day 1, day 2 stb. legyen, hanem pl 2013.02.19, 18:00, és mindez a charton is így legyen, így változzon. Azért szeretném így, mert egy nap többször is mérek. Hogyan volna ez lehetséges? A template linkje: http://raywinstead.com/bp/BPMonthOnceADayFormExcel.xls
Nagyon fontos volna, hálás köszönet annak aki hajlandó volna segíteni.
Aha, köszi, tehát jól láttam, hogy valóban ír a táblázatba! Csak éppen az utolsó oszlopba. Na most ha megmondom, hogy az utolsó oszlop mondjuk a P, és még ha írnak is mellé, a Z oszlop már biztosan szabad, azzal lehet gyorsítani?
És hogy tudom az elején eltárolni a kurzor helyét, hogy ne A1-re álljon vissza?
Ha a SUM(G4,I4,K4,M4,O4) helyett IF(SUM(G4,I4,K4,M4,O4)=0,"",1)-et írnék, azzal megspórolnám a külön cserét, nem? Akkor felesleges lenne az Rng.Replace what:="0", replacement:="", lookat:=xlWhole
Meg kell szokni, hogy itt vessző van a pontosvessző helyett, furcsa, és nem is értem, miért nem az van az Excelben is.
Feladat a következő. Van egy excel fájl, meg mondjuk 6 darab vegyes pdf. Ezeket akarom átnevezni.
Jelenleg a következőképp csinálom. Van egy excel táblám, benne két makró.
Az egyik a mondjuk ctrl+a-val a könyvtárban lévő pdf fájlok neveit listázza be. A másik pl. ctrl+d-vel megnyitja a beállított pdf olvasót.
Utána én kitöltöm pl a dátumoszlopot, majd az irattípust automatikus kiegészítés segítségével gépelve kiválasztom.
Ha végeztem, a kívánt tartalmat copy paste módszerrel át viszem egy sima bat fájlba, ott a wordpad++ makrójával kiszedem a tabulátorokat. És az elkészült sima dosos rename bat fájlal átnevezem a pdf-eket.
Kérdésem a következő
1. Hogy lehetne megnyitni a pdf fájlokat, úgy, hogy ne nyisson meg újabb pdf ablakot. Azaz előzőleg megnyitott fájlt, ha van olyan zárja is be. Tudom, lehet hogy a viewer beállításán múlik. De gyanítom, hogy excelből vezérelhető. 2. Hogy lehetne az irattípust egyfajta legördülő listából kiválasztani. Jelenleg alt+le nyíllal választom ki, vagy beírom az első 1-2 betűt. - Nem nem jött be az adatok - érvényesítés - beállítások fülön a Megengedve (lista), majd forrás megadása. + legördülő lista bepipálása. - Ugyanis szeretném minimalizálni az egerezést, és itt hiába gépelek be bármit, nem működött.
3. Dupla egér kattra nem lehetne elindítani a makrót? Ne kelljen állandóan kombózni? Azaz adott cellára duplán kattintok, hívja be a pdf olvasót. 4. hogy tudnám kiírni egy bat fájlba az excel tartalmát (csak a kívánt területtel)? Megspórolhatnám a copy paste wordpad++ makrós pucolást.
Excel tudom, hogy sosem fog fájlokat átnevezni, ezért kellene nekem egy külső bat fájlt kreálni és elindítani. Ebből adódik az ötös kérdésem
5. hogy tudnám elindítani excelből az elkészült bat fájlt, hogy lefuthasson, átnevezve a pdf fájlokat?
Szia! Ez drasztikusan gyorsabb! Csak nem értem, hogy működik. A Rng.Formula= olyan benyomást kelt bennem, mintha teleírná a munkalapot... Mit csinál ez tulajdonképpen?
A Sheets(Rng.Value) hivatkozás azért nem működött rendesen, mert indexként és nem a munkalap neveként értelmezte, elnézést. Így már jónak kéne lennie.
Változtattam némileg a kódon. Ezt a ThisWorkbook modulba kell bemásolni. Nem frissül automatikusan, amikor változtatsz egy cellát, az túl sok futtatást eredményezne szerintem.
Ehelyett minden alkalommal le fog futni, amikor elmented a munkalapot. Minden futás alkalmával az első sor kivételével kitöröl minden adatot a helységneveket tartalmazó munkalapokról, majd újra bemásol mindent. Elméletileg nem kéne, hogy sok időbe teljen, kíváncsi vagyok, mennyi idő alatt fut le neked.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim Rng As Range Dim Lr As Long ' utolsó sor Dim Sh As Worksheet Lr = Sheets("leltárlista").Range("G" & Rows.Count).End(xlUp).Row
For Each Sh In ThisWorkbook.Worksheets If Sh.Name <> "leltárlista" Then _ Sh.UsedRange.Offset(1, 0).ClearContents 'kitöröl az első soron kívül mindent Next Sh For Each Rng In Sheets("leltárlista").Range("G4:G" & Lr) Sheets(CStr(Rng.Value)).Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Resize(, 5).Value = _ Rng.Offset(, -5).Resize(, 5).Value Next Rng
Köszönöm! Minimális belepiszkálást igényelt a tesztkörnyezetbe betéve, egy munkalappal odébb tájolta magát, ezt ennek "Sheets(Rng.Value)" a módosításával megoldottam.
Viszont már látom mi lesz ezze a bajom. Ez valóban ahányszor lefut, annyiszor duplázza be a tételeket. Ez megint nem az, amit tőlem szeretnének. Eredetileg az volt a kérdés, hogy az megoldható-e, hogy a leltárlistán szereplő tételek sorában a helység számát változtatva automatikusan, mindenféle futtatás és piszkálás nélkül változzanak a mögöttes helységleltár lapok. Ezért is kell ez külön, mert négy helységnél még szűrök és nyomtatom a leszűrt listát, mint helységleltárt, de ebben feltöltés után lesz egy 300+ tételes anyaglista az első lapon és utána még vagy 20 lap.
A 20449-ben bemutatott rendszer ennek a célnak megfelel. Két problémám van vele: 1: iszonyú redundáns, ahány helység, annyiszor tartalmazza a teljes méretű táblázatot, 2: nem jó a folyószámozás, de ez a kisebbik gond, nyomtatás előtt rendbe lehet tenni.
Én előre szóltam. :D Itt a makró. A leltárlista egyes sorait másolja a B-től F oszlopig (5 cella) a G oszlopban megadott munkalapra. Ahányszor futtatod, annyiszor másolja. Nem hibabiztos, szólj ha valami gond van vele. Javaslom, azért hagyd meg a leltárlistában az eredeti sorokat - annak ellenére is, hogy így kétszer tárolod ugyanazt az adatot.
Sub CopyRows()
Dim Rng As Range Dim Lr As Long ' utolsó sor
Lr = Sheets("leltárlista").Range("G" & Rows.Count).End(xlUp).Row
For Each Rng In Sheets("leltárlista").Range("G4:G" & Lr) Sheets(Rng.Value).Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Resize(, 5).Value = _ Rng.Offset(, -5).Resize(, 5).Value Next Rng
Üdv! Ez is egy megoldás, nekem jó is lenne akár az autoszűrős, akár a jelenleg meglévő módszer, de a kérés felém úgy hangzott, hogy azt oldjam meg, amit lejjebb megfogalmaztam :)
Meg lehet csinálni, de minek szednét szét több munkalapra az adatodat? Sokkal több előnye van, ha egyben van az egész. Könnyen tudsz rá szűrni, kimutatást, grafikont, pivottáblát csinálni. Ha csak egy helység adatait akarod látni, akkor egyszerűen szűrsz arra az oszlopra. Több munkalapon tárolni ugyanolyan felépítésű adatot eléggé előnytelen.
Én John Walkenbach egyik könyvéből tanulgattam a makrók alapjait: VBA programming for dummies a címe, ha jól emlékszem.
Agyalok, hogy hogyan tudnám tökéletesíteni a leltáros táblámat.
A táblázat felépítése ugyanaz, mint eddig volt.
Sorszám / HETK (ez egy kódszám) / Megnevezés / Mennyiség / Mennyiségi egység / Azonosító / Helység szám
A valódi adatsor a 4. sorban kezdődik, addig fejléc van. Minden lap ugyanilyen felépítésű, lapokból most van öt (leltárlista, 1, 2, 3, 4). A helységszám a teszttáblán 1-4-ig terjed, az élesben ennél jóval több lesz, minden helységhez külön munkalappal. A cél az volna, hogy a sorszámozás maradjon meg minden lapon az eredeti állapotban, de az kezdő lapról (leltárlista) az egyes sorokból a B:F tartomány adatai kerüljenek át arra a munkalapra, amit a G oszlopban lévő egész megad.
Jelenleg van egy működőképes megoldás rá, de nem az igazi, ugyanis egy HA függvénnyel átvetettem a megfelelő lapokra az adatokat, de ez szaggatott sorszámozást eredményez az 1-4-ig számozott munkalapokon. Azt szeretném elérni, hogy egyrészt értsem, hogy a makró melyik sora mit művel, másrészt meglegyen az eredeti cél is, azaz a leltárlistáról vegye át a megfelelő értékeket úgy, hogy a sorszámozás minden további munkalapon 1-nél kezdődjön és folyamatos legyen, ha lehet, mindezt automatikusan.
'4. sortól rejtünk csak ha 2. oszlop értéke hamis For sor% = sorok% To 4 Step -1 If Cells(sor%, 3).Value = "" Then _ Rows(sor%).Hidden = True Next Next With Application .ScreenUpdating = True End With End Sub
Elképzelhető, hogy sikerül ezt a makrót úgy átírni, hogy megoldja a feladatot? Hangsúlyozom, érteni is szeretném, így ha elmondja valaki, hogy mit írja át benne, az is tuti lenne (már ha nem 0-ról kell újraírni, annyira nem értek sajna hozzá). Van egyébként valakinek jó tippje, hogy honnan lehetne normális tananyagot szerezni ehhez?
"Valóban azzal a sorral van a bibi valószínűleg, csak azt nem tudom, hogy micsoda!"
De hát mondom: nincs olyan munkafüzet, amire a program hivatkozik. Létre kell hozni előbb, és csak azután hivatkozni rá.
Ha mondjuk van egy sablon munkafüzeted, akkor mondd neki, hogy SaveAs, pl. így:
Workbooks("sablon.xls").SaveAs Filename:="C:\mappa\útvonal többi része\KIR" & Format(Date, "éééé.hh.nn") & ".xls"
aztán már tudsz rá hivatkozni.
Egyébként a programodban a Range hivatkozások egyike sincs adekvát módon definiálva, ezért csak szerencsés együttállások esetén fog működni. Arra számítani, hogy hogy az adott munkafüzetben mindig pontosan a szükséges munkalap legyen aktív, nagy bátorságra vall. :o)
Szerintem ezeket ki kellene javítani, ahhoz viszont a feladat megfogalmazása továbbra is elégtelen.
Igen, hasonló, de ahová bemásolnám, annak a munkafüzetnek változó a neve, mindíg a "KIR" + az aktuális dátum. A munkalap neve mindíg ugyanaz, innen is indítanám a makrót.
Azt, hogy egy adott és ÁLLANDÓ nevű munkafüzetbe másolja, nincs gond, csak nem tudom, milyen módon tudnám úgy összefűzni a munkafüzet nevét, a "KIR" szóval és az aktuális dátummal, hogy azt értelmezze a makró.
Valóban azzal a sorral van a bibi valószínűleg, csak azt nem tudom, hogy micsoda!
Van egy X nevű munkafüzet, annak Y nevű munkalapja, ahonnan szeretném kimásolni a
- B3:L48 fix tartományt
- A B:L oszlopokban, a 3. sortól kezdődő, összefüggő tartományt
- valami más módon definiált tartományt,
és szeretném beilleszteni az A nevű munkafüzet B munkalapjára, az így és így definiált cellától kezdődően (itt is többféle definíció lehetséges, nem sorolom fel újra)
a kód pedig
- az X munkafüzetben
- az A munkafüzetben
- egy harmadik munkafüzetben (név szerint:...) legyen elhelyezve.
Erre már lehetne egy jól működő kódot írni, mert maga a feladat nem nehéz.
Ami a konkrét hibaüzenetet illeti, erős a gyanúm, hogy az alábbi sor a ludas (egyébként a hibaüzenettel párhuzamosan azt is érdemes megemlíteni, hogy hol akad ki a program):
Windows("KIR " & j5 & ".xlsm").Activate
Mégpedig az lehet a gond, hogy nem létezik ilyen munkafüzet, amikor a sor végrehajtódik. Valami sablon munkafüzettel dolgozol, amit előzőleg el kellene a KIR+dátum más néven.
Esetleg a kiterjesztésekkel lehet gond, hogy xls vagy xlsm.
Van egy megosztott file amibe két helyről léphetnek be a dolgozók és kétféle lehetőségük van a filebe írni, azaz két oszlopba csoportba írhatnak de úgy, hogy mondjuk az egyik az A-C másik társaság a D-F oszlopba. Hogyan tudom megkülönböztetni őket illetve az ehhez szükséges paraméterek hogyan kérdezem le?
Köszönöm az eddigi segítséget, amivel rávezetődtem dolgokra. Most ismét megakadtam:
Szeretném, ha egy cellába megjelenne az adott munkafüzet neve. Ez eddig nem nagy probléma, bár csak a teljes útvonalas függvény akar működni, de nem nagy baj, megoldható másképpen is, de...
Szeretném elérni, hogy egy másik munkafüzetből, (Napi kocsikiadás KIVONAT.xls”) EBBE, a naponta (a dátummal változó) változó nevű („KIR ”+dátum elnevezésű) munkafüzetbe másoljon át adatokat.