Kezdőlap › Fórumok › Excel programozás › excel makró munkakezdés
- This topic has 9 hozzászólás, 2 résztvevő, and was last updated 8 years, 11 months telt el by horvimi.
-
SzerzőBejegyzés
-
2015-12-18-13:30 #2416
Sziasztok.
Készítettem egy makrót ami beirt munkakezdés, munkavége között ledolgozott időt számolja ki.
Működése: új munkafüzet beszúrása – alul – a lapfüleknél és szépen megcsinálja a táblázatot. Utána a megadott cellákba be irni a munkakezdést hh:mm formában és kikell hogy számolja a ledolgozott időt. De type mismatch hibával kiakad. Ezt a hibát csak akkor produkálja ha a munkafüzet SheetChange() Workbook_SheetChange() esményébe irom. Ha viszont a Worksheets_change() eseménynél nem csinál ilyet ekkor viszont mindig másolgatni kell az eseményt az új munkalap beszurásakor. Ebben kérném a segitséget. Mellékelten elküldöm az excel fájl-t.
Maradok tisztelettel Imre2015-12-18-13:32 #2417Private Sub Worksheet_Change(ByVal Target As Range)
Dim kezdes As String
Dim vege As String
Dim perce As Integer
kezdes = Cells(Target.Row, 3).Value
vege = Cells(Target.Row, 4).ValueIf Target.Column = 4 Then
perce = CInt(Minute(CDate(vege)))
Select Case perce
Case 0, 30
Cells(Target.Row, 5).Value = ((vege – kezdes) * 24)
Case 1 To 59
Cells(Target.Row, 5).Value = WorksheetFunction.RoundUp((vege – kezdes) * 24 / 0.5, 0) * 0.5
End Select
End IfEnd Sub
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim nev%
Dim hveg
Dim ev, ho, nap As Integer
If Sh.Name Like „Mu*” Then
nev% = InputBox(„Kérem az aktuális hónapot számmal”, „Hónap”)
honev = honap(nev%)
If Sh.Name <> „” Then
Sh.Name = honev
End If
End If
‘hveg = InputBox(„Kérem az aktuális dátumot elsejétől ‘pl igy 2013.06.01′”, „Hónaputolsó”)
nap = 1
hveg = DateSerial(2015, 12, 1)utolso = hovege(hveg)
‘ev = Year(Date)
‘ho = Month(Date)
Range(„A1”) = „Dátum”
Range(„B1”) = „Napok”
Range(„C1”) = „Kezdés”
Range(„D1”) = „Vége”
Range(„E1”) = „Ledolgozott Idő”
With Range(„A1:E1”) ‘ A fejléc cellái
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = True
.Font.Name = „Calibri”
.Font.Size = 16
.Font.Bold = True
.Columns.AutoFit
.Borders(xlEdgeBottom).LineStyle = xlDouble
End With
Range(„A2:E” & utolso + 1).Select
With Selection
.Font.Size = 16
.Font.Name = „Calibri”
.Font.Bold = True
End With
Range(„B2:B” & utolso + 1).Select
With Selection
.Font.Size = 16
.Font.Name = „Calibri”
.Font.Bold = True
.Columns.AutoFit
End With
Range(„A2:B” & utolso + 1).HorizontalAlignment = xlCenterColumns(„A:A”).ColumnWidth = 15
Columns(„B:B”).ColumnWidth = 14
Columns(„C:C”).ColumnWidth = 12
Columns(„D:D”).ColumnWidth = 11
Columns(„E:E”).ColumnWidth = 15
Range(„A1:E1”).Interior.ColorIndex = 15
Range(„A2:A” & utolso + 1).Interior.ColorIndex = 43
Range(„B2:B” & utolso + 1).Interior.ColorIndex = 6
Range(„C2:C” & utolso + 1).Interior.ColorIndex = 40
Range(„D2:D” & utolso + 1).Interior.ColorIndex = 32
Range(„E2:E” & utolso + 1).Interior.ColorIndex = 7
Range(„A2:A” & utolso + 1).Font.ColorIndex = 49
Range(„B2:B” & utolso + 1).Font.ColorIndex = 53
Range(„C2:C” & utolso + 1).Font.ColorIndex = 14
Range(„D2:D” & utolso + 1).Font.ColorIndex = 3
Range(„E2:E” & utolso + 1).Font.ColorIndex = 49 ’18
With Selection.Font
.Size = 15
.Name = „Calibri”
.Bold = True
End With
With Range(„A2”) ‘ Az aktuális dátum 1-30 vagy 31.-e között
.FormulaR1C1 = CVDate(hveg)
.AutoFill Destination:=Range(„A2:A” & utolso + 1), Type:=xlFillDefault
.Columns.AutoFit
End With
With Range(„B2”) ‘ Az aktuális dátum napjai
.FormulaR1C1 = „=TEXT(RC[-1],””nnnn””)”
.AutoFill Destination:=Range(„B2:B” & utolso + 1)
.ColumnWidth = 15End With
End Sub
Public Function honap(hnev As Integer)
Dim N
N = MonthName(hnev, False)
honap = N
End FunctionPublic Function hovege(hdatum As Date)
Dim NN
NN = WorksheetFunction.EoMonth(hdatum, 0)
hovege = Day(NN)
End Function2015-12-18-23:00 #2418Szia!
A munkaidő kiszámolását a 4. oszlopban történt cellaérték változás eseményéhez kötöd.
De a munkalap beszúrásakor, amikor a fejlécet hozza létre, ott is ír a 4. oszlopba, de az nem időérték, hanem egy szöveg, amit megpróbál átalakítani úgy, ahogy a change eseménykezelőben megadtad, de nem sikerül neki.Az ilyesmit úgy lehet megoldani, hogy amíg a fejlécet töltöd, addig kikapcsolod az eseménykezelést.
Ezt így lehet:Application.EnableEvents=False
Majd miután már kell figyelni az eseményekre, visszakapcsolod.
csatoltam a működő verziót.
- A hozzászólás módosításra került: 9 years telt el-horvimi.
Attachments:
You must be logged in to view attached files.2015-12-19-10:52 #2421Nagyon jooooo. Köszönöm, köszönöm, köszönöm És Boldog ünnepeket.
2015-12-20-10:33 #2422Szia!
Ne haragudj hogy megint zavarlak, de szeretnék kérdezni. Pontosan mit is csinál ez a tulajdonság EnableEvents? És mikor, hol, melyik eseményvezérlésnél kell alkalmazni? Ugyanis mikor rákerestem az interneten erre az utasításra/tulajdonságra, akkor rengeteg – főleg – angol nyelvű fórumokat találtam és ott a woksheets_Change() eseményben volt alkalmazva. Tudod én nem tanultam makró programozást ezt a programot mind saját kútfő fejemből az internet segítségével írtam meg. Ezért érdeklődőm itt a fórumokon. Előre is köszönöm. Imre2015-12-20-14:59 #2423Letiltja vagy engedélyezi az eseménykezelést, azaz az eseménykezelők futtatását.
Amíg FALSE állapotban van, addig bármely esemény történik, pl. CHANGE, nem fog lefutni a kezelője.Például, ha az a feladat, hogy bármely cella tartalma megváltozik, a mellette lévő cellába írd be az aktuális dátumot. Erre a Worksheet_Change eseményt szokták használni.
De abban a pillanatban, hogy a mellette lévőbe beírsz valamit, az megint kiváltja a Change eseményt, és a következő megint, a végtelenségig. Ezt hívják EVENT LOOP-nak.
Emiatt az eseménykezelőben végrehajtott változtatások idejére ki szokták kapcsolni az eseményeket az EnableEvents tulajdonsággal.A Te esetedre visszatérve, az is jó megoldás lenne, ha nem csak a 4. oszlopot vizsgálod, hanem azt is, hogy a 4. oszlopban, ÉS a fejléc alatti vagy annál nagyobb sorban történő változáskor számoljon munkaidőt, akkor erre a dologra nem lenne szükség.
Azt sem vizsgálod, hogy a a munka kezdő időpont ki van-e töltve 🙂
Kérdés, hogy csak magadnak írtad-e, vagy odaadod valakiknek használatra? Utóbbi esetben azért a bolondállósági fokot érdemes lehet növelni. 🙂Imre
2015-12-27-15:05 #2443Szia. Először is kellemes ünnepeket.
Másodszor pedig én még nem jöttem rá, hogy mivel nem minden nap dolgozom, akkor egy OFF szót írok a cellába akkor – mivel – a változok dátum típusúak hogy lehet ellenőrizni.
A fenti verzióban a kezdés és a vége nevű változok szöveges típusúak.
” Utóbbi esetben azért a bolondállósági fokot érdemes lehet növelni. :-)” Ezzel a mondattal mit akartál kifejezni? Mert igen lehet, hogy egy kicsit bolondos a progi. És oda szoktam adni a kollégáknak.
Üdv Imre2015-12-28-23:16 #2444Szia!
A változók (kezdes és vege) string típusok.
A vege változót lehet „off”-ra vizsgálni. Tehát elég, ha csak ennyit teszel, és ha a 4. oszlopba „off” kerül, akkor mellé egy nullát tesz, különben lefut a munkaidő számítás.Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim kezdes As String Dim vege As String Dim perce As Integer kezdes = Cells(Target.Row, 3).Value vege = Cells(Target.Row, 4).Value If Target.Column = 4 Then If vege = "off" Then Cells(Target.Row, 5).Value = 0 Else perce = CInt(Minute(CDate(vege))) Select Case perce Case 0, 30 Cells(Target.Row, 5).Value = (vege - kezdes) * 24 Case 1 To 59 Cells(Target.Row, 5).Value = WorksheetFunction.RoundUp((vege - kezdes) * 24 / 0.5, 0) * 0.5 End Select End If End If End Sub
A bolondállóság azt jelenti, hogy mennyire vizsgáljuk, hogy a felhasználó valóban helyes formátumú, intervallumú adatot írt be. Ha mások is használják, akkor ezt jobban szoktuk ellenőrizni, hogy ne adjon az első tévedésnél runtime hibát, vagy egyéb hibás működést.
Ezt a szintet neked kell eldönteni. Ez a kis progi most nem túl bonyolult, simán el lehet magyarázni, hogy hogy kell használni, és mi lesz ha nem jót ír be.
Lehetne vizsgálni mindkét oszlopban, hogy egyáltalán időt írt-e be, ezek hogy viszonyulnak egymáshoz (pl. a vége később van-e, mint az eleje), stb…
Imre
- A hozzászólás módosításra került: 8 years, 12 months telt el-horvimi.
2016-01-21-15:03 #2481Szia!
Ezt a programot oda adom a kollégámnak is, aki szintén az a program rendeltetésszerűen használja. Tudod én nem tanultam excel programozást ezt a icipici tudást könyvekből, és innen-onnan „tanultam”. de még mindig van olyan dolog – elég sok is – amit nem tudok. Most például azt szeretném megcsinálni, hogy a ledolgozott órák az utolsó oszlopban – „E” -oszlop – vannak. És az utolsó sorban+1 kiszámítsa az egész havi óraszámot. Én így csináltam.
usor = range(„E” & rows.count).End(xlUp).row
range(„E” & usor + 1).FormulaR1C1= „=SUM(R[-” & usor & „]C:R[-1]C)”
De valahogy nem akarja kiszámolni.
Sőt csináltam így is:
„=SUM(R” & usor & „C5:R” & esor & „C5)”
Az esor = range(„E” & rows.count).End(xlUp).End(xlUp).row2016-01-21-20:09 #2482Szia!
Én nem pöcsölnék már ezzel ennyit.
Amikor beszúrod az új munkalapot, akkor előre kitölti az egész hónap dátumait a 32. sorig.
Ezért Én az E33-ba vagy E34-be betenném fixen a képletet.Range("E34").Formula = "=SUM(E2:E32)"
Ha 30 vagy 28 vagy 29 napos hónap van, úgyis törölni kell a nemkívánatos sorokat, és a képlet le fogja követni.
Szerintem.
Imre
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.