Microsoft Excel

Herbers Excel/VBA-Archiv

kleines aber feines Ärgernis

Betrifft: kleines aber feines Ärgernis von: Markus
Geschrieben am: 31.07.2014 08:25:23

Hallo!

Um meine Arbeitszeiten aufzunehmen benutze ich ein Excel Tool das mir dann alles berechnet.
Mir ist mir dabei was aufgefallen und möchte hier erfragen wie man das Ändern kann.
Zur Erklärung: zuerst mal ein Beispiel https://www.herber.de/bbs/user/91802.xls
Das Tool rechnet die Pausenzeiten raus. Diese sind bis 6h 0 min, ab 6h bis 9h 30min und dann bis 10h 45min.
Das Makro fragt dies ab. Funktioniert soweit ganz gut.
Es gibt aber ein kleines Detail wo es nicht klappt. Es gibt die Abfrage wenn die Arbeitszeit nach 12:30 Uhr endet und vor 12 Uhr beginnt wird eine Pause von 30min ausgegeben, obwohl auch die Abfrage über die Länge der Arbeitszeit <=6h ebenfalls Wahr ist. Ergebnis: Zwar endet die Arbeitszeit nach 12:30 Uhr, aber sie ist auch kleiner 6 Stunden. Trotzdem werden 30 min Pausenzeit angegeben. Warum?
Am besten mal das Beispiel durchgehen. Da wird es bestimmt verständlicher.

Gruß
Markus

Sub Zeiten()

   Monat = ActiveSheet.Cells(3, 11)
   Worksheets(Monat).Activate                        'Tabelle aktueller Monat
   
   For J = 1 To 2       'linker und rechter Spaltenblock
      
      If (J = 1) Then   'Spalten linker Zeitenblock
         St = 3
         En = 4
         Da = 5
         Pm = 7
         Pd = 8
      Else              'Spalten rechter Zeitenblock
         St = 9
         En = 10
         Da = 11
         Pm = 13
         Pd = 14
      End If
         
      For I = 1 To 31   'Zeilen mit Zeiten
 
         Po = 0         'Pausenmodell
         Pa = 30        'Pausendauer
         
         Range(Cells(10 + I, Da), Cells(10 + I, Da)) = ""
         Range(Cells(10 + I, Pm), Cells(10 + I, Pm)) = ""
         Range(Cells(10 + I, Pd), Cells(10 + I, Pd)) = ""
         
         ActiveSheet.Cells(1, 26) = Range(Cells(10 + I, St), Cells(10 + I, St))
         ActiveSheet.Cells(2, 26) = Range(Cells(10 + I, En), Cells(10 + I, En))
 
         ActiveSheet.Cells(3, 26) = "=ISTEXT(R1C26)"  'beinhaltet Zelle Text
         ActiveSheet.Cells(4, 26) = "=ISTEXT(R2C26)"
         
         'wenn Zelle Text beinhaltet, nicht bearbeiten
         If ((ActiveSheet.Cells(3, 26) = True) Or (ActiveSheet.Cells(4, 26) = True)) Then
         Else
         
            ActiveSheet.Cells(1, 25) = "=HOUR(TEXT(R1C26,""hh:mm:ss""))"        'dezimale  _
Stunde   ah
            ActiveSheet.Cells(2, 25) = "=HOUR(TEXT(R2C26,""hh:mm:ss""))"        '                _
   eh
            ActiveSheet.Cells(3, 25) = "=(MINUTE(TEXT(R1C26,""hh:mm:ss""))/60)" 'dezimale  _
