Telefonszámunk: 1-472-0679

excel makró munkakezdés

Kezdőlap Fórumok Excel programozás excel makró munkakezdés

10 bejegyzés megtekintése - 1-10 / 10
  • Szerző
    Bejegyzés
  • #2416
    Imre
    Felhasználó

      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 Imre

      #2417
      Imre
      Felhasználó

        Private 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).Value

        If 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 If

        End 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 = xlCenter

        Columns(„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 = 15

        End With

        End Sub

        Public Function honap(hnev As Integer)
        Dim N
        N = MonthName(hnev, False)
        honap = N
        End Function

        Public Function hovege(hdatum As Date)
        Dim NN
        NN = WorksheetFunction.EoMonth(hdatum, 0)
        hovege = Day(NN)
        End Function

        #2418
        horvimi
        Adminisztrátor

          Szia!

          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.
          #2421
          Imre
          Felhasználó

            Nagyon jooooo. Köszönöm, köszönöm, köszönöm És Boldog ünnepeket.

            #2422
            Imre
            Felhasználó

              Szia!
              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. Imre

              #2423
              horvimi
              Adminisztrátor

                Letiltja 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

                #2443
                Imre
                Felhasználó

                  Szia. 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 Imre

                  #2444
                  horvimi
                  Adminisztrátor

                    Szia!

                    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.
                    #2481
                    Imre
                    Felhasználó

                      Szia!
                      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).row

                      #2482
                      horvimi
                      Adminisztrátor

                        Szia!

                        É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

                      10 bejegyzés megtekintése - 1-10 / 10
                      • Be kell jelentkezni a hozzászóláshoz.