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.
Szarvashibát követtem el. Többeket (ScreenUpdating, DisplayAlerts) kikapcsoltam, és azzal voltam, hogy ezek között volt az EnableEvents is. Most vettem észre a hiányát, hogy rám olvastad.
K ö s z ö n ö m!
Off: Mikor alszol? Éjjel, és hajnalban is itt vagy. On:
Lehet, hogy a Selection.PasteSpecial Paste:=xlPasteValues helyett van olyan módszere az értékbeillesztésnek, amit nem ismerek, és nem kell a másolat helyére állni előtte?
Arról a bizonyos 11. lapról készítek másolatokat egy ciklusban, ahol szükségszerűen a másolt lap lesz aktív, akkor pedig az első lap hivatalból elé ugrik. Most a másolatok készítese után beírtam, hogy szaladjon vissza az első a helyére.
Eddig irányított beillesztéssel, értékeket illesztettem be az elsőről a 11-n. lapokra, annál rá kellett állni az n-re. Sima másolásnál nem szükséges az n. lapra állás. Ezt végül másképpen, hivatkozásokkal oldottam meg.
A teljes kód külsős rendszeren nem tesztelhető, mert a kód nagy része adatokat importál a vállalatirányítási rendszerünkből. Ha kíváncsiságból mégis szeretnél ránézni, akkor megállítom az aktuális eljárásnak megfelelő formánál és elküldöm a kód más rendszerből is használható részét. (Előtte azért letesztelem, hogy pusztán a kivágott kóddal is megakad-e, vagy csak a teljessel együtt. (Sanszos, mert bizti az aktuális kódban van valami, amitől bugzik.)
De igazából csak jó lenne az a teljes kód, mert így nem nagyon lehet reprodukálni a problémát. Van a topikleírásban egy link, hogy hová lehet pakolni a hosszú kódokat.
Ha ezt bezárom egy eljárásba, akkor azt teszi, amire hivatott. Amint beteszem a programba, onnantól csak az "A" oszlopot hajlandó elrejteni. -.- Gondoltam, hogy lehet, hogy sok az agyának, mert a 800. sor után kerül sorra, addigra lehet befárad az Excel, vagy nem is tudom... Tehát szétszedve + range lecserélve, biztos, ami ziher
2:
Columns("A:A").EntireColumn.Hidden = True
Columns("F:F").EntireColumn.Hidden = True
Columns("L:M").EntireColumn.Hidden = True
Columns("O:S").EntireColumn.Hidden = True
A 2. verzió is csak az "A"-t rejti el a programban futtatva. Sebaj, biztos retardáltra dolgozza magát az Excel, ezért összefolyik neki a parancs, ahogy nekem a betűk a szemem előtt. Íme, a never go full retard elvnek ellentmondó próbálkozás is:
3:
Columns("A:A").EntireColumn.Hidden = True
Cells(1, 2).Select 'fake
Columns("F:F").EntireColumn.Hidden = True
Cells(1, 3).Select 'fake
Columns("L:M").EntireColumn.Hidden = True
Cells(1, 2).Select 'fake
Columns("O:S").EntireColumn.Hidden = True
Persze ez is csak az A-t rejti el. Nem értem, hogy mi van... Egyébként minden próbálkozás az eredményt tekintve kiváló, ha szubrutinként hívom meg... De ez így nagyon nem elegáns. A kódot nem vágnám be, mert hosszú, de oszloptörlések vannak közvetlenül az elrejtés előtt a kódban. Ha ez lenne a baj, akkor sem értem...
Egy idétlen krimi nézése közben eszembe jutott a megoldás, míg a képernyőn gyilkolászott a tettes.
Mikor a napokat tartalmazó lapokon haladtam a ciklussal (11-től az utolsóig), az első lap mindig az aktuális elé furakodott a remek makród mellékhatásaként, felborítva a sorrendet. Ezt sikerült megoldanom: a ciklusba beírtam, hogy szaladjon vissza a helyére.
Úgy értettem, hogy egy olyan riport elkészítése életszerű lehet, ahol az előző évvel együtt folytatólagosan kérik a hetek megszámozását. Ahogy például a hónapokkal is megteszik az annuitásos törlesztőszámításnál. Ott sem 1-12 hónap van, 1-60 hónap pl. az 5 éves hitelnél. Persze hétnél ez nem jellemző, de találkoztam én már mindenféle váratlan dologgal.
Az említett pédához természetesen nem illik, kizárólag azzal példálóztam, hogy mivan, ha mégis... alapon kerüljük már meg, hogy bal() fgv helyett minden eshetőségre egy arra valót használunk, ami szépen megformázza azt a számot (szöveg())
Köszönöm. Mint kiderült, sajnos az én feladatomhoz nem jó.
Van 10+1 lapom. A +1 tartalmazza a hónap első napjának adatait. Agyba-főbe formázott, hétköznap, szombat, vasárnap, és ünnepnap oszlopai különböző háttérszínekkel a megadott dátum szerint.
Egy makró bekéri az évet és hónapot. A 11. lapból annyit másol a füzet végére, ahány nap szükséges az adott hónaphoz, pl. nem szökőévben februárnál 27-et.
A napok lapjai a füzet első lapjáról vesznek adatokat, ezért lett volna jó, ha az mindig az aktuális lap mellett van. Az n-edik lapra állva az első lap az n-1-edik helyre lép. Viszont ha rálépek az elsőre, az előre szalad, és ott vagyok, ahol voltam.
Kihagyhatnám az előre fuss utasítást, marad az első lap az n-1-edik helyen. Akkor meg más hiba lesz. Egy másik makró az elsőről irányított beillesztéssel másol oszlopokat a napok lapjaira. Itt a For lap% = 11 To Worksheets.Count bolondul meg, mert a korpa közé keveredett a disznó.
Olyasmire gondoltam, hogy ha pl. Munka1-en egy képlet munkalapokon átívelő összeadást tartalmaz (pl. lásd itt: http://www.officearticles.com/excel/sum_the_same_cell_in_multiple_microsoft_excel_worksheets.htm), akkor a lapok átrendezése rögtön körkörös hivatkozást fog okozni, ami beláthatatlan következményekkel járhat. Nekem pl. teszteléskor felugrott a körkörös hivatkozás című ablak, és azóta sem tudom bezárni :-)
Private Sub Workbook_SheetActivate(ByVal Sh As Object) Application.EnableEvents = False Application.ScreenUpdating = False If Sh.Name <> "Munka1" Then If Sh.Index > 5 Then ThisWorkbook.Worksheets("Munka1").Move before:=Sh Else ThisWorkbook.Worksheets("Munka1").Move before:=ThisWorkbook.Worksheets(1) End If Sh.Activate End If Application.ScreenUpdating = True Application.EnableEvents = True End Sub
"Persze ha valami miatt fontos a lapok sorrendje, akkor ez a megközelítés nem jó."
Feltételezem, hogy ha fontos is a lapok sorrendje, az nem az adatbevitel közben érdekes. Ezért el tudom képzelni, hogy elegendő a munkafüzetből való kilépéskor helyreállítani:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Ez azt csinalja, hogy minden hét ele berak egy nullat, majd jobbrol (azaz a vegerol visszafele) 2 szamjegyet mutat. Ergo 1-bol 01 lesz es 01 latszik, 12bol 012 lesz de szinten csak 12 latszik.
Megj.: a RIGHT-ot nemtom mi magyarul, majd az okosok megmondjak :)