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.
Nem egészen világos elöttem, hogy hogy milyen szabály szerint írja át a vba a változók exlpliciten meghatározott típusát. Az alábbi példában a szorzás mindkét Dim-nél overflow-t eredményez. De amíg ehhez az elsőnél át kell írnia Dim c#-t, addig a másodiknál meg változatlanul kell hagynia a c%-t. A kérdésem tehát, hogy milyen szabály szerint alakul a változók típusa?
Szerintem nem zavaró, inkább vicces :) Elképzelem, hogy mi lehet mögötte: egy lelkes ember, aki annyira bír lelkesedni, hogy minden mondat szinte kirobban belőle :))
Mivel olyan kort írunk, amikor az ember már a levelet indító megszólítás után sem meri kitenni a felkiáltójelet, nehogy sértőnek, agresszívnek, stb. tűnjön, a hsz-eid tulajdonképpen üdítő változatosságot jelentenek :)
Tudnátok segíteni abban, hogy képlettel meg tudom-e azt csinálni, hogy darabteli függvényt még szűröm dátumra is.
Az alaptáblám ez, de van kb. 15 munkalap, s mindegyiken van több adat (van ahol 100 sor is van):
Munka1
xxx AB 2012.08.01
yyy CD 2013.10.10
zzz AB 2013.10.22
Munka2
xyz CD 2013.11.02
Azt csináltam eddig, hogy Darabtelivel összeszámoltatttam egy összesítő munkalapra, hogy Munka1 B oszlopában van 2db AB, 1 CD. De itt, így nem tudom, hogy mikor dátummal.
Így néz ki:
AB CD EF
Munka1 2 1 0
Munka2 0 1 0
Munka3
stb.
Azt szeretném kiíratni, hogy 2012-ben hány db AB van. (vagy épp 2013-ban) Ezért ezt kellene még szűrni úgy, hogy dátumra is be tudjam állítani. Tehát ha azt adom meg, hogy 2012, akkor nem 2 AB lesz, hanem csak 1,mert a többi nem abban az évben volt.
Gyakoraltilag úgy kellene, mint egy Kimutatásnál, hogy ott a dátumra tudok szűrni, s akkro csak azt jeleníti meg. Csak képlettel vagy szűrővel.
Private Sub GépINF1_Click()! sor = Application.Match(Me.Gépszám1, Range("C:C"), 0)! If VarType(sor) <> vbError Then! ActiveWorkbook.FollowHyperlink Cells(sor, "I").Hyperlinks(1).Address, NewWindow:=True! End If! End Sub!
Sikerűlt megoldanom a dolgot a következőképpen! Ha netán valakinek szüksége lenne rá:
Private Sub GépINF1_Click() sor = Application.Match(Me.Gépszám1, Range("C:C"), 0) If VarType(sor) <> vbError Then ActiveWorkbook.FollowHyperlink Cells(sor, "I").Hyperlinks(1).Address, NewWindow:=True End If End Sub
Sziasztok! Sikerült elkjészíteni a táblázatomat, (hatalmas köszönet Delila10-nek)! Minden funció, amit akartam, működik rajta! Munkatársaim nagy örömére :) ! Volt viszont egy kérésük, hogy az adatok bevitelére egy ablakot lehetne-e használni? Elkezdtem Userformos "önoktatásomat" és sikerült megcsinálnom úgy, hogy az adatokat azon az ablakon keresztül lehessen bevinni! Viszont:
A táblázat fő tulajdonsága az, hogy bizonyos oszlopok sorainak kitöltésekor egy másik oszlopban megjelennek az adatok, a bevitt elemhez! Az adatok persze egy hivatkozás, amire rákattintva egy txt, vagy doc típusú file-t nyit meg! Szóval userformos ablakomon elhelyeztem 3 gombot és szeretném, ha az adatok bevitelekor a megjelent hivatkozások ezekkel a gombokkal megjeleníthetőek legyenek! Mindig az aktuális sor hivatkozásai! Szóval, a gombhoz milyen parancssort kellene beírnom, hogy az adott oszlop utolsó kitöltött cellájában lévő adatot megnyissa?
Én is köszönöm a korrekciót. Elsősorban azt, hogy a sor/oszlop long és nem integer. Mert az emiatti hiba korrekciójával biztos sokáig eltökölnék :)))).
Arra persze figyelni kell, hogy a Munka1 helyére a kívánt munkalap neve kerüljön. És nyilván lehet olyan eset, amikor azt akarjuk, hogy mindig az aktív munkalapon induljon a makró. Ilyenkor akkor a ThisWorkbook.Worksheets("Munka1") rész nem kell, tehát az eredeti megoldás részben jó.
De a "Set itt_van = ...." szerkezet használata továbbra is indokolt.
Ez a megoldás azért nem tökéletes, mert csak az aktív munkalapon működik, és ott is csak akkor, ha van rajta "XY" részértékű cella. Máskülönben hibára fut, és az nem mutat jól egy makróban. Helyette ajánlanám az alábbi megoldást. Kicsit többet kell hozzá gépelni, de cserébe nem fog csütörtököt mondani.
Bizony így van. És ez nagy hibája az autószűrőnek. Mert azért úgy illene, hogy a 255 karakternél hosszabb stringekből is lássa az első 255 karaktert. De valamiért erre nem készítették fel. Az írányitott szűrőnek azonban 32 ezer karakterig nincsenek ilyen korlátai.
Ja, hogy te az e-mailre gondolsz! Bocsi, privinek a belső üzenőket szokták hívni.
Hát két eset van: vagy megjelenik a "küld" az adatlapon, vagy nem. Ha nem, akkor az illetőnek nem publikus az e-mail címe, meg kell kérni, hogy ő írjon neked. Egyébként ha ide beírod egy kicsit megbontva a címet, nem kockáztatsz sokkal többet, mint ha az adataidnál publikussá teszed a beállításokban.
Ha van küld, és mégis hiába kattintasz rá, akkor nincs jól beállítva a levelező azon a gépen, jobb egérgombbal lehet a címet kimásolni.
Működött régebben, azóta is levelezek INNEN néhány fórumtaggal.
A hozzászólásban rákattintasz a fórumtárs nevére, feljön az adatlapja, ott egy "küld" szövegre kattintva már írhattad is a levelet. Most kattintgatgatok estig, nem történik semmi.
Ha nem is azonos vele, attól még transzponál. Illetve ami nagyobb baj: CSAK transzponál. Nálam legalábbis. Te hogy csinálod, hogy nálad ne transzponáljon a munkalapra kííratáskor? Mert fordítva, tehát a munkalapról vba tömbbe íratáshoz írt makródban nálam sem okozott gondot.
Írod, hogy egyelőre még maradsz az excel 2003-nál. Ezért felteszem neked ide a 2003-asra írt HAHIB nevű HAHIBA analalógomat. Jól jöhet a 2003-ban a különböző keresőfüggvények #HIÁNYZIK! stb hibáinak lekezeléséhez. Használata megegyezik a HAHIBA-éval.
Szerintem ne jelezd, mert egy másik fórumra gondolhatsz. 13 és fél év fórumozáshoz és lassan 216 hozzászóláshoz közeledve én még nem találkoztam ilyesmivel.
Ha ennél hosszabb szövegeket akarsz szűrni, használd a special (írányított) szűrőt. Annak is van korlátja, de lényegesen magasabb.
Utána néztem. A 2007-es excel special szűrésének már nincs stringhosszúsági korlátja. Ahány karakter befér a cellába (max 32 ezervalamennyi), azokat mind látja a szűrésnél. A 2003-as excelben ehhez még trükközni kellett
Rendben! Akkor holnap reggel átküldöm, és leírom, hogy mi is lenne a terv! Nem gondoltam, hogy ennyire bonyolult lesz az elkészítése ne haragudj! És köszönöm!
Neked és mindenkinek aki a tömbképlettel foglalkozott eddig:
A 2003-as azért nem tudja kezelni a teljes oszlopra vonatkozóan megadott 2007-es tömbképletet, mert a 2007-esben a sorok száma már nem 64 ezer x, 2010-ben több, mint 1 millió.
A magasabb verzióra bár érdemes áttérni, de a tömképletbeli problémád miatt felesleges. Ha Delila tanácsát nem értetted volna félre, akkor ezt már te is látnád. Delila nem az javasolta, hogy csak az első 7 sorba írd a tömbfüggvényt, hanem hogy a tömbfüggvényben vizsgálandó tartományokat precízen add meg. Tehát a 2003-as excelben ez a képlet működik az 1-7 sorokra:
{=Max(HA(F1:F7=”aktív”;A1:A7))}
Éni is megnéztem a feltöltésedet 2007-tel. Már az is konvertálta a #SZÁM! hibát. Amit a 2003-ban az okozhatott, hogy a 2003-as a tömbképleted az A:A, F:F hivatkozásokat nem tudta kezelni.
Szia. Örülök, hogy át tudtad hidalni a stringhosszbeli problémát. Az viszont meglepett, hogy a 2007 füzetben nem tapasztaltad a 255 karakteres határt. Ugyanis 2007-es füzetben mértem ki a 255-t. Ezek szerint rosszul. Megcsinálnád a kedvemért, hogy csinálsz egy garantáltan hosszabb stringet, és megnézed, hogy listázza-e a 2007-es autószűrő? Aztán írd meg légyszí, hogy mit tapasztaltál.
Olyan sűrűn változtatsz a lap felépítésén, hogy nem tudlak követni.
Legjobb lenne, ha kitennéd a füzetet egy elérhető helyre publikus adatokkal, vagy elküldenéd priviben, de előbb goldold jól át, mit hol szeretnél megjeleníteni.
Meg is van a hiba oka. A két verzió közti különbség okozta. Amikor a 2007-es alatt kompatibilis üzemmódban akarom menteni a fájlt, akkor a program figyelmeztető üzenetet küld: "A munkafüzetben lévő tömbképletek némelyike egy teljes oszlopra hivatkozik. Az Excel régebbi verziói ezeket a képleteket várhatóan #SZÁM! hibává fogják alakítani újraszámításkor."
Sajnos kénytelen leszek hamarosan áttérni, pedig nagyon nem szeretem a 2003 utáni verziókat:-(
Ebben nagyon konzervatív vagyok. Még mindig a 2003-assal dolgozom. (Csak végső esetben, ha majd jövőre beszűntetik ennek is a támogatását az XP-vel együtt - ha jól tudom - akkor fogok áttérni). De hát a tömbfüggvényt a 2003-as is ismeri.
Viszont a kérdésed után kipróbáltam egy masik gépemen 2007-es változat alatt, és ott működik. Akkor most már csak azt kell tisztáznom magammal, hogy a két verzió közti különbség okozza-e a hibát, vagy az asztali gépemen a 2003-as valamelyik beállítása okoz gondot.
Azt hittem így már egyszerűbb lesz, de ahogy az lenni szokott, tévedtem! A makró amit küldtél tökéletesen működik le a kalappal! Úgy gondoltam, hogy ha mégegyszer bemásolom a makrót, de módosítom a célokat, úgy frankón működni fog ugyanazon a lapon! Hát nem! Szóval az amire kellett, hogy az adatokat egy másik munkalapról áthozza hivatkozással együtt, az működik, de én ugyanezen a lapon szeretném ezt még egyszer alkalmazni, csak más célterületre!
Jelenleg: A D oszlopban változtatok, és a hozzá tartozó dokumentum megjelenik a H oszlopban!
Viszont nekem szükségem lenne arra, hogy a C oszlopban amit kiválasztok, az ahhoz tartozó dokumentumot ugyanúgy áthozza a másik "ADAT" munkalapról a G oszlopba!
Ha a makrót bemásolom, akkor a keres kifejezésre hibát dob ki, de valószínűleg, ha ezt orvosolnám, akkor jönnének a többi hibák is! Van megoldása ennek! Ha igen, akkor milyen infora lenne szükség a segítségben?
De valami egyéb hiba kell, hogy legyen nálam. Ha az A és F oszlopokba számokat írok, és ehhez kötöm a tömbfüggvényt pl.: =MAX(HA(F:F=2;A:A)), akkor is #SZÁM! az egyes cellák értéke.
Köszönöm. Ha jól értem, arra gondolsz, hogy - tekintettel arra, hogy az F oszlopnak csak az első 7 sorát töltöttem ki - csak az első 7 sorba írjam a tömbfüggvényt?
Kipróbáltam így is, sajnos változatlan eredménnyel. Kipróbáltam úgy is, hogy egy munkalapon csak az első néhány sort töltöttem ki, a tömbfüggvény nekem így sem működik a mintapéldámban megadott szerkezetű adatokkal:-(
Köszi, működik, még pluszba kért egy End If sort, de végül is összejött! A baj az, hogy így az előző dátumbeíráshoz használt makró csak akkor írja ki a dátumot, ha a cél mezőbe szerkesztek! Eddig úgy zajlott, hogy a soron belül bárhol változtatok, a dátum azonnal beíródik! Ahhoz is használok modul-t és thisworkbook-ot
Ez a munka1 makrója:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) Dim sorBeir As Integer, nev 'helyfoglalás a változókhoz If Target.Column = 4 Then 'ha a bevitel oszlopa a B, akkor nev = Target.Value 'a nev válztozó vegye fel a kiválasztott értéket sorBeir = Target.Row 'a sorBeir változó vegye fel a beírás sorának a számát Keres nev, sorBeir 'Meghívjuk a Keres makrót, átadva a nev és sorBeir változók aktuális értékét If Target.Count > 1 Then _ MsgBox "Ha több cellát szerkesztesz egyszerre, nem működik.": Exit Sub If Target.Column > 1 Then Call AddDate_sh(Target.Row) With ActiveSheet If Application.WorksheetFunction.CountA(.Range(.Cells(Target.Row, "B"), _ .Cells(Target.Row, "G"))) = 0 Then Call RemoveDate_sh(Target.Row) End With
End If
End If
End Sub
Ez a ThisWorkbook:
Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call LockCells_sh
End Sub
Private Sub Workbook_Open()
Call LockCells_sh
End Sub
Ez a modul1 (az első makrómhoz):
Option Explicit
'made by RHCPgergo 'nagy.gergely1888@gmail.com
Sub LockCells_sh()
Dim Rng As Range
With Munka1 .Unprotect "jelszavam" .Cells.Locked = False For Each Rng In .Range("A1:A30") If Rng.Value <> "" Then Rng.EntireRow.Locked = True Next Rng .EnableSelection = xlUnlockedCells .Protect "jelszavam", UserInterfaceOnly:=True End With
End Sub
Sub UnProtect_sh() ActiveSheet.Unprotect "jelszavam" End Sub
Sub AddDate_sh(MyRow As Long) Munka1.Range("A" & MyRow).Value = Now Columns(1).AutoFit End Sub
Sub RemoveDate_sh(MyRow As Long) Munka1.Range("A" & MyRow).Value = "" End Sub
És ez, amit Te küldtél:
Sub Keres(nev, sorBeir) Dim sor As Integer sor = Application.WorksheetFunction.Match(nev, Sheets("Adatok").Columns(5), 0) 'Az Adat lap G oszlopában (6) meghatározza a nev változó sorát (a HOL.VAN függvény VBA-s megfelelője a Match) Sheets("Adatok").Range("E" & sor).Copy Sheets("Munka1").Range("H" & sorBeir) 'másolás End Sub
Köszi. Annyira nem érdekes, mert egy külön oszlopban van egy sorszám azonosítója, az alapján tudok szűrni. Csak ugyebár a sorszámból nem látom, hogy az mit takar. Emiatt lenne jobb a szöveg szerinti szűrés.
2007-es excelben megnyitva ugyenezt a munkafüzetet viszont nincs ilyen hiányosság. Nem tapasztalom, hogy 255 karakter lenne a korlát.
Elképzelni sem tudom mi a probléma nálad. Most újra teszteltem a képletet dátumokkal, normál számokkal, és működik. A dátumokat beírtam stringnek is, de akkor 0-t ad eredményül és nem #SZÁM! hibát. A képlettel mindenféle hibát (#érték!, #név!), elő tudtam idézni, de #szám!-ot azt nem. Tehát elképzelni sem tudom, hogy nálad mi okozhatta. Talán a dátumok számformátuma nem megfelelő. Próbáld ki a képletetet normál számokkal is, ha azokkal működik, akkor nagy valószínűséggel a dátumfomádat nem szereti. Ha nem, akkor valami excelbeállítási probléma lehet. Nálam a Lotus kompatibilitás szokott időnként nem várt eredményhez vezetni. Lehet hogy nálad is van valami extremítás. Ha nem boldogulsz, küldd el priviben, hagy nézzem meg én is.
És végül: Van egy olyan gyanúm, hogy valamit egészen másképp csinálsz mint kéne. Ezt abból gondolom, hogy ezt írod: "de valamennyi cellában #SZÁM! az érték, akár aktív, akár inaktív szó áll az F mezőben". Hol vannak ezek a valamennyicellák? Amikor összesen csak 1 cella értéke fűgg az F mezőbeli beírásoktól. A max képleté.
Akkor most egy pillanatra visszatérnék egy több mint 3 hete elhangzott megoldásogra, a tömbképletre. Djmorphy 22505-ös kérdésére az =Max(ha(F:F=äktiv";A:A)) képletet javasoltad megoldásnak tömbképletként beírva.
Érdekelt a dolog, kipróbáltam, és nekem semmiképp sem akar összejönni. A tömbképlet rendben megjelenik {=MAX(HA(F:F="aktív";A:A))}, de valamennyi cellában #SZÁM! az érték, akár aktív, akár inaktív szó áll az F mezőben. Az A oszlopban dátumok vannak 2013.01.01, 2013.01.02 stb. formában, az F oszopban aktív, vagy inaktív, ügyelve a hosszú 1-re.
Ha a függvényből a MAX() részt elhagyom, akkor is ugyanez az eredmény.
Vajon ez miért nem működött nálam. Akkor nem akartam rögtön megzavarni a dolog megoldását a kérdésemmel, de azért továbbra is érdekel.
Valamit azonban nem értek ennél az autoszűrőnél. A 255 karakternél hosszabb stringeket is illene szűrnie az 1-255 karakter alapján. De nem teszi. Miért? Úgy dereng az írányított szűrőnél nem volt ilyen probléma.
Benne van a VBA elején az Option utasítások között. Ugyanott van az Option Base is. Valamint a szöveghasonlító strcomp függvény magyarázata is hivatkozik rá.
Én sokkal izgalmasabbnak és újdonságnak találtam a magyar kettősbetűk ügyét.
Az autószűrőnek van korlátja. 255 karaktert képes szűrni. (excel 2007)
Ha ennél hosszabb szövegeket akarsz szűrni, használd a special (írányított) szűrőt. Annak is van korlátja, de lényegesen magasabb. Hogy mennyi, arra nem emlékszem, de sok, több mint ezer. Arra viszont emlékszem, hogy nekem még annak a korlátját is túl lépve kellett szűrnöm (excel 2003-mal). meg is oldottam. De József feltett ide a fórumra egy az enyéménél elegánsabb megoldást, ami szintén többezres stringeket volt képes szűrni. De megtalálni...... Talán ha olvassa, kedve lesz újra ismertetni. Ha nem és szűkséges lesz, megírhatom az én módszeremet.
Ja és elfelejtettem itt a táblázatba betenni az összetett magyar betűket, de kipróbáltam, és az opció alkalmazásával azokat is a magyar ABC szerint rendezi, ahogy ezt megírtad.
Megtaláltam a megoldást a VBA-ban. Ha a modul elején elhelyezzük az Option Compare Text utasítást, akkor az adott nyelvi beállításokat veszi figyelembe. Ki is próbáltam ezt, és az alábbi táblázatban szedtem össze az eredmények közti különbséget:
Option Compare Text
nélkül rendezve Option Compare Text használatával rendezve
Az Az
Er az
Iz Áz
Ok áz
Ut Er
az er
er Ér
iz ér
ok Iz
ut iz
Áz Íz
Ér íz
Íz Ok
Ók ok
Ön Ók
Út ók
Üt Ön
áz ön
ér Őn
íz őn
ók Ut
ön ut
út Út
üt út
Őn Üt
őn üt
Űt Űt
űt űt
Ez kicsit csúnyácska lett, de a lényeg látszik. Tehát az opció nélkül lefuttatva a nagybetűk előre kerültek, az á, é, í ó, ö, ú és ü utánuk, ezen belül is a nagy-, majd a kisbetűk, aztán az Ő és ő végül az ű és Ű. Az opció használatával csak a nagybetűk kerülnek a saját kisbetűs párjuk elé.
2002-es Excelben autószűrőt használok a mukalap oszlopaira. Az egyik oszlop celláiban (20 cella kb) elég sok szöveg van, van közte egyforma is és van különböző tartalmú is, kb 14 fajta van. A fönti szűrő gomb lenyílásakor azonban csak 6 szűrési lehetőség jelenik meg. Létezik, hogy van valami karakterbeli korlát? És emiatt nem listázza a többit?
Két makró szükséges hozzá. Az elsőt a Munka1 lapodhoz kell rendelned (ahogy az előzőnél).
Private Sub Worksheet_Change(ByVal Target As Range) Dim sorBeir As Integer, nev 'helyfoglalás a változókhoz If Target.Column = 2 Then 'ha a bevitel oszlopa a B, akkor nev = Target.Value 'a nev válztozó vegye fel a kiválasztott értéket sorBeir = Target.Row 'a sorBeir változó vegye fel a beírás sorának a számát Keres nev, sorBeir 'Meghívjuk a Keres makrót, átadva a nev és sorBeir változók aktuális értékét End If End Sub
A másodikat modulba tedd. VB szerkesztőben Insert | Module. A kapott üres lapra másold be:
Sub Keres(nev, sorBeir) Dim sor As Integer sor = Application.WorksheetFunction.Match(nev, Sheets("Adat").Columns(6), 0) 'Az Adat lap G oszlopában (6) meghatározza a nev változó sorát (a HOL.VAN függvény VBA-s megfelelője a Match) Sheets("Adat").Range("G" & sor).Copy Sheets("Munka1").Range("G" & sorBeir) 'másolás End Sub
Az első figyeli a Munka1 lapon történt változásokat. Mikor a B oszlopban kiválasztasz egy adatot az érvényesítésből, akkor a változás értékét (a megadott adatot), és a változtatás sorát átadja a modulba írt makrónak. Erre azért van szükség, mert az egyes lapokhoz rendelt makrók csk a saját lapjukon tudnak dolgozni.
SK! Megemelem elötted a kalapom. A munkafüzeten alkalmazott < reláció a magyar abc szerinti müködik, míg a vba-é az angol szerint. Amint az a berakott táblázaton is látható, csak a magyar kettős betüknél borult a reláció. Nagy meglátás volt! Elismerésem.
(A táblázat elég nagy, ha a fórummotor nem fogadná felteszem egy elérhető tárhelyre)
A függvényként való működtetésnél egyszerűen a tömb nevét adom át paraméterként:
Dim tömb(elemszám) ' vagy ReDim tömb(elemszám)
' tömb feltöltés
Call quicksort(tömb)
A stringgel kapcsolatos hiba okára nincs ötletem. Én is megnéztem, és nálam is jó volt a sorrend, de ellenőrzéskor hibásnak jelezte az Excel az általad megadott párokat.
Viszont, amikor kipróbáltam ezek rendezését, és találtam egy hibát a programban. Ugyanis az elmúlt évtizedekben eddig kizárólag számokkal használtam az algoritmust, így két változót hibásan numerikusnak (Double) deklaráltam Variant helyett. Az érintett sor helyesen: Dim aktelem As Variant, segédvált As Variant. De ezt Te nyilván korrigáltad, hiszen lefutott nálad a program a stringekkel.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim sor As Integer If Target.Column = 4 Then sor = Application.WorksheetFunction.Match(Target, Columns(8), 0) Cells(sor, 9).Copy Cells(Target.Row, 4) End If End Sub
Megpróbáltam, töröltem a Selection-t, beírtam a lapnevet, de nem történik semmi! A Munka1 fülön a G oszlopba kellene, hogy betegye a másolatot az Adat fül G oszlopából! Egyébként a Munka1 fül C oszlopában listázom ki az Adat fül F oszlop adatait, amiből választok!
Egy részletes magyarázatot tudnál adni a kód sorairól, hogy ha itt és itt változtatok, akkor mi történik, csak, hogy több helyen is tudjam ezt alkalmazni, és a jelenlegi funkciójára is rá tudjam bírni?
KöszönömDelila10a kódot! Működik bár nem teljesen úgy, ahogy szeretném mert a B oszlopba, ha üres mezőre kattintok, hogy kilistázza választási lehetőséget, hibát ír ki! Ezt ki lehet valahogy küszöbölni? Úgy működik az egész, hogy a B oszlopban kilistázza a tételt én kiválasztom az egyiket és a D sorban a hozzá rendelt ajánlat megjelenik. Jelenleg a hibánál, ha a stopra kattintok, majd újra a cellára, úgy már megjelenik az amire szükségem van! Még egy kérdés: Mivel ez a táblázat, amikről a képeket készítem csak szemléltetésnek van így a valós táblázatom nem teljesen így nézne ki! Meg lehet ezzel a kóddal (valamelyik sor/sorok módosításával) azt oldani, hogy a cellákat egy másik munkafüzet lapjáról másolja be?
Bocsánat, ez valószínűleg nem az Excel verziójától függ ilyenkor (főleg makróban), hanem a locale beállításaitól. Mi van, ha a vezérlőpultban full angolra állítasz minden nyelvi-területi beállítást?
Próbáld ki angol Excellel is. Az a vakmerő elképzelésem támadt, hogy esetleg a te verziód felismeri a mindegyik párban látható kétjegyű magyar mássalhangzókat, de valamiért az ábécé végére sorolja.
Úgy néz ki igazad van. Az 5000 tripletpárból 35-nél a bináris és a szöveges összehasonlítás valószinűleg eltérő eredményt ad. De most mennyivel vagyunk előbbre azzal, hogy ezt megállapítottuk? Gyakorlatilag semmivel. Mert ettől még teljesen érthetetlen, hogy ezeknél a textuális miért ad más eredményt mint a normális bináris? A többi meg a helyes relációt mutatja, mind textuálisan, mind binárisan.
Egyáltalán: mi az hogy bináris és mi az hogy szöveges összehasonlítás. A vbUse CompareOption-ról már nem is beszélve, mert azt meg nem is volt hajlandó végrehajtani.
A CSX-CTA triplet párt vizsgálva az derült ki, hogy a CS párosítás gázos. Ugyanis a CS nem csak a CT-nél nagyobb, de T utáni többi betűs párosításnál is (lásd az ábrát). És ilyen gázos stringpárból még 34 akadt, de a résztvevő karakterek gyakoriságából semmi féle tendencia nem rajzolódik ki.
A gázos tripletpárokat felraktam a data.hu-ra. Hátha valakinek mondanak valamit.
Ott kezdeném, hogy már a buborékkal is nagyon meg voltam elégedve, mert még az 1000 elemű tömböt is 1 mp alatt sorbarendezte. A 10.000 elemü tesztömböt már észrevehetően lassabban, 14 mp alatt. (Megjegyzem, sok esetben még ez is elfogadható.)
A quicksortod azonban itt már mellbevágóan gyorsabb volt. 1 mp-n belül abszolválta a 10.000 string sorbarendezését. Szóval ismételten gratulálok. Majd tanulmányozom, hogy miként és hogyan müködik.
Annyiban azonban segítsél légyszí, hogy hogyan kell függvényként müködtetni. Mert úgy nem tudtam. Ezért a teszthez átírtam subrutinnak. De érdekelne, hogyan használod függvényként. Honnan töltödik fel az adattömb, melyik parancs írja ki a munkalapra, ha egyáltalán vmi kiírja???
És végül egy rejtély. Lecsekkoltam a sorbarendezést, hogy hibamentes-e. ÉS a legnagyobb meglepetésemre 35 esetben Hamis-nak jelezte a következő>előző relációt. Megnéztem egy párat, de azok mind megfeleltek az abc szerinti sorbarendezésnek. Az excel azonban valamiért kisebbnek látta a következőt mint az előzőt. Ide teszek pár ilyet:
CSX-CTA, CZS-CZV, DDZ-DEK
Ezeknél miért látja az excel a másodikat kisebbnek? Van valakinek vmi ötlete?
Az excellel lehet valami gubanc, és nem az ÉN excelemmel, mert megnéztem egy másik gépen is, excel 2003-mal. De az is hibásnak jelezte a nagyobb relációt ezeknél triplet pároknál. Nagybetűsen is, kisbetűsen is.
A lapodhoz kell rendelned a makrót. Lapfülön jobb klikk, kód megjelenítése. Bejutottál a VB szerkesztőbe. A jobb oldali üres mezőbe másold be.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim sor As Integer If Target.Column = 2 Then sor = Application.WorksheetFunction.Match(Target, Columns(8), 0) Cells(sor, 9).Copy Cells(Target.Row, 4) End If End Sub
Mikor a B oszlopban rákattintasz egy termékre, a D oszlopba beírja a hivatkozását.
A terméket listázva érvényesítéssel a H oszlopból veszem, az I oszlopban pedig a .doc file-ok hivatkozásai vannak, amiket szeretnék megjeleníteni a termék kiválasztásakor a D oszlopban
Az algoritmus szerintem pár perces munkával megírható excel makróban.
Ha az eredmény nem lenne elegendően gyors, akkor esetleg meg tudok írni egy programot a quicksort algoritmussal, amelyik nagyságrendekkel kevesebb lépésből rendez. Csak az kicsit összetettebb.
Számomra nem derül ki, hogy a termékeknek az árát, vagy darabszámát kell összegezned. Ettől a feltételtől függően a darabhatöbb, vagy a szumhatöbb függvényeket nézd meg.
Sziasztok!Megint segítséget szeretnék kérni. Azt hittem most menni fog de mégis feladta a leckét :D A oszlopban 201300001-től sorfolytonosan növekvő számok vannak. B oszlopban pedig van egy dátum(mikor scannelték be).Az a lényeg hogy kapok egy papírt hogy 201300001-től 201300020-ig A termék 20 és 50 között B termék 51 és 78 között A termék stb. Ezt kellene szummáznom termékenként.Hogy lehetne ezt megvalósítani? Valami olyasmibe gondolkozok hogy a C oszlopba írja, hogy "A termék", "B termék" mert azt már tudom szummázni. Fkeressel akartam de az nem jó erre szerintem. Milyen irányba kellene keresgélnem?
Szóval azt szeretném elérni, hogy a "B" oszlopban a termék kiválasztásakor a "D" oszlopban megjelenjen a hozzá tartozó hivatkozás! Ebben kérném a segítséget! FKERES megoldást használok jelenleg! Köszi a segítséget!
Sziasztok! Felvettem egy másik munkalapra, 2 egymás melletti oszlobba tettem az értékeket, de az egyik oszlopban hivatkozások vannak, amiket szeretnék kiválasztani /.doc/! FKERES fügvénnyel viszont csak a hivatkozás nevét tudom megjeleníteni ami így nekem nem jó! Hogyan tudnám megtenni azt, hogy a hivatkozással együtt beillessze az adott cellába?
Az excel mindig megjegyzi az utolsó select celláját/celláit és oda pozicionál, ha a lapra lépsz. Ez nem változóban van, az excel sajátossága. Úgy tudod megváltoztatni, hogy újabb cellát jelölsz ki, amire a select utasítás szolgál. Nem azt írtuk, hogy soha nem lehet a selectet használni, csak azt, hogy feleslegesen nem szabad.
A munkalap utolsó sorát többféleképpen is megtalálhatod. Én többnyire ezt szoktam használni az utolsó üres cella megtalálására:
range("A65000").end(xlup).select az aktív munkalap A oszlopának utolsó nem üres cellájára viszi a cursort és az látszik az ablakban.
A select utasítás csak az aktív munkalapon működik.
Közben megtaláltam a megoldást. Megfelelő helyen bekapcsoltam a képernyő frissitést és a kivánt cellába pozicionáltam. Ezután minden tábla betöltesekor a tábla vége látható a képernyő közepén.
A probléma okát megtaláltam, csak a kiküszöbölését nem.
Egy korábbi fázisban kiadtam a következő parancsot:
Selection.SpecialCells(xlCellTypeLastCell).Select
Ez rendben is van csak, hogy a megtalált sort valamilyen VBA változóban megjegyzi ezért minden egyes áttöltés után a lapot oda pozicionálja. Na ezt az előttem ismeretlen változók kellene átírni egy általam definiált sorszámra.
Újra itt! Remélem túlzottan nem fárasztalak le titeket, de a segítségre szükségem van! Melléletben szereplő dolgot szeretném úgy megcsinálni, hogy az "A" oszlopban egy listából kiválasztom mondjuk az "almá"-t, és ahogy ezt megtettem, a "D" oszlopban egyből megjelenjen az ára! Szóval valahogy összerendelni a két dolgot! Hogyan tudnám ezt elérni?
Nekem azt hiszem, elég lesz, ha csak a beágyazott makrót küldöd el, illetve a meghívás előtti és a meghívás utáni sort. A konkrétumokat maszkold ki benne (pl. amit keresel, csak jelezd).
Köszi! Nem tudtam, hogy hol kell, de már megvan! Elkezdtem újra csinálni az egészet, de be is fejeztem, mert így sikerült szerkeszthetővé tennem! Köszi!
bocsánat, igazad van! Nem xlsx, hanem xlsm a kiterjesztése, de sajnos nem tudom újra szerkeszteni, vagyis tovább folytatni benne a munkát! Csak az eddig beállított dolgokat tudom elvégezni benne
Sikerültek a műveletek, pl: csak választani lehet a listából és beírni nem, és makróval megoldani a dátumkiírást! El is mentettem egy xlsx formátumba, ami makróbarát, de most hogy megnyitnám és szerkeszteném tovább, nem enged semmit se csinálni! Vagyis csak nagyon kevés funkciót! Ez miért van? Pedig még nincs levédve sem! Jó lenne, mert nem szeretném, hogy elvesszenek a dolgok! Please, somebody help meeee! :)
Kösz a választ! Amiből számomra igazolódott, hogy sajnos a stringek abc-be rendezése nem oldható meg a munkafüzet használata nélkül. Pedig reméltem, hogy lesz valamiféle munkafüzet nélküli megoldás a Novekvo és a Csokkeno tömbök létrehozására, hasonlatosan a numerikus adatokhoz, amelyeknél ez elérhető a large és small parancsokkal.
Lehet, hogy nem erre a megoldásra számítasz. A makrót régebben Micu írta a Prog.hu-n.
Az A1:A10 tartományt beviszi az eredeti tömbbe. Rendezéssel előállít egy novekvo, és egy csokkeno tömböt, amiknek az egyes tagjait le lehet kérdezni, ki lehet íratni. A tartományba az eredeti tömböt írja vissza.
Sub tömb_rendez() eredeti = Application.Transpose(Range("A1:A10"))
Na most olvasgatok a kapott linkről és pár oldalt a makrók használatáról! Úgyhogy egy kicsit lépek! Köszönöm a segítséget, adtál sok kiindulópontot, hogy miket is keressek, hogyan is álljon össze a dolog! Ha megakadnék, jelentkezni fogok! Sokat kell még tanulnom asszem :D Köszi mégegyszer!
Megcsináltam egy új munkafüzeten, de ugyanaz a probléma! Valahogy levédted? Mert ugyan azt megpróbáltam, amit Te. Nálam engedi a választást és az írást is, míg nálad csak választani lehet! Valahogyan át lehet másolni a dátumos oszlopot a makróiddal együtt az én munkafüzetembe, hogy működjön is?
Az lenne a kérdésem, hogy lehet-e egy egydimenziós vba-tömbben levő stringeket abc sorrendbe rendezni? Ha igen, hogyan? Nekem az is jó lenne, ha a sorbarendezés egy másik tömbbe történne.
Az első sikerült. Sajnos a 2.-nál listából tudok választani, de ha akarok, akár beírni is tudok bármit! A 3. : Igen, azt a dátumot akarom, amikor a sort szerkesztették és utána már, ha mentve van, ne lehessen szerkeszteni!
Találkoztam hasonló táblázattal, ami korlátozta a felhasználók jogait! PL: én csak egy adott listából tudtam választani, ki is töltöttem a sorokat, majd el is mentettem! Miután újra beléptem az általam kitöltött sort már nem tudtam szerkeszteni, de az, aki csinálta a táblázatot, tudta! Szóval az én hozzáférésem korlátozva volt! Szeretném valami ilyesformán megcsinálni és ki is próbálni!
1: Hogyan tudom azt megcsinálni, hogy csak egy adott mennyiségű oszlop legyen látható? 2: Tegnap sikerült RHCPgergosegítségével listázni az adatérvényesítéssel, de szeretném azt is megcsinálni, hogy csakis a listából lehessen választani, mást beírni ne lehessen! Próbáltam ilyen-olyan védelemmel ellátni az adott oszlopokat, de nem sikerült! 3: Az egyik oszlopot dátum mutatására szeretném használni! Szóval azt ne lehessen módosítani, szeretném, hogy a sor kitöltésével automatikusan kitöltse az adott dátummal! Szóval, ha a sort elkezdem kitölteni, a dátum oszlop azonos sorában megjelenjen a dátum! Bár ezt nem hiszem hogy meg lehet csinálni, de hátha!
Remélem jól leírtam a kérdéseket, amúgy 2007-es verzsönt használok, ha számít!
Áttöltés után kézzel dolgozik az illető ezért kell a tábla végére menni vagy kézzel, vagy automatikusan. Ez csak egy kényelmi ok és nem funkcionális azaz a program működését nme érinti. A megirt programjaimnál mindig ügyelek arra, hogy minél kevesebbet kelljen klikkelni, keresgélni azaz a program kínálja magát. Manapság ezt kicsit bombasztikusan felhasználói élménynek nevezik. Mindig abból indulok ki, hogy a számítógépet nem ismerőknek is tudnia kell kezelni.
Sub torlo() Dim c As Range With Columns(1) Set c = .Find(what:="xy", LookIn:=xlValues, lookat:=xlWhole/xlPart) If Not c Is Nothing Then Do c.EntireRow.Delete Set c = .FindNext Loop While Not c Is Nothing End If End With End Sub
Egy kis magyarázat hozzá: lookat paraméter azt mondja meg, hogy teljesen egyeznie kell a cellában a szövegnek, vagy csak részben. Ha csak részben, akkor xlPart. Ekkor minden olyan sort kitöröl, ahol xy előfordul a cellában valahol.
Fontos, hogy makró legyen? Egszerű szűréssel is egjelenítheted azokat a sorokat, ahol egy oszlop cellái bizonyos szöveget tartalmaznak, majd az egészet kijelölve törölheted.
1. autofilter bekapcsolása 2. az A oszlopnál custom szűrés (contains "xy") 3. sorok kijelölése, egész sor törlése
Makrót se lenne olyan nehéz írni, de így egyszerűbb, ha csak egyszer kell megcsinálánod.
Egy olyan makróra lenne szükségem, ami megkeresne egy adott szöveget "xy" az első oszlopban, és miután megtalálta annak a sorát kitörölné, majd tovább keresne az A oszlopban ugyanarra a kifejezésre, addig amig az összes sort ki nem törölte azzal a szöveggel.
Kösz! Múködik. De lenne 2 kérdésem: Miért kell a transpose? Ugyanis ha kiiktatom az Option Explicitet ami szükséges a makródhoz, akkor beolvassa a ranget anélkül is. Másrészt meg itt mit transzponál?
Ami neked kell az a "Data Validation" avagy adatérvényesítés. Ha ezt használod, be lehet állítani, hogy egy adott cella (vagy tartomány) csak egy lista értékeit vehesse fel. Nem ablakban ugrik fel, hanem lenyíló listából lehet választani.
1. jelöld ki azt a cellát/tartományt, ahol be akarod kapcsolni az adatérvényesítést
2. data / data validation (valami ilyesmi, csak angol 2003-as excelben tudom)
3. válaszd ki, hogy listából akarod, itt meg lehet adni, hogy az a lista hol van
4. OK
Kb. ennyi, itt van egy részletesebb magyar leírás:
A beírás korlátozását az Adatok->Érvényesítés menüpontban tudod elvégezni. Itt beállítod, hogy megengedve lista. Forrásnak csak azonos munkafüzetben levő adatokra hivatkozhatsz, de az adatok lehetnek másik munkalapon. A listát elnevezed, pl gyümölcsök.
Akkor a forrásban hivatkozhatsz így: =gyümölcsök.
Akár az egész oszlopot is kijelölheted érvényesítésre, akkor minden egyes cellára igaz lesz az, hogy csak a megadott értékek közül lehet választani.
Megpróbálom egy kicsit átfogalmazni a kérdésem, bár lehet hogy a válasz egyszerű, de mint mondtam, még kezdő vagyok! :)
Adott egy munkafüzet melyben az A oszlop soraiban ezek szerepelnek:
Alma Körte Banán Narancs
...és adott egy másik munkafüzet, ahol ha rákattintok az A oszlop bármelyik sorára, egy lista jelenik meg (Alma, Körte, Banán, Narancs) és csak ezek közül tudok választani, szóval mást beírni nem rudok!
Hogyan tudnám ezt megcsinálni? Ismétlem kezdő vagyok ezért kicsit a szájbarágósság segítene! Ha valakinek van erre kis ideje és segítene, annak nagyon hálás lennék!
Az első azért akad ki, mert egy statikus tömböt hozol létre, amihez egy lépésben nem lehet hozzárendelni egy Range objektumot - ha jól tudom. Amikor egy dinamikus tömbhöz rendelsz Range-et, akkor egy kétdimenziós tömb jön létre. Még akkor is, ha egy egy oszlopot vagy sort (ekkor az egyik dimenzió értéke mindig 1 lesz).
A második makróban dinamikus tömbként deklarálod a H() változót. Hiába a Redim, ez akkor is fel fogja venni bármilyen Range tartomány értékét.
A harmadik makróban egyenként adsz értéket egy egydimenziós statikus tömb elemeinek, ez működik.
@ Delila 22782 Ha kikommenteled azt a sort, ahol a változót hozod létre, akkor a következő sor:
tmb = Application.transpose(Range("h11:h19"))
fogja létrehozni a tmb változót Variantként - ami ugye bármi lehet - és ehhez is lehet bármilyen Range-et hozzárendelni. A transpose-ra nem is lenne szükség, ez is simán működne:
Sub tmbinput1() 'Dim tmb(8) tmb = Application.Range("h11:h19") End Sub
Ok, persze, ha végignézed a történetet, én is ezt javasoltam neki (scrollrow). A magyarázat is alapvetően nem neked szólt, csak kifejtettem a "tömörebb" megjegyzésedet.
Még nagyon kezdő vagyok az excel-ben és érdekel, ezért itthon próbálkozom! Lehet többször is teszek majd fel kérdéseket, persze csak akkor, ha nem gond!
Szóval a mai napi: Van egy munkalapom ahol szeretnék egy oszlopot úgy kialakítani, hogy a sorait ne szerkeszteni lehessen hanem rákattintva egy adott listát dob ki, amit egy másik munkalapon készítek el és csak ebből lehet kiválasztani az adott sor tartalmát!
PL: Munkalap1 / A3 ra katt és ott a választási lehetőségem 1, 5, 15, 55, stb... ! Munkalap2-őn az a oszlop számai ezek! Szóval semmi mást ne lehessen bevinni, csak az adott számokat! Van ilyenre lehetőségem?
Lenne egy fogós kérdésem: Az alábbi 3 makró közül a tmbinput1 miért akad ki "Can't assign to array" hibaüzenettel, amikor a többi meg tök normálisan lefut?
Sub tmbinput1() 'KIAKAD Dim tmb(8) tmb = Application.Range("h11:h19")
End Sub
Sub tmbinput2() 'OK Dim H() ReDim H(8) H = Application.Range("h11:h19") End Sub
Sub tmbinput3() 'OK
Dim H(8), k
For k = 0 To 8 H(k) = Range("h11").Offset(k, 0) Next k
Azt jelenti, hogy most az áttöltést után a tábla elsősorától látszik a táblázat már pedig normál szituációban a tábla végén folytatódik a munka ezért a betöltés után manuálisan scrollozni kell. Apró, bosszantó kényelmetlenség.
A tábla vége megtalálására a Te módszered jó.
Most a javitás után egy kicsit megbolondult és nem mindig pozicionál a tábla végére. Majd holnap végig bogarászom miért tesz ezt.
- Azt mondod, ez egy leegyszerűsített kód, ami nyilván azt jelenti, hogy nem látjuk a lényegi funkciót. Ha látnánk, akkor talán tudnánk egyszerűbb, jobb módszert javasolni, így azonban csak az eredetileg megkezdett irányba tartó utat tudjuk kiegyenesíteni. Ha az eleve rossz, úgy is marad, hiába igyekszünk.
- Elhangzott itt már több megoldásféle, amiket én nem próbáltam, de a beküldők bizonyára igen, és valószínűleg működnek. Ezért nekem most nem az a célom, hogy elmondjam a tuti módszert, hanem csak két hibás gyakorlatra hívnám fel a figyelmed.
Az egyik ez:
Range(c.Address).Select
Helyette így kellene (ha már szelektálni akarsz):
c.Select
Mert ugye a Select ebben az esetben a Range típusú objektum metódusa, tehát direktben ki lehet adni. A Te verziód először előállítja a c tartomány címét, aztán azt konvertálja vissza tartománnyá. Olyan, mintha egy számot először megszoroznál 6-tal, aztán elosztanád 2-vel, aztán elosztanád 3-mal, hogy elvégezhesd rajta a tulajdonképpeni műveletet.
A másik a Select használata, ami az esetek döntő többségében tök fölösleges, csak mindenki azért használja, mert a makrórögzítőből ez jön ki. (Ahogy Fferi is mondta.)
Valójában a Select használata pont olyan redundáns, mint a *6/2/3 a fenti példában. Aktiválsz egy cellát pusztán azért, hogy aztán az aktív cellán hajthass végre egy műveletet. Nem lenne egyszerűbb eleve az adott cellán végrehajtani azt a műveletet?
volna helyesebb, és beépítve az első észrevételemet, így volna a legjobb:
arrIndex(arrIndexAdress) = c.Row
Ismétlem, ez nem válasz a kérdésedre, hanem két kódolási típushibának a kijavítása.
A kérdésedre azt mondanám, hogy van a kódodban egy algoritmushiba is. A FindNext utasításnak közvetlenül a Loop While előtt kellene lennie. A jelenlegi formában az első találat feldolgozása kimarad, ehelyett rögtön ugrik a második találatra, és az elsőt csak akkor dolgozza fel, amikor újra megtalálta. Pedig akkor már nem kellene.
Bocsi a közbekotyogás miatt, de nem tömörebb, hanem egészen mást csinál.
smallscroll (metódus/method) az adott pozíciótól lép le,fel,jobbra,balra x egységet (sort, vagy oszlopot) - relatív a meghatározás, attól függ, honnan indulsz és a lépés nagyságát határozod meg az adott értékkel, ami akár negatív is lehet.
scrollrow, scrollcolumn (tulajdonság/property) konkrétan az adott sort, oszlopot helyezi az ablak legfelső sorába/bal oldalába, vagyis mindegy, hogy éppen hol van a pozíció az utasítás kiadásakor. (És vigyázni kell rá,hogy 0-nál nagyobb legyen a megadott érték.)
Hát igen, minden excell makróval foglalkozónak legelőször azt kellene megtanulni, hogyan távolítsa el a makrórögzítő select-jeit, mivel azok csak azért vannak benne, mert úgy van a természete megfogalmazva, hogy az objektumot először kijelöli selecttel.(Na meg a sok scroll is remek szokott lenni benne...)
De minden objektumra lehet közvetlenül hivatkozni, ráadásul az biztosan be is talál (már persze, ha nem írtam el a nevét...). Ezért én még az "activecell, activesheet, stb." hivatkozásokat is csak nagyon-nagyon módjával használom.
Set c = .Find("keresett string", LookIn:=xlValues,lookat:=xlwhole,searchdirection:=xlprevious)
Ez szerintem a legutolsó előfordulást fogja adni, és nem kell hozzá ciklus sem - ha nem akarod megszámolni, hányszor fordul elő.
(A lookat paramétert azért érdemes megadni mindig, mert egyébként megőrzi az előző értékét. Tehát, ha csak szövegrészletet keresel akkor =xlpart, egyébként =xlwhole.)
A probléma miatt a cursor mindig az elsősorban van ezért van az, hogy smallscroll igy paraméterezve hibátlanul működik. Ez a megoldás azonban a jelenség megkerülését jelenti. A probléma okát már kezdem sejteni.
Leegyszerűsítve a következő folyamat után van ez a gond:
With Sheets("sheet").Range("A1:A65000") Set c = .Find("keresett string", LookIn:=xlValues) If Not c Is Nothing Then 'elso sor keresese firstAddress = c.Address Range(c.Address).Select Do 'tovabbi sorkereses Set c = .FindNext(c) Range(c.Address).Select arrIndex(arrIndexAdress) = ActiveCell.Row Loop While Not c Is Nothing And c.Address <> firstAddress End If
A "do" ciklusban az utolsó találat ujra az első sor ezért a pozicionálás is ide történik. Ha ezt megtudnám akadályozni akkor nem lenne szükség erre a hókusz pókuszra és azonnal az utolsó sorra pozicionálna
Mivel az excel sorainak száma 1-től kezdődik, így természetesen negatív számú sorra nem tud rápozicionálni a scrollrow. Ez komoly hibája, ezért nekünk kell erre figyelni, pl. így:
Activewindow.scrollrow=iif(arrIndexMax - 25<1,activewindow.scrollrow de ide írhatod ezt is: 1,arrIndexMax - 25)
Ebben az esetben vagy marad az ablak tetején az a sor, ami eredetileg is volt, vagy az első sor kerül oda, attól függően, mit írtál középre.
A smallscroll ezek szerint "intelligensebb", tudja kezelni, hogy negatívba nem viszi a sorszámot, hanem marad az első sorban.
Kipróbáltad amit azzal kapcsolatban írtam? (Nyilván a 25 sor az elméleti, az a kérdés, mennyi látszik az ablakodban.) De nézd meg nagyított nézetnél is lsz (amikor az ablakban pl. 10-12 sor látszik csak).
Valószínű, hogy amikor behívod a táblázatot, akkor az első sor kerül az ablak legfelső részébe, ezért múködik a smallscroll jónak tűnően.
Mégegyszer hangsúlyozom, a fontos különbség, hogy a smallscroll relatív - az aktuális helytől számol, a scrollrow pedig abszolut, konkrétan megadott sort ugratja az ablak tetejére.
Nem pontos ez így. A megadott változó az utolsó sor sorszámáta daja meg amiből visszaszámol 25-öt. Nagyobb táblázatnál mindig a megjelenített sorok közül az utolsó 25-öt mutatja míg 25 sornál kisebbnél csak annyit amennyi van. Hibát nem hoz.
Még annyit az előzőekhez: Te nem 25 sorral a táblázat vége előttre pozicionáltál, hanem a srollozandó sorok számát állapítottad meg a táblázat vége - 25 sorban. Így pl. 100 soros táblázatnál a scroll mértéke 75 sor lesz.
Ez akkor működik úgy, ahogyan szeretnéd, ha max a 25. sorban áll a cursorod. Ha viszont a 25-dik sornál lejjebb vagy, azt fogod tapasztalni, hogy "eltűnik" a táblázat, mert akkorát scrollozik az utasításod.
Igen, csak a smallscroll-nak és a scrollrow-nak más-más a funkciója:
A smallscroll egy metódus és görgeti az ablakot abba az irányba amerre akarod és olyan lépéssel, amekkorával akarod, onnan ahol éppen állsz.
A scrollrow (és scrollcolumn) egy tulajdonság, ami megmondja, hogy hányadik sor/oszlop legyen a bal felső szélén az ablaknak. Azaz itt direktben megadhatod, hova "scrollozzon" a képernyő, melyik legyen az első sor, vagy első oszlop amelyik látszik.
Amit a 22751-ben megadtam az a "arrIndexMax" a táblázat utolsó sora amihez képes 25 sorral vissza pozicionáltam. Igy szépen látszik a táblázat vége és még marad néhány üres sor.
Próbáld ki az activewindow.scrollrow=táblázatvége sor -x utasítást.
A táblázatvége sor jelenti azt az utolsó sort, ameddig a táblázat tart (ezt neked kell megállapítanod!), az x pedig, ahány sort akarsz még látni a táblázatból. (Mert gondolom, nem csak a legutolsó sort szeretnéd látni.)
Nem tudom de tény, hogy mindig a táblázat elejét mutatta. Elegánsabb lett volna amikor a tábla áttöltődik (ugyanis más lapról érkezik szűrve) azonnal a végére ugrana és azt mutatná. Kistáblázatról van szó tehát a sebességet nem igen befolyásolja ez a módszer.
Ha a cursort ráállítom valamelyik távoli oszlopra, mondjuk BA-ra, majd az alsó gördítősávval visszahúzom a képernyőt a táblázat elejére, miközben a cursor marad a BA oszlopon, és így mentem, akkor pont az történik, amit írsz. Nem lehet, hogy nálad is ez történt?
Megnyitok egy táblázatot annak mindig az elejét látom miközben a végére kellene ugrania és azt látnom. Hiába próbálkozom cella cimzéssel, select utasítással. A cusor oda megy de a tábla nem ezért mindig scrolloznom kell.
Pedig a szűrés jó ötlet. Úgy emlékszem az autószűrő is tud több oszlopra a VAGY feltétlellel szűrni (azaz egyaránt kiszűrni az otthoni és az idegen oszlopbeli előfordulásokat), de most hogy keresem, nem találom ezt a lehetőséget. A Speciál szűrő (a 2003-ban Írányitott szűrő) azonban biztosan alkalmas erre. Amit egyaránt használhatsz helyben szűrésre vagy új helyre történőre. A trükkje, hogy kritérium tartomány 3 soros legyen. 1. Fejléc: otthon/idegen 2. A keresett csapat az otthoni oszlopban. 3. A keresett csapat az idegen oszlopban is. Ha ennyi kevés lenne, az excel súgója elég jól elmagyarázza.
Még annyit érdemes tudnod, hogy a kritérium cellákba nem muszáj a keresett teljes nevét beírni. Elég belőlük néhány egyedi betűsorozat 2 csillag között. Pl. *Liver*, *city* stb.
Mivel a csillagos beírás frankón működik, a belinkelt web táblázatból sem muszáj a otthoni és idegenbeli oszlopokat szekesztened, mert mérközésoszlopra rászűrve a ** közé írt csapatjelöléssel kiszűri neked az összes előfordulást. Persze ekkor a kritériumtartományt 2 sorosnak kell meghatároznod.
Azt szeretném kérdezni, hogy hogyan tudok egy olyan szűrést megcsinálni, ami kidobná x csapat eredményeit, mind a hazai, mind a vendég meccseket egyszerre, időrendei sorrendben.
Próbálkoztam úgy hogy táblázattá alakitottam és ott szűrés, de ott csak vagy a hazainál, vagy a vendégnél engedi meg a szűrést külön-külön, együtt nem. Esetleg vmilyen kereséses fügvvény alkalmazása, stb, nem tudom mi lehetne a megoldás.
Miután elküldtem a makrót, rájöttem, hogy sokkal praktikusabb lenne a beforesave makrót open-ként megadni és kiegészíteni a beirás makro subrutinnal. Így a filemegnyitáskor már rögtön bekéri a user nevét. Ha rossz nevet ad meg, akkor javíthat a beirás makró direkt indításával.
A beforesave makró átírva, a változtatások kivastagítva. A beirás makró változatlan.
Néztem a makródat, de már az első sorban elakdtam :))). Azt hogyan kell csinálni, hogy 3 nevet megadni egy érvényesítésben? Próbálgattam, de nem jöttem rá.
Szóval az alábbi 2 makróval oldottam meg. Mindkettőt az adott füzet ThisWorbook moduljába másold. A védett munkalap a Munka1, a védelmi jelszó xxx, a három felhasználó titkos nevei, pali, peti és poka, akik 3, 4, 5 oszlopokhoz férhetnek hozzá. A felsorolt beállításokat igazitsd a te lapodhoz. Miután megvan a makró, mentheted a füzetet. A fiúk amikor be akarnak írni, a beírás makrót indítsák. A kijelölt tartományba írhatnak.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Cells.Select Sheets("Munka1").Unprotect ("xxx") Selection.Locked = True Selection.FormulaHidden = False Sheets("Munka1").Protect ("xxx") End Sub
Sub beiras() Dim ppw, oszlopNo ppw = InputBox("Mi a titkos neved?") If ppw = "pali" Then oszlopNo = 3: GoTo cimke If ppw = "peti" Then oszlopNo = 4: GoTo cimke If ppw = "poka" Then oszlopNo = 5: GoTo cimke Exit Sub cimke: Sheets("Munka1").Unprotect ("xxx") Sheets("Munka1").Columns(oszlopNo).Select Selection.Locked = False Sheets("Munka1").Protect ("xxx") End Sub
Védett munkafüzet tartományai szerkesztésének engedélyezése egyes felhasználók számára
Fontos: Ha egyes felhasználóknak engedélyt szeretne adni a védett munkalap tartományainak szerkesztéséhez, Microsoft Windows XP vagy újabb operációs rendszert kell használnia, és a számítógépnek tartományba kell tartoznia. A tartomány használatát megkövetelő engedélyek helyett jelszót is megadhat valamely tartományhoz.
Jelölje ki a védelemmel ellátni kívánt munkalapot.
Kattintson a Korrektúra lap Változások csoportjában a Tartomány szerkesztésének engedélyezése gombra.
Megjegyzés: Ez a parancs csak akkor érhető el, ha a munkalap nem védett.
Az alábbi lehetőségek közül választhat:
Új szerkeszthető tartomány hozzáadásához kattintson a Megadás gombra.
Korábban megadott szerkeszthető tartomány módosításához jelölje ki a kívánt tartományt a Lapvédelemnél csak jelszóval módosítható tartományok listában, majd kattintson a Módosítás gombra.
Szerkeszthető tartomány törléséhez jelölje ki a kívánt tartományt a Lapvédelemnél csak jelszóval módosítható tartományok listában, majd kattintson a Törlés gombra.
Írja be a Cím mezőbe a zárolni kívánt tartomány nevét.
Írjon a Hivatkozás mezőbe egy egyenlőségjelet (=), majd a zárolni kívánt tartomány hivatkozását.
Tipp Másik lehetőségként kattintson a párbeszédpanelt összecsukó gombra, jelölje ki a munkalapon a tartományt, majd a teljes párbeszédpanel ismételt megjelenítéséhez újra kattintson a párbeszédpanelt összecsukó gombra.
Írja be a Tartományjelszó mezőbe azt a jelszót, amellyel majd hozzá lehet férni a tartományhoz.
Megjegyzés: Hozzáférési engedélyek használatakor nem kötelező jelszót megadni, de ha jelszót alkalmaz, megtekintheti, hogy a tartomány módosításához jogosultsággal rendelkező személyek milyen felhasználói hitelesítő adatokat használnak.
A hozzáférési engedélyek megadásához kattintson az Engedélyek, majd a Hozzáadás gombra.
Írja be az Írja be a kijelölendő objektumok nevét (példák) mezőbe azoknak a felhasználóknak a nevét, akiknek engedélyezni kívánja a tartományok szerkesztését.
Tipp Tájékoztatást kaphat arról, hogy hogyan kell megadni a felhasználóneveket, ha a példák hivatkozásra kattint. A megadott nevek helyességének ellenőrzéséhez kattintson a Névellenőrzés gombra.
Kattintson az OK gombra.
A kijelölt felhasználóhoz rendelendő engedély típusának megadásához jelölje be az Engedélyek mezőben az Engedélyezés vagy a Megtagadás jelölőnégyzetet (vagy törölje annak jelölését), és kattintson az Alkalmaz gombra.
Kattintson az OK gombra, majd a még nyitva lévő másik párbeszédpanel OK gombjára.
Tipp Kérés esetén írja be a megadott jelszót.
Kattintson a Tartomány szerkesztésének engedélyezése párbeszédpanelen a Lapvédelem gombra.
A Minden felhasználónak engedélyezve listában adja meg azokat az elemeket, amelyeket a felhasználók módosíthatnak.
Törlendő jelölőnégyzetMegakadályozandó felhasználói műveletZárolt cellák kijelölése Az egérmutató mozgatása olyan cellákhoz, melyeknél be van jelölve a Cellák formázása párbeszédpanel Védelem lapján a Zárolt jelölőnégyzet. A felhasználók alapértelmezés szerint kijelölhetik a zárolt cellákat.Nem zárolt cellák kijelölése Az egérmutató mozgatása olyan cellákhoz, melyeknél törölve van a Cellák formázása párbeszédpanel Védelem lapján a Zárolt jelölőnégyzet jelölése. A felhasználók alapértelmezés szerint kijelölhetik a nem zárolt cellákat, és a TAB billentyű lenyomásával lépegethetnek a nem zárolt cellák között a védett munkalapokon.Cellák formázása A Cellák formázása és a Feltételes formázás párbeszédpanelen található beállítások módosítása. Ha a munkalap védetté tétele előtt feltételes formázást alkalmazott, az ennek megfelelő változások továbbra is megtörténnek, ha egy felhasználó valamely más feltételt kielégítő értéket ír be.Oszlopok formázása Az oszlopok formázására vonatkozó parancsok használata, beleértve az oszlopszélesség módosítását és az oszlopok elrejtését is (Kezdőlap lap, Cellák csoport, Formátum gomb).Sorok formázása A sorok formázására vonatkozó parancsok használata, beleértve a sormagasság módosítását és a sorok elrejtését is (Kezdőlap lap, Cellák csoport, Formátum gomb).Oszlopok beszúrása Oszlopok beszúrása.Sorok beszúrása Sorok beszúrása.Hivatkozások beszúrása Új hivatkozások beszúrása, beleértve a nem zárolt cellákba történő beszúrást is.Oszlopok törléseOszlopok törlése.
Megjegyzés: Ha az Oszlopok törlése beállítás védelem alatt áll, az Oszlopok beszúrása azonban nem, a felhasználók beszúrhatnak oszlopokat, melyeket aztán nem tudnak törölni.
Sorok törléseSorok törlése.
Megjegyzés: Ha a Sorok törlése beállítás védelem alatt áll, a Sorok beszúrása azonban nem, a felhasználók beszúrhatnak sorokat, melyeket aztán nem tudnak törölni.
Rendezés Az adatok rendezésére szolgáló parancsok (Adatok lap, Rendezés és szűrés csoport).
Megjegyzés: A felhasználók e beállítástól függetlenül nem rendezhetnek zárolt cellákat tartalmazó tartományokat a védett munkalapokon.
AutoSzűrő használataA legördülő lista használata a tartományszűrés módosításához AutoSzűrők alkalmazása esetén.
Megjegyzés: A felhasználók e beállítástól függetlenül nem alkalmazhatnak, illetve nem távolíthatnak el AutoSzűrőt a védett munkalapon.
Kimutatások használata Kimutatások formázása, elrendezésük módosítása, kimutatások frissítése vagy egyéb módosítása, illetve új kimutatások létrehozása.Objektumok szerkesztéseAz alábbi műveletek:
Módosítások elvégzése azokon a grafikus objektumokon (beleértve a térképeket, beágyazott diagramokat, alakzatokat, szövegdobozokat és vezérlőelemeket), amelyeknek a zárolását nem oldotta fel a munkalap védetté tétele előtt. Ha például egy makrót futtató gomb található egy munkalapon, a felhasználók a gombra kattintva futtathatják a makrót, nem törölhetik azonban a gombot.
Beágyazott diagram módosítása, például formázása. A diagram továbbra is frissül a forrásadatok módosítása esetén.
Megjegyzések írása vagy szerkesztése.
Esetek szerkesztéseAz elrejtett esetek megtekintése, azoknak az eseteknek a módosítása, amelyekre ezt letiltotta, és ezen esetek törlése. A felhasználók módosíthatják a változó cellák értékét, ha a cellák nincsenek zárolva, és megadhatnak új eseteket.
DiagramlapelemekBejelölendő jelölőnégyzet Megakadályozandó felhasználói műveletTartalomA diagram részét képező elemek módosítása – ilyenek például az adatsorok, a tengelyek és a jelmagyarázatok. A diagram továbbra is megjeleníti a forrásadatok módosításait.ObjektumokA grafikus objektumok megváltoztatása (például alakzatok, szövegdobozok és vezérlőelemek), amennyiben a diagramlap védelme előtt a zárolás alól nem oldotta fel az objektumokat.
Írjon be egy jelszót a Jelszó a védelem feloldásához mezőbe, kattintson az OK gombra, majd megerősítés végett ismét írja be a jelszót.
Megjegyzések:
A jelszó megadása nem kötelező, ha azonban nem ad meg jelszót, bármely felhasználó megszüntetheti a munkalap védelmét, és módosíthatja a védett elemeket.
Olyan jelszót válasszon, amelyre emlékezni fog, ellenkező esetben nem tud hozzáférni a munkalapon lévő védett elemekhez.
Megjegyzések
Ha egy cella több tartományba is beletartozik, a cellát az adott tartományok bármelyikének szerkesztésére felhatalmazott felhasználók módosíthatják.
Ha egy felhasználó egyszerre több cellát próbál módosítani, és csak néhány cellára vonatkozik a jogosultsága, a program kéri, hogy a cellákat egyenként jelölje ki és változtassa meg.
A 3 területet elnevezed a 3 felhasználó nevével. Ugyanezt a 3 nevet megadod egy érvényesítésben. Az érvényesítést én az F1 cellába vittem be.
A védelem menüpontban a "Tartomány módosításának engedélyezése" almenüben egyenként megadod a 3 tartományt, a hozzájuk tartozó jelszavakkal együtt. A jelszavak ne egyezzenek meg az elnevezett területek nevével.
A laphoz rendeled az alábbi makrót:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$F$1" Then ActiveSheet.Protect UserInterfaceOnly:=True Cells.Locked = True Range("F1").Locked = False Range(Target.Value).Locked = False End If End Sub
Az F1 cella értékének változásakor a makró levédi a lap összes celláját, majd megszünteti a zárolást az F1 cellában, és az érvényesítésben kiválasztott nevű tartományban.
Ha nem az érvényesítésben kiválasztott ember tartományába akarnál írni, meg kellene adnod annak a tartománynak a jelszavát.
Én csak egy olyat tudnék csinálni, hogy az egész lap védve van, kivéve az a1 cella. Ide kéne beírni a személyes jelszót, majd indítani az általános írásvédettséget megszüntető makrót, ami csak a személyes jelszó szerinti oszlopokat teszi hozzáférhetővé.
ujveg = Range("X1:Y120").Find(What:=y, LookIn:=xlValues, LookAt:=xlWhole).Offset(0, 1).Value For Each cl In Union(Range("B7:U7"), Range("B14:E14"), Range("B24:U24")).Cells
cl.Formula = "'" & cl.Value
Next Union(Range("B7:U7"), Range("B14:E14"), Range("B24:U24")).Replace What:=regiveg, Replacement:=ujveg, LookAt:=xlPart
A ' karakter a szövegjelölő.
A piros sorokat illeszd be erre a helyre. A Dim sort egészítsd ki ezzel: , cl as Range
Remélem így már nem lesz gond. (Igaz, jelezni fogja, hogy a cellában szövegként tárolt szám van, tehát számoláskor nem árt vigyázni vele.)
Emlékszel még a számot kódra cserélős makródra? Most előjött egy hiba, sajnos a kódok között van, E1, E2, stb is, ezt pedig az excel ugye tudományos formátumra alakítja, akkor is ha az összes cellát szövegre állítom. Nem lehetne az alábbi makróba beépíteni, hogy ezek a cellák (Union(Range("B7:U7"), Range("B14:E14"), Range("B24:U24")) mindenképpen szöveg formátumúak legyenek? Vagy az egyéni formátumnál vmi kombináció?
köszi
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Double, y As Double, regiveg As String, ujveg As String
If Not Intersect(Range("B2"), Target) Is Nothing Then
A Szumha függvénynél csak a feltétel kell: SZUMHA(tartomány; feltételek; [összegtartomány])
pl.A1 cella: =SZUMHA(B:B;"<>*szó*";C:C) minden olyan számot összead a C oszlopban, ahol a B oszlop megfelelő sorában nem szerepel a szó semmilyen összetételben sem (azaz kiszűri ha lasszó és azt is ha szófaj van benne és magát az önálló szót is. Erre a csillag karakter miatt képes. Ha azt akarod, hogy csak a szó -val kezdődőekek ne vegye figyelembe, akkor az első csillagot elhagyod (így nyilván a lasszó összegződik, de az önálló szó nem).
A szöveg.keres tartományon szerintem nem is működik...
Sziasztok! Meg lehet azt oldani Excel függvényben, hogy feltétel megadásnál, mondjuk SZUMHA-nál, minden olyan értékeket adjon össze aminél egy bizonyos szó NEM szerepel?
Az "logfile"-nál rájöttem, hogy csak azokat menti ki amit statikusan én írok be valamelyik cellába. Ami függvénnyel számoltatok vagy beírom hogy 1 2 3 és lehúzom hogy a többit magától számolja runtime error 13 dob :(
Egyenlőre megoldottam úgy, hogy ctrl+F és a "-"-t cserélje ki "."-ra :D
Másik kérdésem miért van az, hogy ez a makrót sikerült egyszer ráerőszakolnom az excelre és azóta sem megy :(
Tökre megörültem, hogy értettem is mit kell csinálni és hogyan és sikerült is. De egyszer elmentette az értéket hogy miről mire ment aztán azóta sem működik. Úgy sem, hogy csináltam egy tök új excelt :(
A 22692-ben még csak addig jutottam, hogy az excel nem minden legitim dátumformát ismer fel stringként. Azóta utána néztem, hogy milyen dátumnak látja a magyar excel a stringeket. Az alábbi táblázatban foglaltam össze a lehetséges eseteket. Az összes többi stringnél a dátumfüggvények hibaüzenetet adnak.
Egy icipici változás van a makróban, az offsetnél van egy -1-es, mivel maga az induló cella offset indexe 0,0. Így ha 5 cellát talál, akkor offset(4,0) pl. az ötödik sor első cellája.
A fenti makrórészt a sorbarendezés után betéve minden képleted működik a másik munkalapon.
Sziasztok! Köszönöm Delilának a linket, máris letöltöttem a könyvet. Köszi Fferi és Jimmy a tippeket, szerintem a kettő kombinációja lesz jó.
Csinálok makrórgözítéssel egy olyat, hogy a korábbi elnevezéseket törli az Excel a két termékre, majd a Formulas, Define Name alatt beírja a makró a képletet először az egyik termékre, majd átírva a másik termékre a képletet, beírja másodszorra is a képletet az Excel elnevező ablakba.
Mindenképp úgy szeretném megcsinálni az automatizálást, hogy egy gombnyomással törlődjön a régi elnevezés, majd utána legyen sorba rendezve minden, majd jön a Define Name egyszer az első termékre, majd ugyanez a másik termékre.
Hogy lehet ide feltölteni Excel fájlt? Nyilván egy sematikus táblát tennék csak fel, nem az igazi munkafájlt.
Szerintem azért szeretné makróval, mert nem gondolta volna, hogy másképp is lehet. Nem beszélve arról, hogy a makrót minden egyes alkalommal futtatni kell, amikor új adatok erülnek a munkalapra. A képletes megoldás pedig automatikusan követi a változásokat...
Valahol 2003 és 2010 között az OFSZET függvényt átnevezték ELTOLÁS-ra. 2003-ban biztosan OFSZET kell az ELTOLÁS helyett, 2007-ben nem tudom, ki kell próbálni.
Sziasztok! Pár hete láttam itt valahol egy linket, ami Kovalcsik Géza makró könyvére mutat, meg tudja valaki adni a pontos hsz. számot? Vagy ha újra belinkelné az illető ide, nagyon jó lenne. Köszi.
Más. Hogyan tudom megcsinálni azt, hogy amikor el akarok nevezni egy tartományt Név definiálással, tehát nem létrehozással, akkor az Excel dinamikusan érzékelje, hogy hol kezdődik és hol végződik az a tartomány?
A struktúra a következő: van 6 oszlop, ahol különböző termékfajták vannak. Az egy csoportba tartozókat, melyeknek azonos a neve, ezeket szeretném definiáltatni a makróval.
Az első oszlop tartalmazza a neveket, összesen 5 fajta termékét.
Ebből az 5 termékből csak 2 terméket, a Sakkot és a Labdát kell definiálni, a többi nem érdekes.
Ahogy Excelben csinálom: átmásoltam egy külső adatbázisból a sheet tartalmát, tehát megvannak az aktuális adataim.
Utána sorba rendezem a terméknév szerint a táblázatot, majd megnézem, hogy kezdődik a Sakk nevű termékek sora, és ott kijelölöm a kezdő cellától az utolsó őt tartalmazó celláig a tartományt, belevéve a mellette lévő másik 5 oszlopot, benne a költségadatokkal, és ugyanezt megcsinálom a másik termékre is, melynek neve Labda.
A Sakk és a Labda tartományelnevezéseket aztán használja egy másik munkalap a vlookup-hoz, mert onnan veszi át a vonatkozó költségadatokat.
Ami a makró részét illeti, logikailag úgy gondolnám, hogy sorba kell először rendezi a táblázatot terméknév szerint, majd csinálni egy utasítást, hogy a makró keresse meg a B oszlopban azt a sort, mely először tartalmazza a Sakk nevet, ezt jelölje ki, majd menjen le addig, amíg eltérő nevet nem talál ugyanabban az oszlopban, majd kijelölve a köztes területet és a mellette lévő további öt sort definiálja Sakk néven a tartományt.
Majd ugyanezt csinálja meg a Labdával is, Labda névre elnevezve.
Éppen csak a hogyant nem tudom erre az utasításra. Ezt rögzítéssel nem lehet megcsinálni, csak if then-nel vagy Case ciklussal gondolom, de a szintaktikát nem tudom.
A múltkori segítséget még egyszer köszi mindenkinek - Fferi, Jimmy, Tbando , a makró remekül működik azóta is :-)
Excelben egy cellában van egy email cím a @ karakterrel. Automatikusan hivatkozást csinál belőle. De én nem szeretnék hivatkozást. Jobb egérgomb helyi menüben kiválasztom a hivatkozás eltávolítását, ezután oké lesz. De ha a cellában (F2) Alt+Enter nyomva egy új bekezdést csinálva hozzáírok valamt, akkor megint hivatkozás lesz azzal együtt, amit hozzáírtam. Megint hivatkozás eltávolítását választom. De ekkor az új bekezdés eltűnik, közvetlenül az email cím után kerül aminek külön sorban kéne lennie. És ez az ami nem jó, mert nekem új bekezdésben (vagyis az email cím alatti új sorba) kéne írnom.
Az If Not IsDate(cl.Value) Then sort nem szabad kikommentelni, mert akkor a már dátumként kezelt értékekkel gond lesz (ha pl. nem szövegként, hanem kapásból dátumként jeleníti meg a cellában, akkor nem lesz benne "-"!
Ezt kezeli az else ág, amely beállítja a magyar dátum formátumot és be is írja mégegyszer az értéket, mert így érvényesül csak.
A hónapnevek, meg a tartomány az példaként kezelendő természetesen.
Rosszul írtam :((((. Az óra oszlopra még rá kell ereszteni a Gyakoriság fgv.-t vagy Darabtelivel meghatározni a gyakoriságokat. A diagramot a gyakoriság táblázat adatai adják.
Csinálsz még egy oszlopot, amelyben a belépési időpontokról levágod a perceket. Gondolom az =óra() fgv. erre igen alkalmas. Aztán a diagramot ezzel az oszloppal csinálod.
Annyit fűznék hozzá, hogy a tömbben megadott hónap nevek nem tekintendők szentírásnak. Mi csak feltételeztük, hogy a csv fileból ezeket hónapnevek jönnek. Ha nem, akkor az eltérőket át kell írni. Mert enélkül kiakad a makró. (Amire ugyan lehetne írni hibakezelőt, de házi használatra felesleges, leálláskor egyszerűen csak ellenőríni kell a hónapnév-egyezéseket és javítani, amit kell).
És még egy megjegyzés: A jelenlegi hónapnevekkel a januári, a februári, az augusztusi, a novemberi, és a decemberi dátumokat változatlanul fogja hagyni, mert azokat az excel felismeri dátumként, és ezért azokkal nem foglalkozik. Emiatt a dátumoszlopban keverten lesznek angol és magyar formátumú dátumok, amik a velük való számolást nem befolyásolják, hiszen az excel mindkét formát beazonosítja. A usert azonban zavarhatja. Ez esetben azIf Not IsDate(cl.Value) Then sort és a hozzátartozó End if-et kell kikommentelni.
Ez igaz, de én nem akarom ezt a munkalapon látni egy percre sem (hiszen később nem lesz rá szükség már). A munkalapra meg csak fel kellene vinni valahogy (vagy új egyéni listát csinálni rá).
Segítségeteket kérem olyam diagram osszeállításában ami úgy nézne ki, hogy: Vízszintes tengelyen 7-15 óráig az időskála van, a függőlegesen pedig darabszám.
Ábrázolni szeretném egy felhasználó szoftverhasználati szokását. Megvannak a belépési idők és oszlopdiagramban szeretném a gyakoriságot ábrázolni, hogy
pl: 7-8 óra között 4 szer, 8-9 óra között 6-szor, 9-10 óra között 1-szer stb...lépett be a szoftverbe.
Ja és még valami. A probléma újabb áttekintése arra is jó volt, hogy fény derült a korábbi hsz-emben hosszasan ecsetelt a pont-kötöjel probléma hátterére. Mondanom sem kell, egy banálális bénázásom okozta :)))))))
Ezek szerint nálad jól működik a makró. Mert nálam a Numberformat kiiktatásával sem. Ezek szerint az én excelem (2007) valamit rosszul csinál. Megnéznéd, hogy a te gépeden, hogy működik? Elküldeném, ha megadnád a mailcímed. Meg megköszönném, ha elküldenéd a te füzetedet, hátha az én gépemen is jó lesz. De feltehetjük a füzeteket a data.hu-ra is.
Más. A nap% nem minden esetben barmolja el a hónap meghatározást. Csak ha a napdátum 10 alatti. Ugyanis akkor az integer változóba egyjegyű szám kerül, és így a honap = Replace(cell.Value, nap & "-", "") utasítás a cell-ben bennehagyja a 01-ből a 0-t, amit így hozzátesz hónaphoz, amit aztán nem ismer fel.
Pontosan tudom, hogy minden mezőt szövegként exportál, ezen akarok változtatni, ehhez kell az időadatok esetén némi esettanulmány. Bizonyos dolgokba csak belecsöppentem, készen kaptam, de van módom idővel változtatni rajtuk.
Az egyik a makrómmal: a cl.numberformat sort légy szíves hagyd ki belőle, az nem szükséges, sőt be is zavarhat.
A másik: a szöveges fájlok beimportálása
egyrészt a fejlesztőnek - pláne ha pénzért dolgozik - kutya kötelessége megadni az exportált fájl struktúráját, amibe természetesen beletartozik az is, hogy melyik mezőnek milyen a formátuma és az adattartalma. Ez alapján már lehet játszani az importálásnál - vagy utána - az oszlopok tartalmával.
Egy működő makrónál pedig már "gyerekjáték" átírni az oszlopokkal kapcsolatos műveleteket.
Szerintem a napnak nincs köze a hónap meghatározásához, így a nap% jó (nálad is az volt - bár tudom, ez nem mentség). A honap pedig variant, így elbír bármit.
Valóban a dim sorban a cell változót is definiálni kell, bár én jobban szeretem nem használni a VBA -ra hajazó neveket és ezért nálam mindig cl a cell (csak a kedvedért maradt benne...), persze azt sem árt definiálni.
El kell hagyni cell.numberformat sort és akkor az excel a dateserialt a rendszer beállítás szerinti dátumformátumban írja ki a cellába.(vagy át kell javítani cell.numberformat="m/d/yyyy" -re vagy át kell írni cell.numberformatlocal="éééé.hh.nn"-re). Úgy gondoltam, hogy a biztonság kedvéért állítok a formátumon, aztán jól összekevertem a magyart és az angolt....
Összefoglalva:
Szerintem ha a cell.numberformat sort kikommenteled, akkor nem lehet probléma a futással.
Az már egy nehéz ügy, hiszen hogy írsz olyan makrót, amelyik különböző exporttáblázatokban eltalálja, melyik oszlop legyen időformátumú a sok szám közül?
Persze, persze, az adatbázis meg a táblázatkezelő egészen másra való, csekély átfedéssel, ezt huhogom állandóan. :-) Ha nem szeretném az Excelt, nem volnék itt. De hogy egyszerűen alkalmazkodni kell a tecnikához, az nem igaz. A technikát alkalmazni kell a saját igényeinkhez, ez egy má szemléletmód. Általában amit a lekérdezésbe be lehet építeni, és ismétlődően kell, azt célszerű beépíteni, de pont az exportformátum nem ilyen. Az sem mellékes szempont, hogy az adatbázis kezelőprogramját pénzért tartja karban egy külső fejlesztő, az Excelt meg a bérükért használják a dolgozók munkaidőben. Sajnos egy céges környezetben ilyen nem informatikai szempontok is bejátszanak.
Remekül működik, annyit még ha tudnál segíteni, hogyha ugyanabban a cellában akarom látni még az aktuális dátumot is az időpont előtt akkor hogyan kell modosítanom a makrót?!
Látom, te is éjszakai bagoly vagy :)))). Vagy tán neked már holnap van? :)))))
Nos, ha az aposztróf nélküli 12:00:00de Minimuma 0, akkor az gubanc, akkor valamit rosszul gondolok.
A számformátumok kézi beállítása viszont szerintem nem ügy. Minden bizonnyal makrózható, akár az IDŐÉRTÉK beállításával közös makróban.
Abban egyetértek veled, hogy az excel dátum és idő kezelése komplikált. Az SQL-é minden bizonnyal barátságosabb. Másban viszont nyilván az excel a jobb, különben miért kellene elhagyni az adatbázist. Tehát alkalmazkodni kell az excelhez.
De még az év is kellhet, mivel nem a Nagy Októbertől kezdve keresi, csak az ideire.
Az én megoldásom se nagyon jó, mert elfelejtettem, milyen bonyolultan tud az Excel képletben dátumokat összehasonlítani. Hozzászoktam az SQL természetes kényelméhez, aminek az alkotói tudták, hogy ez alapfunkció.
Na ez a másik. Ha minden alkalommal kézzel kell beállítgatni az összes időoszlop formátumát, akkor nem vagyok közelebb semmivel. Csak akkor értelmes, ha sikerül beállítani a formátumot is, különben ugyanakkora munka, mert szabad szemmel is olvashatónak kell lennie.
Viszont ha megkérem a fejlesztőt, hogy számként exportálja, akkor nem tudom, hogy fog megjelenni, és nem tudok személyesen kísérletezni vele...
Ha számként akarod exportálni, akkor mi sem egyszerübb, mint hogy meghatározod a stringdátumok időértékeit és azokat expotálod. Amik aztán olyan formában jelennek meg, ahogy beállítod a formátumukat. Ráadásul ezeknél már a MIN-t is minden további hókusz-pókusz nélkül használhatod.
Sajnos nem jó. Összeadja a teljes C-oszlopot. Így kénytelen leszel a B-oszlopban meghatározni a hónapértékeket a HÓNAP fgv-nyel, majd arra megcsinálni a szumha-t.
Én is úgy vaagyok vele, mint te. Szeretem megérteni is a dolgokat. Ezért megkérnélek, hogy írd már meg ide, hogyaz aposztróf nélküli dátumod MIN-je, milyen eredményt ad?
Na átstudiroztam a makródat, meg is értettem, de van 1 olyan probléma vele amit sehogy sem tudtam kiküszöbölni. Kiváncsi vagyok ezzel kapcsolatban a véleményedre.
De előtte ki kéne javítani a Dim sort. A nap változó nem lehet integer, mert az gondot okoz majd a hónap meghatározáskor. Tehát a nap% helyett elég lesz a nap, de jó a nap$ is. Továbbá célszerű lenne a cell változót is felvenni a Dim-listára.
Na most a probléma:
Hiába van DateSerial-lal megadva a dátum, változatlanul stringnek írja át. Ráadásul hiába van a kiiratás ev-ho-nap sorrendben, valamint hiába az „yyyy.mm.dd” számformátum megadása, a makró mm/dd/yyyy formában írja a cellába, amit aztán az excel ugyanúgy nem ismeri fel dátumként mint a kiindduló dd-oct-yyyy formátumot. Tehát semmilyen dátumművelet sem végezhető az átalakított formával, a DÁTUMÉRTÉK is hibát ad vissza.
DE…
Hogy még kacifántosabb legyen, a makró ezen új mm/dd/yyyy formátummal újra futtatva az If Not IsDate(cell.Value) feltételnél dátumként értelmezi és az end if-re ugrik.
Na most akkor ez hogyan van????
Ami aztán hab lett a tortán, hogy a számos sikertelen javítgatás során egyszercsak a makro is leállt a Nap=Left(cell.value,Instr(cell,”-“)-1)-nél. Hosszas kísérletezés nyomán kiderült azért, mert a “-“-t “.”-nak látta, noha a cellában kötöjel volt. Erre átírtam a makróban a kötöjeleket ponttá, amire ugyan a Left-en túljutott, de a pontot meg egy későbbi fázisban nem fogadta el, mert itt meg kötöjelet látott. Visszaírtam makróban a pontokat kötöjellé, erre megszűnt a makró hiba, és azóta hibátlanul lefutva adja a datumként nem értelmezhető cellabeírásokat J)))).
Ez utóbbit csak az érdekesség kedvéért írtam meg. De hogy miért nem kaptam dátumként értelmezett eredményt a makróddal, arról nagyon érdekelne a véleményed.
Egy oszlopban dátumok vannak, egy másikban számok. Össze kéne adnom egy bizonyos hónaphoz tartozó számokat, de nem megy mivel az excel dátumként és nem számként vagy szövegként kezeli ezeket. Így próbálkoztam ,hogy 2013.10* hogy az óktóberieket összeadja SZUMHA-val, de sajnos nem működik így.
Van egy ilyen betegségem, hogy meg is akarom érteni a dolgokat, nemcsak megcsinálni. :-)
Plusz ugye mivel rendszeresen dolgozunk efféle adatokkal, amiket egy SQL adatbázisból egy applikáció exportál, a megértés hozzásegíthet a program fejlesztéséhez, hogy a jövőben kevesebbet kelljen buherálni. Nem az zavar, ha egyszer nyakatekerten lehet megoldani valamit, hanem ha ezt rendszeresen meg kell ismételni.
Ha már működik egy +0-val kiegészített tömbképlet (és működik), akkor min görcsölünk még tovább?
Egyébként makróban bevinni tömbképletet így kell: pl. Activecell.FormulaArray=MIN(A27:C28+0).
Miért is "erőszakoskodunk egy jobb - vagy annak tűnő megoldáson? (Egy kicsit spanyolviasz esetnek látom a dolgot.)
A +0 magyarázatát pedig Tbando (22647) már megadta:
Az internetes +0 pedig az excelnek az az igen hasznos, és itt a fórumon is már többszőr említett képessége, hogy bizonyos müveleti jelekre átállítja a formátumot. Esetedben a stringet az időértékének megfelelő normál számmá.
Nincs. De ezzel együtt kezdem azt hinni, hogy csakugyan szövegnek veszi. Viszont ha megkérem a fejlesztőt, hogy számként exportálja, akkor nem tudom, hogy fog megjelenni, és nem tudok személyesen kísérletezni vele...
Aposztrófnak nem kell lennie, az csak manuális gépeléskor van, ez meg exportból visszamaradt termék.
Ha nem kezdődik aposztróffal, akkor viszont a MIN-nek müködnie kéne. Nézz meg tehát egy ilyen apósztróf nélkülit, hogy mi a MIN-je. Ha önmaga,akkor OK, ha 0 akkor gubanc.
Sub szovegido() Dim szov As String, elso%, masodik%, cl As Range For Each cl In Range("A2:B4").Cells szov = cl.Value elso = InStr(szov, ":") masodik = InStr(elso + 1, szov, ":") cl.Value = TimeSerial(Left(szov, elso - 1), Mid(szov, elso + 1, masodik - elso - 1), Mid(szov, masodik + 1)) cl.NumberFormat = "hh:mm:ss" Next End Sub
Ez az adott tartományban szereplő összes cellatartalmat átállítja időértékké és formátummá.
Feltétele, hogy legyen benne két db kettőspont mint elválasztó (tehát 0:12:12, és 0:0:3 is ok, de 0:12 az nem), ezt most nem ellenőrzöm.
A cellaformátum megnézése nem adekvát a te esetere. Hogy értsd: állits be egy üres cellát időformátumra. Aztán írd bele, hogy Sánta Kutya. Aztán nézd meg a cellaformátumát. Az lesz hogy időformátum. Noha valójában nyilvánvalóan string. Amint arról már írtam, erről a SZERKESZTŐLÉCEN győződhetsz meg. Mert ott majd látod, hogy beírás aposztróffal kezdődik. Na most írj be ugyanebbe a cellába egy tizedes törtet. Azt már időformátumban adja vissza. A szerkesztőlécen sem lesz aposztróf elötte.
Tehát az időformátum beállítás azt csinálja, hogy a megadott szám törtrészét időkijelzéssé formázza. De ha nem számot kap, akkor azzal nem tud mit kezdeni. Ezért meghagyja, ahogy van. Még mindig jobb, mintha hibakijelzést adna.
Nem tudom, hogy számként vitted-e be, vagy ebben a formában "3:12:21" (idézőjelek nélkül persze), mert ha ez utóbbi, akkor bármit csinálhatsz a számformátummal, soha nem lesz belőle idő!!!!!
Ha viszont pl. 0,5-ként viszed be és átállítod az időformátumra, akkor már műxik.
Mondanám, hogy természetesen szövegként (hiszen más karakterek is vannak benne - és nem idő formátum, csak olyan szöveg, mintha idő lenne! szerintem) és fütyül a számértékre.
Mivel a min, max függvénynél eleve írja, hogy az argumentumoknak számoknak kell lenni, ezért én nem is próbálkoztam szöveggel.
Tény, hogy a VBA tud szövegeket is összehasonlítani, elsősorban a hosszuk, másodsorban a betűk alapján, de ezt matematikára felhasználni - hát nem tudom.
Egyébként a szöveges min példád (11, 12) nálam egyből 0-át eredményezett, viszont az A1(11)>A2(12) értéke HAMIS, ami teljesen rendben van a karakteres összehasonlítás alapján.
De egy áthidaló megoldás:
A1="12:34:25" B1="12:23:12" C1=HA(A1>B1;B1;A1) Ez megmondja a minimumot. Nyilván, ha több érték van, akkor ennél kicsit bonyolultabb a dolog.
Igen. Ráálltam a cellára, leolvastam, idő. Az első, ami *-gal van megjelölve. Átállítottam egy másik hasonló időformátumra, ami nem csillagos, hátha. Azzal se működött.
Szvsz attól string, hogy stringként vitted be. Attól hogy az időformátumra hajazó stringet az excel képes időformátumnak is nézni, attól az még string marad. Amit ha jobbra igazítasz, akkor jobbra igazított string lesz. Nézd csak meg a szerkesztőlécen, ott lesz elötte az aposztróf.
Az internetes +0 pedig az excelnek az az igen hasznos, és itt a fórumon is már többszőr említett képessége, hogy bizonyos müveleti jelekre átállítja a formátumot. Esetedben a stringet az időértékének megfelelő normál számmá. Van ilyen számos egyéb is:
pl. a=b*1 az 1 ha igaz, és 0 ha nem. Az 1&1 eredménye meg "11". Ezért ha A1="11" és A"=12 akkor Min(a1:a2)=12.
Persze elég nehéz azt kitanulni, hogy maradva a fenti a1-a2 kiosztásnál az a1+a2=23, de a szum(a1:a2)=12 :))))))
Egy kicsit módosítottam a javaslatodon a következők miatt:
Ha általános formában importálja a csv fájlt, lesznek olyan dátumok, amelyeket tud értelmezni a magyar excel is (pl.legközelebb nov.), ezt érdemes figyelni és kezelni.
Ha Option Base 0 akkor lehet 0-ról indítani a hónapok feltöltését és nem kell így az eredményből kivonni 1-et, (vagy ha Option Base 1, akkor sem.)
Jóllehet, a cella alapértelmezésben az értéket adja vissza, én mégis szeretem használni a .value-t mivel így gyorsabb a számolás.
Lehet, hogy nem minden nap van 0-val kezdve, nem minden hónap 4 karakter hosszú. Ezért inkább a határolóval célszerű operálni (ami persze lehet más is, nem csak "-".
Továbbá- miért ne csinálnánk egyből dátumot és állítanánk be a dátum formátumot az adott cellán?
Sub honapos() Dim ho(12) As String, ev%, nap%, honap ho(0) = "Jan" ho(1) = "feb" ho(2) = "mar" ho(3) = "apr" ho(4) = "may" ho(5) = "june" ho(6) = "july" ho(7) = "Aug" ho(8) = "sept" ho(9) = "oct" ho(10) = "nov" ho(11) = "dec" For Each cell In Range("A1:A40") If Not IsEmpty(cell) Then If Not IsDate(cell.Value) Then nap = Left(cell.Value, InStr(cell.Value, "-") - 1) ev = Mid(cell.Value, InStr(4, cell.Value, "-") + 1) honap = Replace(cell.Value, nap & "-", "") honap = Replace(honap, "-" & ev, "") honap = WorksheetFunction.Match(honap, ho, 0) cell.Value = DateSerial(ev, honap, nap) cell.NumberFormat = "yyyy.mm.dd" End If End If Next End Sub
És persze a Te programod sem csinál 27-Oct-2013-ból 2013.09.27-et!
A stringeknél ez már csak így van. Annak ellenére, hogy az "a<"b"=IGAZ és az"a">"b"=HAMIS, a MIN("a";"b")= 0. Valószinűleg azért, mert a MIN a stringeket 0-nak tekinti. Ahogy egyébként a SZUM is, az ÁTLAG is, meg a DARAB is. Bár ez utóbbinak van darab2 változata is.
Biztos van elegánsabb megoldás is, de én csak erre vagyok egyelőre képes. Kijelölöd a szöveges cellatartományt, amelyben vegyesen vannak dátumok és egyebek, majd elinditod a makrót, ami a dátumokat átírja 07-Oct.-2013 formáról, 2013.09.07-re, amivel a magyar excel már elboldogul. Két feltételnek kell ehhez teljesülni: 1. A dátumok mind amerikai formátumuak és a hónapok az angol rövidítésüek legyenek. 2. A felölelt időszak 2000-2099 közé essen.
A makró extrém esetben elbarmolhatja a cella tartalmát, ha jobbról a 3.-4. betű "20" és ez nem a 2000-res dátumból származik. A makro szerkezete viszont roppant egyszerű, ezért a feltételeket könnyű átírni.
Sub djmorphdatum()
Dim a$, b$, ev%, ho, nap%, honum, cell Dim honapok(12)
De nem értem, hogy működik. Nem a tömbképletet nem értem, hanem a +0-t. Mindenképpen hibás működés, hogy közönséges MIN függvénnyel nem ad jó eredményt.
Remekül működik, annyit még ha tudnál segíteni, hogyha ugyanabban a cellában akarom látni még az aktuális dátumot is az időpont előtt akkor hogyan kell modosítanom a makrót?!
Segítsetek! Olyan időfüggvény kellene nekem, ami az éppen aktuális időt rögzíti MÁSODPERCRE pontosan. A Ctrl+Shift+. kombináció az percre pontosan írja csak az időt.
Nekem is lenne egy kérdésem. Szeretnék egy egy excel file "Thisworkbook" lapján lévő makrókat beimportálni egy másik excel file "Thisworkbook" lapjára. A problémám az, hogyha kiexportálom a thisworkbook-ot, akkor az exportálás automatikusan egy class module file-t hoz létre (cls kiterjesztéssel), amit, ha visszaimportálok a másik munkafüzetbe, akkor ott is class module-ként jelenik meg, de én a "Thisworkbook" lapra szeretném azt bemásolni (nem kézzel, hanem makróval).
CSV-ből importálok file-okat. Az "AD" oszlopba importálja a dáumokat de a következő formátumban:
"07-Oct-2013"
Hogyan tudnám rávenni, hogy az excel tudja kezelni ezt a dátumot pl viszonyítani tudjak hozzá stb? Az a baj, hogy göngyölített adathalmaz tehát mindig csak nőni fog és egyesével átirogatni nem nagy élmény :D
Azon töprengtem, hogyan lehetséges úgy átállítani fix tizedesre az excelt, hogy a usernek erről fogalma sincs. Hát végülis nagyon könnyen. Mert ha több füzet van nyitva, akkor, ha akármelyiket is átállítjuk, azzal a többi füzetben is megtörténik az átállítás. Ha a későbbiek során ezek közül az átállított füzetek közül bármelyiket is behívjuk elsőként, az tovább "fertőzi" az utána megnyilókat, amelyek szintén hasonlóképpen fognak viselkedni. Egészen addig, amig ki nem kapcsoljuk a fix tizedes módot az egyik füzetben, mert ezzel a többi megnyitott füzetben is megszűnik.
Bekapcsolta valaki a "fixed decimal mode-ot". Alant le van írva, hogy hogy lehet kikapcsolni.
Ques 19. Your colleague created a dashboard and when you enter a value, it appears with two decimal places. For example, when you enter 265 it shows up as 2.65. What's wrong? Solution: By chance Excel's fixed-decimal mode was turned on. To return to normal, Excel 2003 --> Click Tools and then Options to display the Options dialog box. Then click the Edit tab and remove the check mark from the "Fixed decimal " option. Excel 2007 --> Click Office button on Top-Left corner and click 'Excel Options'. Go to Advanced and Uncheck 'Automatically insert a decimal point' option. Excel 2010 --> Click File button on Top-Left corner and click 'Excel Options'. Go to Advanced and Uncheck 'Automatically insert a decimal point' option.
Csinálhatod FKERES-sel is. A százalékokat kumulálod 0-tól 83-ig és melléjük irod a posztokat. Majd az 1-100-ig kitöltött cellák mellé beírod az FKERES képletet: =fkeres(szám-1;$posztkiosztó;2)
Írtad, hogy nézted a számformátumot is. Na és melyik formátum volt kijelölve, és azt hogyan illusztrálta, miközben az 5000000/0,5-ös cella volt kijelölve?
Igen, igazad van, engem egy kicsit átvert a saját programom, amikor ugyanazokat az értékeket adtam minden szóbanforgó cellának, persze, hogy nem láttam az "ármánykodást".
Akkor most egyenlőre nem látok mást, mint cellánként megváltoztatni az értéket:
Range("A7").value=left(range("A7").value & csere
Range("B17").value=left(range("B17").value & csere és így tovább, ezeket a
celja.Value = Left(celja.Value, 5) & csere
sor helyett írd be és elhagyhatod
celja As Range, beírást, valamint a
Set celja = Union(Range("A7"), Range("B17"), Range("C17"), Range("D17"), Range("E17"), Range("A24"), Range("D34"))
Bocs, nem, mégsem ez a probléma. Jelenleg az alábbit használom, és az első 5 karaktert mindenképpen az A7-ből veszi, ha pedig az A7-et kitörlöm, le se fut...
Private Sub Worksheet_Change(ByVal Target As Range)
Dim celja As Range, csere As String
Dim x As Double, y As Double, regiveg As String, ujveg As String
If Not Intersect(Range("B2"), Target) Is Nothing Then
Ezzel kizárod az első módosításból a második változás érintett celláit. A címek kiszámolását oszloponként viszonylag könnyen meg tudod tenni. Arra kell figyelni, hogy a Union csak 30 paramétert fogad el.
Más módon is meg lehet oldani a cellák kihagyását, de az már mélyebb excel(VBA) ismereteket feltételez.
Igen, nyilván a két módosítási lehetőség feltételeit vagy tartományait valamilyen módon szét kellene választani. Ezért is kérdeztem már korábban is, hogy vannak-e kiválasztási szempontjaid.
Egy kicsit gondolkodom még, hogyan oldható az meg, ha ugyanabban a tartományban kell ezeket a változtatásokat megcsinálni.
Egyébként a program mindkét része azt csinálja, amire megírtuk:
Az első kicseréli az adott karaktersorozatot egy másik karaktersorozatra minden olyan cellában, ahol talál ilyet, előfordulási helyétől függetlenül - sőt, ha több ilyen karaktersorozat van benne, mindet kicseréli.
A második pedig az általad definiált tartományban cseréli a karaktereket.
így gondoltad? működik egyébként, csak D34-ben indokolatlanul átírja a 3. (Z) karaktert is A-ra. De amúgy ez már tényleg apróság, nem gond átrni, csak érdekességképpen...
nagyon köszönöm!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim celja As Range, csere As String
Dim x As Double, y As Double, regiveg As String, ujveg As String
If Not Intersect(Range("B2"), Target) Is Nothing Then Application.EnableEvents = False y = Target.Value Application.Undo x = Target.Value
Target.Value = y regiveg = Range("X1:Y120").Find(what:=x, LookIn:=xlValues, lookat:=xlWhole).Offset(0, 1).Value
If Not Intersect(Range("B1"), Target) Is Nothing Then Application.EnableEvents = False Set celja = Union(Range("A7"), Range("B17"), Range("C17"), Range("D17"), Range("E17"), Range("A24"), Range("D34")) csere = Mid(Target.Value, 6) celja.Value = Left(celja.Value, 5) & csere Application.EnableEvents = True End If
Private Sub Worksheet_Change(ByVal Target As Range) Dim celja As Range, csere As String If Not Intersect(Range("Y18"), Target) Is Nothing Then Application.EnableEvents = False Set celja = Union(Range("Y20"), Range("Z21"), Range("AA23"), Range("AB25")) csere = Mid(Target.Value, 6) celja.Value = Left(celja.Value, 5) & csere Application.EnableEvents = True End If End Sub
Az egész eljárást beteheted a másik mellé a worksheet_change eseménykezelőbe!
A naracs színű sort szúrd be rögtön az első sorba!
A többi sort az End Sub fölé érdemes beszúrni, akkor biztosan nem zavarod meg a lelkivilágát.
Nálam az Y18 volt a vezérlőcella, a megváltoztatandókat pedig a set celja= sorban látod. Ha 4-nél több cellát akarsz változtani, akkor a konkrét cella címeket vesszővel elválasztva folytasd a második zárójel előtt a minta szerint.
csere: a vezérlő cellád értékének veszi a 6-dik karaktertől kezdődő részét.
A célcellákban marad az első 5 karakter és hozzáteszi a fentebb vett részt.
Most ki is próbáltam magamnál, remélem, nem lesz vele gondod.
Én úgy csinálnám, hogy elkezdeném ciklusban beírni a cellákba, hogy kapus, szélső,irányító ...stb. egymás után.Számolnám a ciklusokat, aztán a 15. után már nem írnék irányítót, a 17. után beállót és így tovább.
Én is azt gondoltam - csak ezek szerint nem írtam egyértelműen - hogy a rossz kódban valószínűleg az unload nem tetszik az Excelnek (mivelhogy a jóban ilyen nincs, hanem ugyanarra a fomra amire a rosszban az unload volt, hide van és persze nem is ugyanott).
Az újonnan beírt 13 karakterből vegye a cserét vagy máshonnan? Mert ez nem mindegy. Továbbra is aktuális a kérdés, honnan tudod, hogy éppen melyik cellában kell a cserét végrehajtani?
Az eseménykezelő makróval ez a feladat is gyorsan megoldható.
Egyébként pedig a szöveg manipuláló függvényeket ajánlom figyelmedbe.
Tudnátok ebben segíteni? A 2. feladatnál megakadtam :S
Készítsd el a kézilabda NB.II. ifjúsági bajnokságban résztvevő játékosok adatbázisát az alábbiak szerint!
1. Ebben a korosztályban 100 játékos van, mindegyikük 1994.01.01 és 1996.12.31 között született. (A születési dátumnál a jól ismert hosszú képletet használd!)
2. Töltsd ki a 'Poszt' oszlopot, ha tudjuk, hogy a játékosok 18%-a kapus 15%-a irányító 28%-a átlövő 22%-a szélső 17%-a beálló.
Tudnátok még egy egyszerűbb automatikus cserés kérdésben segíteni? Csak az általam meghatározott cellákban cseréljen, úgy hogy pl. beírok B1-be 13 karaktert és B10,C10,D10-ben cseréljen (ott szintén 13 karakter van jelenleg), de csak 6-tól a 13. karakterig (az első ötöt hagyja úgy).
Segítsetek! Olyan időfüggvény kellene nekem, ami az éppen aktuális időt rögzíti MÁSODPERCRE pontosan. A Ctrl+Shift+. kombináció az percre pontosan írja csak az időt.
Miért van az, hogy egy cellába írt pl: 500000 0,5- ként jelenik meg az enter leütése után. Már néztem a formátumokat is meg amit lehetett, de nem tudom miért csinálja. Idáig nem volt ilyen... Nem tudom átállítani.
Ott van az orrom előtt, csak nem látom? Kérhetnék egy kis segítséget?
Ha jol emlekszem, akkor a rossz kodban volt az hogy
Unload Soforbejel
Admin.hide
Admin.show
Valami oknal fogva az admin form, ha a hide aztan show nincs benne, akkor nincs rajta a focus, vagy nem aktiv. Ra kell kattintani hogy a setfocos bele alljon a textboxba.
De ezek nelkul is leprobaltam, es kifejezettem ezeket a sorokat kicsereltem a korabbi verziora, de ugyanugy jelentkezett a hiba.
Úgy gondolom, a form kilövése (SoforbBejel.Unload) a folyamat közepén nem "könnyíti meg" az excel dolgát (a másik verzióban a Hide-al működik a program).
Úgy látom, a Soforbejel hívásában sem vagy következetes a hibás programban (máshol van a hívás, illetve nincs is).
Hiába, a gépelési hibáktól nem tudok szabadulni továbbra sem...
A find és a replace lookat paramétere szabályozza, hogy a teljes cellatartalomnak egyeznie kell, vagy kereshet részeket is. Ezt tanácsos minden alkalommal definiálni, mert benne maradnak a beállítások a metódusban. (Ha egy find makró végrehajtása után megnézed a munkalapon a keresést, akkor azokkal a beállításokkal fog előjönni, amit a makróban megadtál neki.)
Az általam javasolt adatösszesítést meg lehet csinálni ugyanarra a lapra, amire a főösszegeket szántad! Nem kell másik munkalap! Az összesítést abban a cellában kezdi az excel, ahol Te szeretnéd. A láthatatlanságot pedig nem csak elrejtéssel lehet megoldani, hanem az ablak "lefagyasztásával" is.
Viszont: Ha az egyes munkalapokon csak egy oszlop van, amit összesíteni akarsz, akkor akár az első két oszlopba is kerülhet az adatösszesítés eredménye. Mint már korábban is írtam, az új munkalap beillesztése után csak néhány kattintás az új összesítés. (És megúsztad a rengeteg "hahibás" képletet is!)
Ha több oszlopod is van, akkor is működik az összesítés - csak azonos tartalmú oszlopnak azonos neve legyen.
Mostmar jobb kedvvel irok! :) Sikerult megoldani az Excel eroltetett bezaros dolgot. Vagyis csak felig... A hibat okozo kodsort kerestem, sorrol sorra kileptem az eppen futo makrobol majd megprobaltam bezarni. Termeszetesen amikor mar sikerult leszurnom hogy melyik funkcioban lehet a hiba. Szoval van egy funkcio ami 2 fele agazik attol ugg, hogy a beolvasott vonalkodhoz mar tartozik valami adat vagy sem. Ennek a makronak az elso fele akkor fut le, ha van hozza tartozo, a masik fele ertelem szeruen, ha nincs hozza tartozo adat. Tesztelesnel mindket agaban ugyan azt csinalta az excellel. Szoval az elso felen sorrol sorra zartam az excelt. Ahogy megnyomtam a kilepo gombot mar latszodott a hatas, hog tortent e valami vagy sem mert ha igen, akkor azt sem kerdezte meg, hogy akarom e menteni a fuzetet.
Ahogy minden kodsoron vegigmentem, es nem jott elo a hiba akkor ment fel a pumpa, hogy ha egyben lefut akkor hiba van, ha soronkent kileptetem akkor jo az excelem.
Elo vettem egy korabbi verziot ami tokeletesen mukodik es annak a kodjat hasonlitottam ossze az ujabb verzioeval. Aprobb (nem fontosnak tuno) kodsorok voltak elteroek. Hiaba remeltem azokat ki, es ugy futtattam az ujabb verziot akkor is elojott a hiba.
Ekkor a korabbi verziobol atmasoltam az egesz makrot bele az uj verzioba. MUKODIK!!!! Semmi hiba az excel bezarasakor!
Ugyan nagy most az oromom, mivel prezentaciom lesz a heten, tortenetesen egy multiceg Transzport irodajara kerul elso korben a program, de azert kutato es folyton kivancsisaggal telt ember level engem nagyon erdekel, hogy mi lehet, lehetett a gond?!
Ha a valaszra rajovok akkor abbol tanulok es nem kovetem el azt a hibat kodolas kozben megegyszer!
Ha valakinek kell a problemas kod, szoljon nyugodtan, es kuldom a mukodo kodot es a hibas kodot. Ahogy emlitettem egy eleg komoly program apro resze ez a kod, igy nem tudom, hogy ugyan azt a hatast kelti e egymagaban, de jo lenne rajonni erre a problemara. Marcsak azert is mert lehet, hogy meg egy bugot talaltam az excelben :)
Megegyszer szeretnem megkoszonni az ehhez a temahoz hozzaszolok segitseget!
Igy van. Tényleg kell technikai lap. A te megoldásodban is volt. Csak te főlapnak nevezted. Imigyen:
Jelenleg az alábbi módon összegezem az országonkénti értékeket, A4 tartalmazza a főlapon az országmegnevezést.
És szó sem volt arról, hogy ezt a lapot akarnád kiküszöbölni. Hanem csak ezen lap frissitési procedurájának az egyszerűsítéséről. Erre adott Fferi50 is egy megoldást, meg én is. Vagy rosszul látom?
Tbando-nak és Fferi50-nek köszönöm a válaszokat. Azonban úgy látom, hogy a megoldások alapján nincs lehetőség a közvetlenül a munkalapokról feldolgozni az adatakokat, mindenképpen a technikai munkalap, vagy elrejthető oszlopok kellenek.
Én ezt úgy csinálnám, hogy lenne egy alaptáblázat a számokkal, egy vezérlőtáblázat, amelyben a cellák értéke 1 ha változzon a vele azonos poziciójú cellában levő szám, és nulla, ha nem: egy kódtáblázat, ami a vezérlő számokat és a hozzájuk tartozó betüket tartalmazza és végül a főtábla, amiben a betük változnak a vezérlő cella alapján az FKERES, a HAHIBA és a HA függvényekből összerakott képlettel vezérelve.
Egy egyszerű példán
Legyen a vezérlő cella az A1.
tab: A11-gyel kezdve a nálad a 2222, 2345 5699 és társaik
tab AA11 gyel kezdve 1, ha az az első táblázatban azonos helyűen levő szám ki van jelölve változásra, a többi üres
tab: A BA-oszlopban a vezérlő számok (1111,1234,2345 stb),a BB-ben pedig a hozzájuk tartozó betük ( FG, HB, GP stb)
tab: Főtábla a változó számokkal . CA11-be pedig az alábbi képlet, amit végigmásolsz a tervezett táblázatodban
A képlet, ha nem találja a vezérlő számot, vagy a cella nincs változásra kijelölve akkor az első táblázatbeli számot tartalmazza, egyébként meg a kombináltat.
A példa csak a problémakezelés elvét illusztrálja. Tehát a vezérléseket változtathatod, a táblázatkezelést pedig további feltételek beiktatásával kedvedre turbózhatod .
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
eseménykezelő eljárást, ahol Target az a cella, amelyben a változás történt.
pl.
Private Sub Worksheet_Change(ByVal Target As Range)
if not intersect(változásgeneráló cella - pl. range("A1") -,target) is nothing then
application.enableevents=false
a cellák megváltoztatását végző eljárás
application.enableevents=true
endif
End Sub
Így, ha más cellában történt változás, akkor nem generálódik cellamódosítás.
Hogy a módosítandó cellákat hogyan választod ki, na az egy másik kérdés szerintem (esetleg azt már tudod?), de ehhez tudnod kell azt, hogy a változásgeneráló celládban mi volt a változtatás előtti érték. Akkor a range.replace metódussal egy lépésben megoldható! Kukucskáld meg a hozzá tartozó helpet.
Szeretnék excelben egy cellát, ahova ha beírok egy számot (pl. 1234), akkor az excel automatikusan lecseréli bizonyos mezők (kb. 50 db össze-vissza) tartalmának utolsó két alfabetikus karakterét. Tehát pl. ez a kiinduló helyzet:
1111: 2222FG, 2345FG, 5699FG, stb.
beírom, hogy az 1111 helyett, hogy 1234: és a fentiekből 2222HB, 2345HB, 5699HB lesz.
Természetesen van egy táblázatom (elég nagy), amiben benne van, hogy 1111=FG, 1234=HB, 2345=GP, stb.
Ha nem is tudtok pontos megoldást, az is jó lenne, hogy egyáltalán milyen függvénnyel/eszközzel lehetne ezt elérni.
Nézd át légy szíves a kimutatás táblázatokról - és ahhoz kapcsolódóan a kimutatás diagramról - szóló help-et. Ha következetes a munkalapod felépítése, akkor néhány lépésben megkapod a kívánt eredményt.
eszkábálni szeretnék magamnak egy jól működő napi kiadások táblázatot. Írom már egy ideje, minden kiadott forintot feljegyzek, most szeretném kicsit fejleszteni, mert talán eljött az idő, hogy elkezdjek következtetéseket levonni a pénzköltési szokásainkból.
Hogy néz ki: vízszintesen vannak a kiadási tételek, az oszlopok sorrendje pedig: dátum, kategória (itt olyanok vannak, hogy 'kaja', 'kultúra', 'gyógyszer' stb), vásárlás helye, és utolsóként 'besorolás' (céges illetve magáncélú kiadás).
Az lenne a kérdésem, lehet-e, és ha igen, hogyan kell készíteni összesítéseket különböző szempontok alapján? Pl. csinálnék egy olyan kördiagramot, ami realtime-ban mutatja, hogy hogyan aránylik a céges a magánhoz, vagy pl mutatná a saját kiadásokon belüli arányokat.
Külön munkalapon nézném a grafikonokat, de lövésem sincs, hogy hogyan kell képletezni ahhoz, hogy a grafikonos munkalap x cellájába gyűjtse azokat (a másik munkalapon levő) C oszlopban szereplő összegeket, amely sor B oszlopában (kategória) a 'kaja' szó áll.
Nem olyan bonyas szerintem annak, aki ért hozzá, csak sajnos én máshoz értek. :)
Nézd meg légyszíves az Application.Interactive értékét nem állítod-e át valahol False-ra. Mert ez megtiltja a billentyűzetről és az egérrel való bevitelt, kivéve az inputra használható formákat pl. inputbox.
Ezek nagyon jo feltevesek, mindenkepp neki kell es fogok allni a feladatonkenti tesztelesnek. A munkafuzetet lehet menteni es bezarni, sot minden egyeb dolgot lehet rajta csinalni kivetel a billentyuzetrol cellaba irni de a makro tud a cellakba irni. A feladatok vegzese kozben semmi baj nincs, mindent megcsinal amit kell, ezert gyanakszom arra hogy a programban valamit elallitok az excelben amit nem allitok esetlwg vissza. A screenupdating szinte minden egyes modulban szerepel. Ezeket esetleg a keresesben megkeresem es annak a parjanak is szerepelnie kell a kod vegen.
Azt gondolom, itt valamilyen rejtett memória túlcsordulás lehet az ok (de ez találgatás szintjén van). Ha a feladatkezelővel történt kiszállás után simán újranyitod az excelt, nem mutat megnyitható - javított, mentett, stb. - másolatokat? Mert esetleg ebből is lehet következtetni, hogy mit sikerült végrehajtania és mit nem.
Egyébként meg - sajnos - marad az alapos, minden "menüágon" végigmenő tesztelés. Valamelyiken csak kibukik a probléma és akkor azt lehet tovább vizsgálni.
Még kérdések
csak kilépéskor van ez a jelenség, vagy feladatok végzése közben is "behal"?
a program közben kezel (megnyit bezár) más munkafüzeteket -azokban esetleg vannak (nem kívánt) makrók? Érdemes ezeket a műveleteket alaposan átnézni.
vannak nagy cellatartományokon végzett műveletek?
képernyőfrissítés kérdése (bár ez a VBA lapon nem játszik).
Az a rengeteg kod nem egy modulban van hanem egyik modul hivja a masikat attol fuggoen, hogy mire van a felhasznalonak szuksege. Minden erdemleges ujitasnal a verzioszamot noveltuk 1-el. Talan meg ez is segiteni tud abban hogy megtqlaljuk mi okozza a hibat.
Egy masik kerdes ami m8ndenkihez szol : ha valami valtozonak vagy pl Set WSS =Sheets("Start") ezeket a valtozo ertekeket vissza kell allitani a kod vegen ha igen akkor miert? Nem vagyok nagyon kezdo a VBAban de ezek valaszat meg nem talaltam meg sehol sem.
Egy update az elozo hozzaszolasomhoz, ami talan leszukiti a kort: ha ez a dolog megtortent, hogy az excelbol nem tudok kilepni akkor utana meg egy kicsi makrot sem tudok futtatni. Pl application.quit. ha a kodban allok es F8al probalok lepkedni akkor mar az elso F8nal mintha futtatna a kodot de a sarga kiemeles sem jelenik meg. Ez a screen updatehez tartozna?
Ha meg vagy győződve arról, hogy a program okozza a hibát, akkor meg lehetne próbálni, hogy kb a felénél elhelyezel egy exit sub-ot. Aztán ha az odáig futás után nem lehet belőle normálisan kilépni, akkor a program első felében van a hibát okozó utasítás, ha nem akkor a második felében. Ezután az exit subot átteszed a problémás rész feléhez, és újra teszteled a kiléphetőséget, majd az eredménytől függően a problémás részt megint felezve újra futtatsz. Így fokozatosan eljuthatsz a hibás sorig.
Talán. Mert az hogy nem minden futás után jelentkezik a probléma, az bizony gondot okozhat. Ezért a procedurát a kilépési probléma jelentkezése után kéne megcsinálni, ugyanazokkal a beállításokkal mint amikkel a probléma történt.
Egy baratommal csinaltunk egy komplexnek (makrobol) allo programot. Ma a munkahelyen kiprobaltam, ahol mukodott is rendesen egy hibaval (nem talalt egy fotot), ami nem is lenne gond, mert az a sor kommentelve lett. Korabban is tapasztaltam en is, es a baratom is, hogy ugyan a munkafuzetet be tudjuk zarni, de az Excelt nem. Nem minden futtatas utan jon elo ez a hiba. Csak a feladatkezeloben tudom leallitani az excelt, de mivel a munkahelyi gep le van vedve igy a feladatkezelo sem erheto el.
Ezt nem hiszem hogy termeszetes lenne az Excelnel. Biztos vagyok benne, hogy a program csinal az excellel valamit. Mivel kb 10000 kodsorrol beszelunk nagyon nehez lenne tesztelni es megtalalni mi okozhatja a hibat.
Még utánanéztem egy kicsit. Szerintem simán megoldható a problémád az Adatok, összesítés menüpontból. Kijelölöd az összesítő függvénynek az összeget.
Bejelölöd a feliratokat vegye a felső sorból és a bal első oszlopból. Hozzáadod a tartományokat egyszer. Az Excel megoldja azt, hogy egy munkalapra kerüljenek az országok adatai.
Ha új munkalap kerül be a füzetbe, csak annak a megfelelő tartományát kell hozzáadnod az összegező munkalaphoz.
Ezzel megvan az "árnyék" munkalapod.
A Fő munkalapon csak ezt kell összegezned:
Első oszlop = árnyék munkalap első oszlopa. Majd az összegző függvények a második oszlopba így:
Pl. A2=magyar, B2:=SZUM(Munka4!2:2), ha az árnyék munkalapod neve Munka4.
Ha az országok száma nem változik, akkor ehhez már nem is kell később hozzányúlnod.
Itt egy megoldás. Nem OFFSZET-tel, hanem FKERES-sel.
A minta példámon a nemzetek az alaplapokon a11-en kezdődnek, a hozzájuk tartozó boldogságaik pedig a b11-en.
Az összesítő lapon pedig:
A11:A20= nemzetek
B11:B20= szummázott boldogság
C11:D20= 01 és 02 lapok boldogságai
C10:D10= lapnevek
C8:D8= az adott laphoz tartozó fkeres tartomány
A kulcsképletek amiket értelemszerűen továbbmásolsz:
c8: =c10&”!a11:b20”
b11: =szum(c11:z11)
c11: =hahiba(Fkeres($a11;indirect(c$8);2;0);0)
Ha ezt a táblázatot megcsinálod mondjuk a z-oszlopig, , akkor az új lap bemásolásával és elnevezésével azonnal újraszummáz. A c..z oszlopokat akár el is rejtheted.
Nem tudom, ki állítja össze a heti jelentés munkalapokat? Nem lehet vele egyeztetni, hogyan csinálja?
Én mindenesetre csinálnék egy összesítő munkalapot (az előttem szólók javaslatait összegyúrva, ahol minden ország szerepel a sorokban és az oszlopokban az aktuális heti jelentés értéke). A második oszlopba pedig betenném az összegzőképletet ami a sor hátralevő celláira vonatkozik.
Ha mégsem sikerül rávenni az adatszolgáltatókat, hogy erre a munkalapra írják direktben a heti értéket, akkor is egyszerű rutinnal átmásolhatod rá az új információkat. Ezt a munkalapot akár el is rejtheted.
Az összegző jelentés eredmény celláiba pedig egyszerűen behivatkozod a háttér (összesítő) munkalap megfelelő celláját.
Sokkal könnyebb lenne egy munkalapra tenni az összes adatot. Így az országnevek nem szerepelnének feleslegesen sokszor és nem kéne mindig frissíteni a függvényedet.
Adott egy táblázat, amelynek az első munkalapjának A oszlopa Európa országmegnevezéseit tartalmazza, a B oszlopa pedig összesítetten egy, az országhoz tartozó értéket. (például boldog emberek száma).
Minden héten készül egy újabb munkalap a boldog emberekről, de nem minden ország jelent. A munkalapra csak a jelentő országok kerülnek.
Az összesítés az egyre bővülő munkalapokról készül.
Jelenleg az alábbi módon összegezem az országonkénti értékeket, A4 tartalmazza a főlapon az országmegnevezést
Amikor létrejön egy újabb munkalap, akkor bővítem az összegzést. Ezt a végtelenségig nem lehet.
Hogyan lehetne a munkalapokat úgy feldolgozni, hogy ne kelljen mindig egy újabb összeadás műveletet mögé biggyeszteni. Magyarán lehetséges-e a munkalap elnevezést változóba foglalva kezelni, vagy a munkalapokat tartományként értelmezni?
A tömbképlettel arra utasítod az excelt, hogy eredményezzen egy olyan tömböt a memóriájában, mintha a képletben megadott tömbök elemeivel egyenként végrehajtanád a képletbeli utasítást. Az esetedben pl. az összes C elemre nézze meg, hogy "aktív"-e, Ha igen, adja meg a hozzátartozó A-t, (ha nem akkor meg feltehetőleg az "" üresstringet. Tehát az összes C, A elempárra elvégezve a
=Ha(Ci="aktiv";Ai;"") müveletet
a kapott eredményömbön meghatározza annak a Max-át.
Az általad minden bizonnyal ismert szumha is alapjában véve egy tömbképlet, azzal a különbséggel, hogy az excel helyből összevonja a szum-ot és a ha-t, ezért nem kell tömbképletként bevinni. De minden további nélkül lehetne: A
=szumha(a:a;5;b:b) ugyanazt az eredményt adja mint a{=szum(ha(a:a=5;b:b))}
A tömbképlethasználatról a sugóban olvashatsz még.
****
ui. Egyébként azt hittem mindezeket tudod, mert mint a 22509-ben írtam, a te képleted is jó, ha tömbképletben viszed be.
Igen, majdnem. Egy dolog nem megy, hogy kell a területt megadni, hogy a selektáltba az aktív cellától egy fix celláig legyen a kijelölés, illetve a másik kijeleölés az aktív cella + aktív mellet +10?
Kérnék egy kis segítséget. Egy kis macrot akarok készíteni. Az lenne a feladata, hogy elindítva (mondjuk egy kép megnyomásával) az épp aktív cella (ahol áll) és mondjuk egy fix cella, pl. H120 közötti teljes területet kijelöli és egy másik lapra kimásolja. Ezen új lapról az első sort kitörli, majd a maradékot visszamásolja. Előtte az adott cella és a mellett levő, mondjuk 12 cella tartalmát kijhelöli és egy másik lapon egy újh sort szúr be, mondjuk a 3. sorba és ide másolja értékként és formátumként a kijelölteket.
Azt szeretném kérdezni, hogy az excelben van-e olyan futtatási mód, ami nem mutatja a futás közbeni munkafüzeti változásokat, hanem csak a végeredményt. Tehát mondjuk az alábbi makróban az A1-ben a 100 beírása elött nem villannak fel az 1-99 számok.
Persze. Most már nem kell a munkafüzeted, mert most már értem a dec. 31-t.
Amit viszont most nem értek (de kurvára ám), hogyha A1-be beirtad 2013.01.01-től és dec 31-ig lehúztad, abból hogyan lesz az A24 beírása az, hogy "aktiv" :)))))) ???
Tbando 22509-es hozzászólása már megadta a helyes megoldást. A képlet jó, csak tömbképletként kell bevinni. (Shift+ctrl+enter a végén az enter helyett.)
A képleted nem december 31-et ad vissza, hanem az utolsó kitöltött dátumodat. Írj hozzá, vagy törölj néhányat, és mindjárt azt kapod ereményül. (Most a megoldásra nincs ötletem, de sajnos időm sem a megkeresésére, talán majd később. )
A képleted nem december 31-et ad vissza, hanem az utolsó kitöltött dátumodat. Írj hozzá, vagy törölj néhányat, és mindjárt azt kapod ereményül. (Most a megoldásra nincs ötletem, de sajnos időm sem a megkeresésére, talán majd később. )
Range("A1").entirecolumn.autofit (Ide azt a cellát Ird be, amelyikben a kiválasztó listaforrás egy elem szerepel)
Ennek a szélességét felírhatod egy olyan cellába, amelyik "nem játszik".
pl. range("Y1").value=range("A1").columnwidth
ezután ahhoz a listaválasztó cellát tartalmazó munkalap kódlapjára a következőket írod be:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
dim isc as range Set isc = Intersect(Range("C1"), Target) If isc Is Nothing Then If Range("C1").ColumnWidth = Range("Y1").Value Then Range("C1").ColumnWidth = eredeti cellaszélesség Else Range("C1").ColumnWidth = Range("Y1").Value End If End Sub
Ha az eltárolt érték nem az listaválasztós munkalapon van, akkor a forma: Munkalapneve!range("Y1").value
Figyelj rá, hogy a columnwidth és a cells.width nem azonos mértékegységben számol. Ezért először nézd meg, hogy a kiválasztódnak mi a columnwidth értéke és azt írd az eredeti cellaszélesség értékének.
Számomra igen sok értelme és haszna van. A vezetőség különböző időpontokban kér visszamenőleg adatokat. És ezért van aktiv/inaktív mf-t ahol beállítom, hogy meddig vegye figyelembe az értékeket és végezze el az összeadást/kivonást stb.
Elkükdhetem de csak annyi hogy A1-be beirtam 2013.01.01-től és dec 31-ig lehúztam majd beirtam random értékeket meg aktiv/inaktív random mód.
Tervezés/tesztelés alatt van az egész még.
Az a lényeg, hogy egy helyen akarom állítani a dátumot és minden olyan ahol bejön anyag vagy kimegy anyag azt vegye figyelembe. Mert már jártam úgy hogy egyik oldalon egyik dátum volt kimenő oldalon meg teljesen más :D
A képletednek nem sok értelme van. Hogyan lehet egy dátum (A24) egyenlő aktiv v. inaktív szóval ill. a jelölésével? Meg azt se értem, hogyan ad a képleted dec 31-t. Szerintem csak akkor adhatna, ha A24<>F:F.
Na figyu. Én megírom itt neked az aktív napot adó képletet, te meg elküldöd nekem priviben hogyan kaptál dec 31-t. Kiváncsi lennék rá
Szóval az utolsó aktív napot adó képlet:
=Max(ha(F:F=äktiv";A:A)) Természetesen tömbképletként bevíve.
Amikor pl. lépésenként futtatsz egy programot, akkor is képes vagy előre - hátra mozogni az adott programban (asárga nyíl húzgálásával), időleges megállási pontot generálni (piros lesz a sor), a debug egyéb - változókhoz kapcsolódó szolgáltatásait használni, beleértve a program környezetének változtatását is. Pl. egymásba ágyazott rutinoknál lehetséges, hogy egy megállás után - ha nem tetszik amit csinál - elhúzod a sárga nyilat az end sub -ra, akkor egy lépés után a program visszalép a hívó rutinra. Ezután módosíthatod a hívott rutint és ismét meghívod, anélkül, hogy az egészet újra indítanád. Ezt teszi lehetővé a programban elhelyezett Stop utasítás. Itt a program megáll, előadja a VBA modul képernyőjét és kisárgítja a Stop utasítást. Kritikus helyekre szoktam beírni, ha már minden rendben, egyszerűen kidobom vagy kikommentelem belőle.
De gondolom ezeket Te is szoktad csinálni programírás-tesztelés során.
"Azt gondolom, hogy mivel ezek az utasítások (mind az End, mind a Debug -reset gombja) befejezik az aktuális projekt futását, természetes, hogy a változók aktuális értékei eltűnnek."
Ez már filozófia :)
"Stop utasítás viszont pont azt teszi lehetővé, hogy menet közben, egy adott állapotban megnézhessük a változók értékeit, sőt változtathassunk rajta, oda-vissza lépkedjünk a programban."
Az "oda"-lépkedés az megvan, de a "vissza"-lépkedés érdekelne. Azt hogy kell csinálni?
Igen, erről tudtam. Írtam is a 22486-ban. De nálam más okozta nullázást. Hogy mi, az a válaszaitok (a tied, meg fferié) szinergiája nyomán ugrott be. A Run/Reset. Elég béna voltam, hogy nem jöttem rá magamtól. De ez van. Köszönöm a közremüködésetek.
A cella kiválasztás eseményéhez kötheted a cella méret változtatás, de csak az egész oszlop méretét tudod megváltoztatni!
Ahhoz, hogy tudd, a cella szélessége mekkora legyen, először is meg kell jegyezned a lista szélességét. Az érvényesítési oszlopon (ami a lista elemeit tartalmazza) hajtsd végre az autofit metódust, egy változóban jegyezd meg az oszlop szélességét. Ezután akár el is rejtheted az érvényesítési oszlopot.
A cella kiválasztása esetén pedig átállítod az oszlopszélességet a megjegyzett értékre.
Ha másik cellát választanak ki, akkor az előző cellád oszlopszélességét visszaállítod az eredeti méretre.
Színezés:
Olyan feltételes szerkezetet készítesz (pl select case cellaérték ...), ami attól függő színt használ, hogy a lista melyik elemével egyezik a cella értéke.
Azt gondolom, hogy mivel ezek az utasítások (mind az End, mind a Debug -reset gombja) befejezik az aktuális projekt futását, természetes, hogy a változók aktuális értékei eltűnnek.
A programba beépített és Debug-olásra használt Stop utasítás viszont pont azt teszi lehetővé, hogy menet közben, egy adott állapotban megnézhessük a változók értékeit, sőt változtathassunk rajta, oda-vissza lépkedjünk a programban. Más kérdés persze, hogy bizonyos programozási műveletek ilyen esetben tönkrevág(hat)ják a memóriát és belehal a projekt.
Delila10 már korábban segített egy olyan kérdésbe amikor Pl A1 cella érvényesítést tartalmaz és kijelölöm egy lista elemét(pl: 2) majd A2 cella ugyan azt az érvényesítést tartalmazza és ott kijelölöm ugyan azt a lista elemet mint ami at A1 cellában van (2),akkor az A1 cellából eltünjön a listaelem(2) és üresre vált és csak az A2 tartalmazza. Ezt a makrót használom de most azt szeretné ha megoldható lenne hogy a listaelemekhez és nem a cellához megjegyzéshez hasonlító fugró üzenet jelenjen meg. Az a célom hogy egy személyazonosításhoz hasonló ablakocska jelenjen meg amikor a kurzort a cella fölé viszem. A személyazonositó kis ablakocskába szeretnék elhelyezni egy kisméretű fotót és szöveget. Hu itt még nincs vége. Technikai okokból a cellák méreteit 0,9x0,9 es méretre kell kicsínyítenem és azt szeretném ha a cella kijelőlésekor a cella a cellában lévő lista méretére szétcsusszon. Valamint ha a lista bármely elemét az A1-es cellába jelenítem meg akkor a cella színe legyen piros, Ha A2 jelenítem meg akkor zöld és így tovább kb 10 színnel A10 ig. Nos nem tudom hogy ez így megvalósítható e de ezt szeretném. Aki tud kérem segítsen. Köszönöm.
Aztán olyan is van, hogy új változót akarsz felvenni a szubrutinba, vagy egy korábbi változó típusát megváltoztatod. Ilyenkor kiírja az Excel, hogy ezzel a lépéssel Reset-eled a projektedet. És tényleg :)
Nem nagyon bírok képet feltölteni, pedig úgy egyszerűbb lenne...
Szóval az a négyzet alakú gomb, ami a makró futását megállítja. A VB editor eszköztárában van. Valójában nem Stop hanem Reset felirat jelenik meg, ha az egeret fölé viszed, csak akkor lusta voltam megnézni, amikor az előbbit írtam. De minden épeszű távirányítón, magnón, lemezjátszón így jelölik a Stop funkciót.
Az eddigieken kívül akkor is nullázódnak a változók, ha futási hiba esetén nem a Debug hanem az End gombra kattintasz.
Emellett a Te Exceled már korábban is produkált érdekes dolgokat, szóval lehet, hogy egyedi jelenséggel állunk szemben :)
Kösz Jimmy! Az end utasítás valóban nulláz. De javítás közben még sosem adtam ki az end utasítást. Tehát kell még lennie egyéb nullázóknak is. A stop gombbal meg még nem találkoztam. Az micsoda?
Azt elfelejtettem megírni, hogy milyen javítgatásoknál történik a reset. Nos, megírom az összetett makrót, majd a futási sorrendjüknek megfelelően egyenként nézem, hogy mit csinálnak. Ha hibát tapasztalok, javítom. Ha nyilvánvaló, hogy ezzel megváltozhattak a modulváltozók értékei, akkor újra kezdem egészet. De ha a javítás nem érintette a változókat, akkor csak a subrutint ellenőrzöm újra. Sok esetben ez elég is. De néhányszor nem, és ilyenkor eltart egy ideig amíg rájövök, hogy azért, mert a változók mégiscsak lenullázódtak.
Kb. én is itt tartok. Hogy a javítgatás belepiszkál a memóriába. Van amikor egy felugró ablakban ezt ki is írja. Pl. ha kreálok egy új változót. Ilyenkor természetes a reset. De más esetekben nem ír ki semmit. Csak nulláz. Más javítgatásoknál, meg semmi probléma.
Nem igazán gondolkodtam még el ezen, természetesnek vettem, hogy ha hibával száll ki a program, akkor újraindításkor lenullázódnak a változók.
Mikor nullázódnak le? Amikor futás közben egy javítás után meg akarod nézni az értékét ismételten, vagy amikor futás után belejavítasz valamibe és újraindítod?
Futás közbeni javításnál én úgy emlékszem, hogy a with - endwith közötti belepiszkálásra szokott visszabeszélni, hogy akkor most reseteli az egészet, ha belenyúlok. Ilyenkor általában békén szoktam hagyni.
Szerintem azok a javítások nullázzák a változókat, amelyek miatt belepiszkál a memóriába a VBA. Szóval programírás-javítás közben előfordul ez a reset, kóddal futás közben nem lehet előidézni szerintem (ami azért is csúnya lenne, mert akkor a saját mutatóit is hazavághatná vele gondolom).
Egyre határozottabban az az érzésem, hogy a duplaküldéseket nem a kapcsolat lelassulása okozza, hanem, hogy az első hsz elakad, amit a második átlök. Tehát valami bugos fórummotor fejlesztés történhetett mostanában.
Tehát szerintem egyesével kell a modul-változókat is nullára, üres stringre ...stb. állítani értékadással.
Én is így gondoltam. De nem egészen így van. Mert amikor egy összetett makrót subrutinonként javítgatok, már többször előfordult, hogy a javítgatás során a modulváltozók lenullázódtak, és még nem jöttem rá, hogy mely javítgatási lépésekkel idéztem ezt elő. Ehhez várnék itt valami támpontot.
Tehát szerintem egyesével kell a modul-változókat is nullára, üres stringre ...stb. állítani értékadással.
Én is így gondoltam. De nem egészen így van. Mert amikor egy összetett makrót subrutinonként javítgatok, már többször előfordult, hogy a javítgatás során a modulváltozók lenullázódtak, és még nem jöttem rá, hogy mely javítgatási lépésekkel idéztem ezt elő. Ehhez várnék itt valami támpontot.
Ha olyan utasításra gondolsz, amely egy lépésben megoldaná a resetet, akkor én olyat nem találtam eddig (igaz, nem is kerestem). A help azt írja, hogy a modulszintű változó addig fogja a memóriát, amíg be nem nem állítod a kezdeti értékre. (Module-level variables consume memory resources until you reset their values, so use them only when necessary.) Mivel minden változótípusnál más a kezdeti érték, azokat sajnos egyesével kell beállítani olyan értékre, amit a futás kezdetén kap:
"When a procedure begins running, all variables are initialized. A numeric variable is initialized to zero, a variable-length string is initialized to a zero-length string (""), and a fixed-length string is filled with the character represented by the ASCII character code 0, or Chr(0).Variant variables are initialized to Empty. Each element of a user-defined type variable is initialized as if it were a separate variable.
When you declare an object variable, space is reserved in memory, but its value is set to Nothing until you assign an object reference to it using the Set statement."
Tehát szerintem egyesével kell a modul-változókat is nullára, üres stringre ...stb. állítani értékadással.
Természetesen nagyon hasznos és a program jó áttekintését teszi lehetővé a "nevesített" paraméterek használata. Ott, ahol sok paraméter van, én is használom mindig, de ha csak egy-két paramétert lehet megadni, akkor nem gyötröm magam vele. Egyébként nem kötelező a név használata, akkor viszont arra figyelni kell, hogy milyen sorrendben adod meg a paraméter értékeket - vesszővel elválasztva!- (és az elsőnél nem kell vessző!!! csak a szóköz).
Ez a mostani eset hasonló, a múltkorihoz. Momentán egy rögzített makrót a legkevesebb változtatással akartam prezentálni egérkirálynak. Hogy legközelebb magai is képes legyen a változtatásokra. A select szelekciója a magasabb osztályok tananyaga. :))))
Mi a fene lett ezzel a fórummotorral? Látva a hozzászólásodat, legalább 3 percet vártam az ismételt elküldéssel, közben vagy 10x kilépve-belépve a fórumba
Mivel azt írod hogy kezdőként a rögzítésből próbálod kitalálni a vba logikáját, bemutatom neked, hogyan kellett volna változtanod a rögzítéseden, hogy akárhány új lapot kreáljon. Próbáld megérteni, a jövőben hasznos lesz.
Mivel azt írod hogy kezdőként a rögzítésből próbálod kitalálni a vba logikáját, bemutatom neked, hogyan kellett volna változtanod a rögzítéseden, hogy akárhány új lapot kreáljon. Próbáld megérteni, a jövőben hasznos lesz.
Arra gyanakodtam, hogy az lehet esetleg a hiba oka, hogy elfelejtettem közölni, hogy a képlet tömbképlet, amit a ctrl+shift-tel kell beírni. Ám most megnéztem a normál bevitelű változatot, az nullát ad eredményül, tehát nem azt, ami nálad jelentkezett. Így tehát változatlanul kiváncsi vagyok, és várom a hibás füzetet.
kipróbáltam, de az a gond, hogy amikor max értéket számol az Excel, az egész tartomány legmagasabb értékét rendeli hozzá az A,B,C verziőjú termékeknél, vagyis cellánként halad és nézeget, nem csinál összehasonlítást a konkrét termék A,B,C típusú termékeinek értéktömbjében.
Elképzelni sem tudom, hogy mi lehet nálad a probléma. Nálam úgy működik a képlet, ahogy szeretnéd. És bár most ugyan már okafogyott lenne a használata, mert már születtek praktikusabb megoldások is, engem azért érdekelne, hogy mi lehet nálad a hiba oka. Ezért megköszönném, ha elküldenéd priviben a hibás munkafüzetet, megjelölve benne, hogy hol ad hibás eredményt.
A makróban az "A","B","C" mindig a cellák oszlop azonosítóját jelenti, az x,y pedig a sorokat jelenti. Ha változatlanul másolod be, akkor működnie kellene, ha előtte lerendezted az "A" oszlopot terméknévre. Ha nincs rendezve, akkor az is beírható a makróba.
Más: Tbandóhoz írtad a kérdést.
Igen, van olyan lehetőség, hogy létrehozz egy új munkalapot:
worksheets.add beszúr egy új munkalapot az aktív munkalap elé és azt aktíválja. utána átnevezheted.
A makróban az "A","B","C" az a cellák oszlop azonosítóját jelenti egyébként. Ha pontosan bemásolod amit írtam, akkor elvileg működnie kellene, feltétel az, hogy az "A" oszlop terméknévre le van rendezve inditás előtt. Ha nincs, azt is bele lehet tenni a makróba.
Kérdés:
Miért makró? Nem jó az amit Tbandó-val közösen javasoltunk? (Sorbarendezés, ismétlődések kivétele.)
Sub izé() Dim wsForrás As Worksheet, wsCél As Worksheet Dim rngForrás As Range, rngCél As Range Dim c As Range, rngFeltétel As Range, rngTalálat As Range
Set wsForrás = ThisWorkbook.Worksheets("Munka1") Set wsCél = ThisWorkbook.Worksheets("Munka2")
'törlünk mindent a cél munkalapon wsCél.Cells.Delete
'forrás tartomány kijelölése Set rngForrás = wsForrás.Range("A1", wsForrás.Range("A" & wsForrás.Rows.Count).End(xlUp))
'ciklus For Each c In rngForrás Set rngTalálat = wsCél.Range("A:A").Find(what:=c, lookat:=xlWhole, LookIn:=xlValues) If rngTalálat Is Nothing Then rngFeltétel(2) = c Set rngCél = wsCél.Range("A" & wsCél.Rows.Count).End(xlUp).Offset(1) rngCél = c rngCél.Offset(, 1) = "Standard" rngCél.Offset(, 2) = Application.WorksheetFunction.DMax(rngForrás.Resize(, 3), 3, rngFeltétel) End If Next End Sub
A makró helyes működésének feltételei:1) A forrás és cél munkafüzetek neve megfelelően be van állítva (a fenti példában Munka1 és Munka2)
2) Az adatok az A, B, C oszlopokban helyezkednek el, olyan sorrendben, ahogy a 22439-ben megadtad. Az 1-es sorban fejléc van, utána összefüggő adatsor.
3) Az adatsor alatt nincs semmi (pl. összegzés, átlagolás, lábléc, másik táblázat, stb.)
A makró amúgy a AB.MAX függvényt használja, és a ciklus lefutása előtt a cél munkalap teljes tartalmát törli.
Köszi a részletes makró leírást is, de nem tudtam jól megcsinálni, mivel szintaktikai hibákba futottam bele - ez még magas az én tudásszintemhez.
Elég kezdő vagyok, elsősorban rögzítek, és abból következtetek vissza a makró működésének logikájára, meg youtube videókból lesegetek el dolgokat. Szóval még gyerekcipős az én makróírási képességem :-)
A gondom az volt, hogy nem tudtam, amikorA,B,C-re hivatkozol, mikor jelenti az Excel oszlopneveket, mikor magát a hasonló nevű termék azonosítót, ráadásul konkrét munkafüzetben, konkrét lapokkal dolgozva nem tudom behivatkozni ezeket a munkalap neveket.
Nagyon jó lenne ilyen elegáns és egyszerűbb, valódi makró megoldást nyújtani, tehát nem makrórögzítéses verziót csinálni, mert ott túl sok minden van benne, ami nem kell igazából.
Köszönöm a Te javaslatodat is, pontosan ezt csináltam, létrehoztam egy új munkalapot, és ott dolgoztam a javasoltak szerint, viszont itt merül fel némi gondom, amit az előző hsz-ban leírtam.
Köszönöm a javaslatot, kipróbáltam, de az a gond, hogy amikor max értéket számol az Excel, az egész tartomány legmagasabb értékét rendeli hozzá az A,B,C verziőjú termékeknél, vagyis cellánként halad és nézeget, nem csinál összehasonlítást a konkrét termék A,B,C típusú termékeinek értéktömbjében.
Viszont a másik ötlet, a két szintű sorbarendezés és ismétlődések eltávolítása nagyon jó ötlet volt, köszönöm, ez működik, és ezt rögzítéssel makróztam le, ahogyan javasoltad.
Most már csak egy gondom van: hogyan tudom megoldani azt, hogy ne a makrórögzítéssel létrehozott új sheet nyitást csinálja, ahová berakja a Sheet1 abszolút nevet, hanem konkrét új munkalap létrehozó parancsot tudjak betenni, és azonnal nevezze is át newprice-ra?
Arról van szó, hogy ha egyszer lefuttatom a makró rögzítéses programot, finomítgatom stb, majd újra lefuttatnám, már hibára fut ott, hogy az Excel az új munkalap létrehozásakor a makró elején nem találja meg a Sheet1-et, hiszen automatikusan Sheet2-t hoz fel az Excel (mivel már használatban volt Sheet1 korábban).
Hiába törlöm ki a felesleges Sheet 1-et, utána akkor is Sheet2 stb, növekvő sorszámozású üres lappal indít.
Nem szeretném a felhasználót megkérni arra, hogy előre hozza létre a newprice nevű munkalapot, pedig ez kiküszöbölné a problémát. Ok, ő elvileg csak egyszer futtatja le a programot, és így nem lehet gond, de mi van, ha eszébe jut valami, töröl valamit a forrás fájlban, majd újra futtatná a programot? Akkor már ő is hibára fog futni.
A kérdés tehát az, hogy van-e olyan közvetlenül kiadható utasítás, mellyel létrehozok a makró elején egy új munkalapot, és függetlenül az aktuális Sheetx névtől azonnal átnevezi newprice névre?
Van az épfileben vmi macro. Az alaplap http linkeket hoz minden termékre. Egy macro elindításával e linkek alapján Rec-be letölti az összes terméket egy oszlopba a kódok mellé. Ezt ki lehetne használni?
E lépéseket természetesen makrósíthatod is, a legkönnyebben a makrórőgzítő bekapcsolásával, majd a kapott makró finomításával, amivel szerintem te is megbirkózol. Ha mégsem, jelentkezz újra. Valaki biztos segít. Akár én is.
A ciklus kulcsa legyen a termék neve (első oszlop). A ciklus addig tart, míg a következő sorban is ugyanez a termék van.
Cikluson belül: első sor: bemásolod a termék nevét, a tipusa standard, bemásolod az árat a megfelelő cellába.
Belső ciklus:Ha a következő sorban ugyanez a termék van, akkor megnézed, hogy az ár melyiknél nagyobb, azt hagyod meg a listában.
Ha másik termék van a következő sorban, akkor ciklus vége.
Ha üres cellához értél az "A" oszlopban, akkor a külső ciklusnak is vége.
Feltétel, legyen sorba rendezve termék szerint a forrásod.
Ha a terméknév mellet még az ár oszlop szerint is sorbarendezed max legyen elől feltétellel, akkor a belső ciklus csak sima továbblépés a következő termékre!!!
Pl:
kulcs=forras.range("A2").value
x=2 'a forrás sort számolja
y=2 ' a lista sort számolja (a fejlécet tekintem első sornak)
Köszönöm! Tökéletes minden! :) Habár random nem veszi észre de ez a vonalkódolvasó file hibája. Mert manuálisan kitöltöttem egy ilyet ahol minden klappolt. Már szívtam meg, hogy néha szövegként kell felismertetni néha meg számként a cellákat...