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.
Jómagam WIN10-et és Excel2021-et használok. Nem bírtam reprodukálni a hibát.
Egy esetben nem állított be jelszót, ha teljesen üres volt a VBA project. De amint írtam bele valamit, akkor már be tudtam állítani rá jelszavas védelmet.
Sub FormatDate(cell As Range, diff As Long) Debug.Print "Színezés - diff: " & diff If diff = 0 Then cell.Interior.Color = RGB(0, 0, 255) ' Kék - pontos egyezés Debug.Print "Kék: " & cell.Address ElseIf diff > 0 Then cell.Interior.Color = RGB(255, 0, 0) ' Piros - már lejárt Debug.Print "Piros: " & cell.Address ElseIf diff >= -30 Then cell.Interior.Color = RGB(255, 255, 0) ' Sárga - 30 napon belül Debug.Print "Sárga: " & cell.Address Else cell.Interior.Color = RGB(0, 255, 0) ' Zöld - 30 napon túl a jövőben Debug.Print "Zöld: " & cell.Address End If End Sub
A kérdést sem tudom feltenni:( De nem működik a színezés:( A lényeg ogy évváltás szökőév stb figyelembevételével valami miatt nam az igazi.
A lejárt dátum piros
ami hamarosan lejár sárga (ez esetben 30 napos intervallum)
aznapi kék;
ami meg több mint 30 napig érvényes legyen zöld:) Aktuális dátumhoz viszonyítva
Köszönöm!
Sub LejaroEllenorzes() Dim wsTotal As Worksheet Dim wsLejaro As Worksheet Dim lastRowTotal As Long Dim lastRowLejaro As Long Dim i As Long Dim currentDate As Date Dim cellValue As String Dim diffK As Long, diffL As Long, diffO As Long, diffR As Long Dim találatCount As Long Dim dateK As Date, dateL As Date, dateO As Date, dateR As Date
' Munkalapok beállítása Set wsTotal = ThisWorkbook.Sheets("Total") Set wsLejaro = ThisWorkbook.Sheets("Lejárat")
' Az aktuális dátum meghatározása currentDate = Date
' Lejárat munkalap törlése a korábbi adatok eltávolításához wsLejaro.Cells.Clear
' Az oszlopfejlécek másolása a Total munkalapról a Lejárat munkalapra wsLejaro.Cells(1, 1).value = "Név" wsLejaro.Cells(1, 2).value = "Szül. dátum" wsLejaro.Cells(1, 3).value = "EBK alap" wsLejaro.Cells(1, 4).value = "EBK MIR" wsLejaro.Cells(1, 5).value = "Orvosi érvényes" wsLejaro.Cells(1, 6).value = "Poliol spec. oktatás érv."
' A Total munkalapon az utolsó sor meghatározása lastRowTotal = wsTotal.Cells(wsTotal.Rows.Count, "Y").End(xlUp).row Debug.Print "Utolsó kitöltött sor az Y oszlopban: " & lastRowTotal
' Az Lejárat munkalapon az első üres sor meghatározása lastRowLejaro = 2 ' Az adatok a második sortól kezdődnek
' Találatok számlálója találatCount = 0
' A Total munkalapon végigiterálunk For i = 2 To lastRowTotal ' Ellenőrizni, hogy az Y oszlop "aktív" vagy "inaktív" cellValue = wsTotal.Cells(i, "Y").value Debug.Print "Row " & i & ", Y oszlop értéke: " & cellValue
If cellValue = "Aktív" Then ' Ellenőrizni, hogy a dátumok valódi dátumok és nem üresek If IsDate(wsTotal.Cells(i, "K").value) And wsTotal.Cells(i, "K").value <> "" Then dateK = DateValue(wsTotal.Cells(i, "K").value) diffK = DateDiff("d", dateK, currentDate) Debug.Print "K oszlop dátuma: " & dateK & ", diffK: " & diffK Else diffK = -9999 ' Ha nincs érvényes dátum, beállítunk egy nem létező eltérést Debug.Print "K oszlop érvénytelen dátum" End If
If IsDate(wsTotal.Cells(i, "L").value) And wsTotal.Cells(i, "L").value <> "" Then dateL = DateValue(wsTotal.Cells(i, "L").value) diffL = DateDiff("d", dateL, currentDate) Debug.Print "L oszlop dátuma: " & dateL & ", diffL: " & diffL Else diffL = -9999 ' Ha nincs érvényes dátum, beállítunk egy nem létező eltérést Debug.Print "L oszlop érvénytelen dátum" End If
If IsDate(wsTotal.Cells(i, "O").value) And wsTotal.Cells(i, "O").value <> "" Then dateO = DateValue(wsTotal.Cells(i, "O").value) diffO = DateDiff("d", dateO, currentDate) Debug.Print "O oszlop dátuma: " & dateO & ", diffO: " & diffO Else diffO = -9999 ' Ha nincs érvényes dátum, beállítunk egy nem létező eltérést Debug.Print "O oszlop érvénytelen dátum" End If
If IsDate(wsTotal.Cells(i, "R").value) And wsTotal.Cells(i, "R").value <> "" Then dateR = DateValue(wsTotal.Cells(i, "R").value) diffR = DateDiff("d", dateR, currentDate) Debug.Print "R oszlop dátuma: " & dateR & ", diffR: " & diffR Else diffR = -9999 ' Ha nincs érvényes dátum, beállítunk egy nem létező eltérést Debug.Print "R oszlop érvénytelen dátum" End If
' Ha bármelyik dátum 30 napon belül van, vagy már lejárt és 30 napon belül volt If (diffK >= -30 And diffK <= 30) Or (diffL >= -30 And diffL <= 30) Or (diffO >= -30 And diffO <= 30) Or (diffR >= -30 And diffR <= 30) Then ' A találatokat átmásolni a Lejárat munkalapra wsLejaro.Cells(lastRowLejaro, "A").value = wsTotal.Cells(i, "A").value ' Név wsLejaro.Cells(lastRowLejaro, "B").value = wsTotal.Cells(i, "E").value ' Szül. dátum wsLejaro.Cells(lastRowLejaro, "C").value = wsTotal.Cells(i, "K").value ' EBK alap wsLejaro.Cells(lastRowLejaro, "D").value = wsTotal.Cells(i, "L").value ' EBK MIR wsLejaro.Cells(lastRowLejaro, "E").value = wsTotal.Cells(i, "O").value ' Orvosi érvényes wsLejaro.Cells(lastRowLejaro, "F").value = wsTotal.Cells(i, "R").value ' Poliol spec. oktatás érv.
' Dátumok formázása színnel Call FormatDate(wsLejaro.Cells(lastRowLejaro, 3), diffK) ' 3 = C oszlop Call FormatDate(wsLejaro.Cells(lastRowLejaro, 4), diffL) ' 4 = D oszlop Call FormatDate(wsLejaro.Cells(lastRowLejaro, 5), diffO) ' 5 = E oszlop Call FormatDate(wsLejaro.Cells(lastRowLejaro, 6), diffR) ' 6 = F oszlop
' Sorok növelése a következő találatra lastRowLejaro = lastRowLejaro + 1 találatCount = találatCount + 1 End If End If Next i
' Ellenőrizzük, hogy van-e találat If találatCount = 0 Then MsgBox "Nincs találat!" Debug.Print "Nincs találat!" Else MsgBox találatCount & " találat van." Debug.Print találatCount & " találat van." End If
' Oszlopok szélességének beállítása a Lejárat munkalapon wsLejaro.Columns("A:F").AutoFit End Sub
Sub FormatDate(cell As Range, diff As Long) Debug.Print "Színezés - diff: " & diff If diff = 0 Then cell.Interior.Color = RGB(0, 0, 255) ' Kék - pontos egyezés Debug.Print "Kék: " & cell.address ElseIf diff < 0 Then cell.Interior.Color = RGB(255, 0, 0) ' Piros - már lejárt Debug.Print "Piros: " & cell.address ElseIf diff <= 30 Then cell.Interior.Color = RGB(255, 255, 0) ' Sárga - 30 napon belül Debug.Print "Sárga: " & cell.address Else cell.Interior.Color = RGB(0, 255, 0) ' Zöld - 30 napon túl a jövőben Debug.Print "Zöld: " & cell.address End If End Sub
Sajnos csak makróval megy a módosítás, mert csak úgy lehet összekötni a változásokat.
A munkalap kódlapjára másold be ezt:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 11 And Target.Column = 1 Then Target.Offset(0, 1).Value = Application.Names(Target.Value).RefersToRange.Cells(1) End If If Target.Row = 11 And Target.Column = 2 Then Target.Offset(0, 1).Value = Application.Names(Target.Value).RefersToRange.Cells(1) End If End Sub
(Lapfülön jobb egérgomb - kód megjelenítése)
Ezután engedélyezned kell a makrók futtatását és makróbarátként kell mentened a fájlt.
Többszintű lista adatérvényesítésével kapcsolatban van kérdésem. Megoldható-e, ha egy magasabb szintű listaelemet módosítok, hogy az alacsonyabb rendűek törlődjenek? Na ez még nekem sem érthető... Inkább egy példa. Csináltam egy példa táblázatot. Első nekifutásra kiválasztottam a "Gyümölcs"-"Körte"-"Vilmos" adatsort. Eddig OK. Ám ha a legfelső szinten a Gyümölcsöt Zöldségre változtatom, a kiválasztás többi eleme (Körte-Vilmos) változatlan marad ami nyilván nem jó. Mit lehet tenni ez ellen?
Nem szeretném most arra terelni az eszmecserét, hogy mi lesz akkor, ha elmész/elküldenek a cégtől. Nélkülözhetetlen/pótolhatatlan ember nincs. :(
A védelemről:
Az Excel védelme alapvetően a felhasználók "véletlen" módosításainak megakadályozását szolgálja, elég szofisztikált módon, de nem megkerülhetetlenül/feltörhetetlenül.
A makrókat is lehet védeni a VBA nézet Tools - VBA project Properties - Protection fülön jelszóval is. De ez sem feltörhetetlen.
Ezért biztosabb az, ha magát a fájlt olyan környezetbe helyezzük, ahol a hozzáféréseket, láthatóságot vagyis a külső védelmet lehet erős eszközökkel megoldani, amire minden rendszerben, így MS-nél is megvannak a szabványos lehetőségek.
Nem küldözgetjük a fájlt, csak a végeredményt, pl. PDF formátumban mentve.
Lehet azt tenni, hogy az adatokat, amire szüksége van, külön fájlban tartjuk és csak a szükséges értékeket kérdezzük le a feldolgozáshoz. Sőt azt is lehet, hogy ez a feldolgozás is külön fájlban van. Az első fájl csak arra szolgál, hogy a hozzáférést ellenőrizzük és elindítsuk a másik /akár rejtett/, érdemi részt tartalmazó munkafüzetet.
Ez egyrészt így van! A fórum segítsége nélkül, olyan formában, ahogyan kérik tőlem, nem tudtam volna mindezt összerakni, hiszen hiányzó láncszemek voltak a folyamatban, amiket a fórumozók oldottak meg. Ezért baromi nagy köszönet Nekik!
Másrészt, ha nagyon le akarjuk sarkosítani a dolgot, akkor kellett hozzá az excel, ami a Microsoft szellemi terméke, szóval az érdem az övé, ha így nézzük. Persze ahhoz meg kellett egy gép, amin futnak a Microsoft termékek és a gép sem úgy született, hogy valaki egyik este lefeküdt, majd másnap meg felébredt és összerakott egy komplett, használható számítógépet, hanem több száz ezer ember folyamatos ötletei, fejlesztése, „szellemi termékének” a végeredménye. + a rengeteg youtubos video és feltöltőjük, amiket átnéztem, mert ha kicsi is az excel tudásom, én sem úgy születtem meg, hogy ez már a rendelkezésemre állt és bizony ők is segítettek benne az évek alatt…
Persze kellett hozzá egy keresőmotor is az interneten, hogy te is és én is rátaláljak a fórumra, az is szellemi termék. Meg persze az idex.hu is, ahol én is és te is együtt használva más szellemi termékét, tudunk most beszélgetni egymással.
Alapvetően a levédés nem az enyém, hanem az ő ötletük volt. Itt nyílván elsősorban ők féltik a céges adatokat. Szóval, ha nekik ez a megoldás jó, akkor nekem mindegy igazából.
"(béremelés, egyszeri jogdíj...stb.)" Ez sajnos nálunk nem kivitelezhető. Nagyon le vagyunk még maradva vállalati kultúrában a németektől / USA-tól. Ilyenért itt nem adnak nekem jogdíjat.... :(
egyelőre csak a cégen belüli pozíciómat tudom növelni vele, ami összefügg a fentiekkel is, hogy mi lesz akkor ha elmegyek.
Én örülök, hogy alapvetően olyan szituban vagyok most kicsit, hogy nekik van most rám szükségük elsősorban.
Ez egy kb 25-30 lépcsőből álló adathalmaz rendezés, átalakítás, műveletek elvégzése rajta, szűrés stb, ahol a lépések értelem szerűen egymásra épülnek és a sorrend nem változtatható. - Ez az, amit én raktam össze. És igazából maga az ötlet is tőlem származott, mert annyira ismertem az excelt, hogy átlássam, ezt vele meg lehetne csinálni. Ez az, amit viszont én nem feltétlenül szeretnék, hogy mások átlássanak és rajtam kívül más is össze tudja rakni, itt megint visszacsatolva a cégen belüli értékemre.
Alapvetően én örülök neki, hogy tudok segíteni a cégnek, ahol dolgozom, ahonnan a megélhetésem jön. Azzal, hogy ezt lehetőleg le kell védeni, nekem is azonosulnom kell, hiszen én ilyenkor mindig mint alkalmazott szerepelek, nem pedig mint egy külső szoftverfejlesztő mondjuk és követnem kell a vezetőség kérését.
Szia! Csak egy kérdésem van: Főnökeid mit szólnának ahhoz, ha bejelentenéd, hogy holnaptól nem dolgozol a cégnél, aminek következtében a szuperül kidolgozott, titokban tartott remek excel tábládat nem tudnák tovább használni? HIszen senki sem ismerheti, hogyan és milyen logikával működik.
Szerintem nem jó úton indultál el. Tárgyald meg a vezetőiddel, hogy az általad/általatok kifejlesztett rendszert milyen feltételekkel használhatja a cég - tudod létezik a szellemi termék tulajdon és annak védelme, ezért milyen juttatás (béremelés, egyszeri jogdíj...stb.) jár neked ezért.
Egyébként a munkafüzetbe építhetsz be jogosultságokat, ami alapján eldöntheti a makró, ki mire jogosult.
Az összes adatot tartalmazó munkalapot átteheted egy külön munkafüzetbe és a háttérben megnyitva számolhatsz vele.
Ha pedig igaz az, amit Garashannak írtál a munkatársak Excel ismeretéről, akkor semmi félnivalód nincs.
Üdv.
Ps. Azt gondolom tudod, hogy minden szoftverhez használati útmutatót illdomos adni írásban. Sőt a jövőbeni fejlesztések/esetleges javítások érdekében nem ártalmas egy pontos rendszer leírás készítése sem.
Igen, alapvetően hasonló dolgokban gondolkozom én is.
"bár azt nekem 10-15 mp eltüntetni" Szerencsére vagy nem szerencsére, alapvető, nagyon kezdő excel tudás van mindenkinek, ezért automatizálok mindent, gombokra lesarkítva. Nem tudják mi az, hogy makró stb. Kicsi az esélye, hogy bárki külsőst megkérnek, nem lehet-e feltörni a makrókat stb, mivel foglmuk sincs róla... így szerintem nem mennek tovább majd, hanem elfogadják, hogy oké, ezzel nem lehet mit kezdeni, csak "használni". Legalábbis ebben bízunk, ebből indulunk ki.
használni kell a file-t több mindenkinek. többfajta lekérdezésekből rakunk össze adatokat/információkat, amit aztán szűréssel kinyerve, csak a lényegi információt - eredményt használunk tovább. De ezt napi szinten változtatva.
Azt nem akarjuk, hogy össze tudják rakni, hogy hogyan jön ki a végeredmény + az alap adathalmazokat se lássák, hogy miből jön össze a végeredmény. (mi a folyamata az alap adatokból összeállításnak)
+ ha vki elmegy a cégtől, akkor ezt tovább vigye és felhasználja
Viszont az eredményt meg a napi munkához tudják használni, hogy vki könnyebb, gyorsabb, hatékonyabb legyen, mint az, ahogyan most dolgoznak.
Sejtem hogy arra gondolsz, hogy a pl. gmail asztali gépen betölti az excel előnézetét, ha csatolmányban van. Szerintem ez ellen nem igazán lehet védekezni. Legalábbis makró szinten egész biztosan nem, mert legjobb tudomásom szerint makrókat nem futtat a gmail.
De ha már úgyis telepakoltad makróval és azok szükségesek a működéshez is, akkor csináld meg úgy, hogy csak 1 darab munkalap van megjelenítve a munkafüzetben, az összes többit rejtsd el és jelszavazd le őket (bár azt nekem 10-15 mp eltüntetni) és makrók segítségével másolj át minden adatot arra az egy darab munkalapra. Lehet futtatni makrót automatikusan mentés előtt is, azzal pedig ki lehet pucolni azt az 1 darab munkalapot.
Most már tudom, hogyan lehet megcsinálni, hogy ne lehessen "másként menteni", ne lehessen "lementeni" + tudom azt is, hogy csekkolja, hogy csak akkro nyíljon meg a file, ha az elérési helye nincs megváltozva.
Most már csak arra kellene egy ötlet, hogy azt hogyan lehetne megcsinálni, ha e-mailben elküldi vki, akkor se működjön.
Lementeni nem lehet az e-mailből a gépre, de a levelező rendszerből, mit csatolmány, megnyílik az excel és mindig azt megnyitva tudják használni.
Esetleg erre vmi ötlet / módszer?
Mondjuk vmit szintén csekkoljon, ami nélkül nem nyílik meg, mert az is le van mentve valahová és azt is kellene mondjuk ugyan úgy elküldeni az emailben, de ezt nyilván nem tudja senki és azt nem küldik el. Esetleg vmi ilyesmi vagy hasonló? Szerintetek?
Illetve nem tudom, hogy a kérdezőnek mennyire tiszta a $ jel használata.
Ha az én vizualizált példámnál maradunk, akkor láthatod, hogy a szabály megadásánál nem használtam se az "A", se a "1" karakterek előtt dollár jelet. Ezáltal az érvényességben megadott első cellában, azaz a C1-ben a szabály az A1 tartalmát vizsgálja, míg a második cellában, a C2-ben pedig az A2 tartalmát vizsgálja.
Ha a képletem =A$1="igen" lett volna, akkor C1-ben, C2-ben, ... és C9-ben is az A1 cellát fogja vizsgálni. Azaz C1:C9 végig zöld lenne.
Vagyis a dollár jellel lefixáltuk az 1. sort.
Ha az A elé került volna dollár jel, akkor az az én példámat nem befolyásolta volna.
Viszont ha C1:D9 tartományt szerettem volna színezni az A oszlop értékeinek megfelelően, akkor kellett volna az "A" elé is dollár jel.
Másrészt, ha C1:D9 tartományt szerettem volna színezni a C oszlopot az A szerint, a D oszlopot pedig a B szerint, akkor nem kell elé dollár jel.
Gondolom csak elírás volt a részedről, az új sor kódja a 10-es.
Hogy a kérdező is értse, hogy miről beszélünk mindkét változatot megcsináltam neki.
A1 cellában van a szétszedendő szöveg
C1-ben az alt+enteres keresés, míg D1-ben a karakter(10)-es. Alatta pedig a használt képletek. Úgy ahogy a szerkesztő lécben is látszódnak. Azaz C2-ben van egy új sor.
Illetve vizualizáltam az automatikus formázás lépéseit is a kérdezőnek.
1. A képletet próbáld meg így írni: =bal(A1, Szöveg.keres(Karakter(160), A1)-1). Karakter(160) az Alt+Entert jelenti.
2. A feltételes formázást arra a cellára kell megadnod, amelyiknek változtatni szeretnéd a színezését. A formázás alapja viszont az a cella lesz, amelyikben a legördülő lista van!
Ha az A1 cellát formáznád és a legördülő a D1-ben van:
Kijelölöd az A1 cellát, utána Kezdőlap - feltételes formázás - új szabály - a formázandó cellák kijelölése képlettel
Tehát a feltételes formázás képletébe a legördülő cella címe legyen: pl. =$D$1=Igaz() zöld kitöltés. OK
Ezután - még mindig ki van jelölva az A1 cella, ismét új szabály =$D$1=Hamis() piros kitöltés OK
Azaz az A1 cellára két szabály van érvényben.
A szabályok szerkesztésében megnézheted, melyik szabály melyik tartományra vonatkozik.