Minute   am
            ActiveSheet.Cells(4, 25) = "=(MINUTE(TEXT(R2C26,""hh:mm:ss""))/60)" '                _
   em
   
            ah = ActiveSheet.Cells(1, 25)
            eh = ActiveSheet.Cells(2, 25)
            am = ActiveSheet.Cells(3, 25)
            em = ActiveSheet.Cells(4, 25)
 
           'wenn Zelle ohne Inhalt, nicht bearbeiten
            If (IsEmpty(ActiveSheet.Cells(10 + I, St)) Or IsEmpty(ActiveSheet.Cells(10 + I, En)) _
) Then    'wenn Zelle leer, nichts
            Else
      
               'wenn Start bis 12:00 und Ende ab 12:30
               If (((ah + am) <= 12) And ((eh + em) >= 12.5)) Then
                  'wenn Gesamtzeit <= 9.5h
                  If ((eh + em - ah - am) <= 9.5) Then
                     ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am - 0.5
                  'wenn 9.5h < Gesamtzeit <= 9.75h
                  ElseIf (((eh + em - ah - am) > 9.5) And ((eh + em - ah - am) <= 9.75)) Then
                     ActiveSheet.Cells(10 + I, Da) = "9"
                     Po = 5
                     Pa = 45
                  'wenn 9.75h < Gesamtzeit <= 10.75h
                  ElseIf (((eh + em - ah - am) > 9.75) And ((eh + em - ah - am) <= 10.75)) Then
                     ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am - 0.75
                     Po = 5
                     Pa = 45
                  'wenn Gesamtzeit > 10.75h
                  ElseIf ((eh + em - ah - am) > 10.75) Then
                     ActiveSheet.Cells(10 + I, Da) = "10"
                     Po = 5
                     Pa = 45
                  End If
               'wenn Start ab 12:30, d.h. ohne Pause
               Else
                  Po = " "
                  Pa = 0
                  'wenn Start nach 12:00 oder Ende vor 12:30
                  If (((ah - am) > 12) And ((eh + em) < 12.5)) Then
                     ActiveSheet.Cells(10 + I, Da) = 0
                  'wenn Gesamtzeit <= 6h, ohne 30 min Pause
                  ElseIf ((eh + em - ah - am) <= 6) Then
                     ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am
                  'wenn 9h < Gesamtzeit <= 9.25h
                  ElseIf ((eh + em - ah - am) > 9 And (eh + em - ah - am) <= 9.25) Then
                     ActiveSheet.Cells(10 + I, Da) = 9
                  'wenn 9.25h < Gesamtzeit <= 10.75h
                  ElseIf ((eh + em - ah - am) > 9.25 And (eh + em - ah - am) <= 10.25) Then
                     ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am - 0.25
                  'wenn Gesamtzeit < 10.75h
                  ElseIf ((eh + em - ah - am) > 10.25) Then
                     ActiveSheet.Cells(10 + I, Da) = 10
                  End If
               End If
               ActiveSheet.Cells(10 + I, Pm) = Po
               ActiveSheet.Cells(10 + I, Pd) = Pa
            End If
         End If
      Next I
   Next J
End Sub

  

Betrifft: AW: kleines aber feines Ärgernis von: fcs
Geschrieben am: 31.07.2014 10:35:25

Hallo Markus,

du gibst ja generell eine Pausenzeit von 30 Minuten vor.
für die Bedingungen wenn Start bis 12:00 und Ende ab 12:30 hast du als erstes eine Prüfung

If ((eh + em - ah - am) <= 9.5) Then
        ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am - 0.5
ElseIf ...
Da Werte <=6 diese Bedingung auch erfüllen, werden 30 Minuten Pausendauer ausgegeben.

Du müsstest dies in folgender Art anpassen, um Pausenmodell/Pausendauer/Arbeitszeit anders festzulegen.
If ((eh + em - ah - am) <= 6) Then
        ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am - ????
        Po = ???
        Pa = ???
ElseIf ((eh + em - ah - am) <= 9.5) Then
        ActiveSheet.Cells(10 + I, Da) = eh + em - ah - am - 0.5
ElseIf ...
Gruß
Franz


  

Betrifft: AW: kleines aber feines Ärgernis von: Markus
Geschrieben am: 01.08.2014 10:46:39

Super danke.
Es geht.