Option Explicit
Private Const cSP_ERSTEDATUMSSPALTE = 1 ->A
Private Const cSP_ANZAHL_PROMONAT = 3
Private Const cZ_ERSTEZEILE = 6
Private Const cZ_LETZTEZEILE = cZ_ERSTEZEILE + 30
Private Const cTAGE_ALLE20 = 20
Private Const cMONATE_ANZAHL = 12
Private Const cFARBINDEX = 6->tiefgelb
Private Const cVERSCHIEBEN As Long = 2
' Trifft der Tag einen Sonnabend oder Sonntag wird der Tag verschoben,
' In Abhängigkeit der Kennung cVerschieben
' cVerschieben = 0 : keine Verschiebung
' cVerschieben = 1 : Verschieben auf den Montag danach
' cVerschieben = 2 : Verschieben auf den Freitag vorher
'**********************************************************************************
Sub FarbeInteriorLoeschen()
Dim ws As Worksheet
Dim z As Long, sp As Long
Set ws = ActiveSheet
For sp = cSP_ERSTEDATUMSSPALTE To cSP_ERSTEDATUMSSPALTE + (cSP_ANZAHL_PROMONAT * (cMONATE_ANZAHL)) - 1
For z = cZ_ERSTEZEILE To cZ_LETZTEZEILE
If ws.Cells(z, sp).Interior.ColorIndex = cFARBINDEX Then
ws.Cells(z, sp).Interior.ColorIndex = xlColorIndexNone
End If
Next
Next
Set ws = Nothing
End Sub
'**********************************************************************************
Sub Alle20TageFarbeInteriorSetzen()
->*** Voraussetzung: eine Datumszelle ist markiert
->***
->*** Für diese Datumszelle und die Datumszellen im Abstand 19 Tage
->*** (also alle 20 Tage) wird her Zellehintergrung auf die ausgesuchte Farbe gesetzt
->***
->*** Trifft der Tag einen Sonnabend oder Sonntag wird der Tag verschoben,
->*** In Abhängigkeit der Kennung cVerschieben
->*** cVerschieben = 0 : keine Verschiebung
->*** cVerschieben = 1 : Verschieben auf den Montag danach
->*** cVerschieben = 2 : Verschieben auf den Freitag vorher
->***
->*** Die weitere Zählung bleibt aber bei 21 Tagen, d.h. wird der Tag verschoben
->*** wird der Zähler so für den nächsten zu kennzeichnenden Tag aufgesetzt,
->*** daß dieser von der verschiebung unberührt bleibt.
->*** (Wenn dies nicht erfolgt, folgen einem Montag nur noch Montage,
->*** einem Freitag nur noch Freitage)
Dim ws As Worksheet
Dim lZStart As Long, lSPStart As Long, lSPmax As Long
Dim bIstDatumSP As Boolean, sp As Long, z As Long
Dim sTxt As String, lCIndex As Long, lTZ As Long, lAnzTagVerschiebung As Long
Set ws = ActiveSheet
->Eine Zelle markiert ?
If Selection.Count <> 1 Then MsgBox Bitte nur eine Zelle markieren.: GoTo AUFRAEUMEN
->Datumszelle Zeile, Spalte
lZStart = Selection.Row: lSPStart = Selection.Column
->Zeile prüfen
If (lZStart < cZ_ERSTEZEILE) Or (lZStart > cZ_LETZTEZEILE) Then
MsgBox Bitte eine Datums-Zelle selektieren.: GoTo AUFRAEUMEN
End If
->Spalte prüfen
bIstDatumSP = False
For sp = cSP_ERSTEDATUMSSPALTE _
To cSP_ERSTEDATUMSSPALTE + (cSP_ANZAHL_PROMONAT * (cMONATE_ANZAHL - 1)) _
Step cSP_ANZAHL_PROMONAT
If sp = lSPStart Then bIstDatumSP = True: Exit For
Next
If Not bIstDatumSP Then MsgBox Bitte eine Datums-Zelle selektieren.: GoTo AUFRAEUMEN
->Zelle prüfen
If Not IsDate(ws.Cells(lZStart, lSPStart).Value) Then
MsgBox Bitte eine Datums-Zelle mit Datum selektieren.: GoTo AUFRAEUMEN
End If
->*** ist Datumszelle, also kann es jetzt losgehen
lCIndex = cFARBINDEX
->Startzelle farbig, Tagezähler auf 0
With ws.Cells(lZStart, lSPStart)
.Interior.ColorIndex = lCIndex
.Offset(0, 1).Interior.ColorIndex = lCIndex
.Offset(0, 2).Interior.ColorIndex = lCIndex
End With
lTZ = 0 'Zähler Tage
z = lZStart 'Zeile
sp = lSPStart->Spalte
lSPmax = cSP_ERSTEDATUMSSPALTE + (cSP_ANZAHL_PROMONAT * (cMONATE_ANZAHL - 1))
Do
z = z + 1
If z > cZ_LETZTEZEILE Then
z = cZ_ERSTEZEILE
sp = sp + cSP_ANZAHL_PROMONAT
End If
If sp > lSPmax Then Exit Do
If IsDate(ws.Cells(z, sp).Value) Then
lTZ = lTZ + 1
If cVERSCHIEBEN = 2 Then
->Wenn Sonnabend/Sonntag, dann verschieben auf den Freitag davor
->prüfen, ob Tag = Freitag und Zähler um 1 oder 2 vor Grenze
If vbFriday = WeekDay(ws.Cells(z, sp).Value) Then
If lTZ >= cTAGE_ALLE20 - 2 Then
lAnzTagVerschiebung = lTZ - cTAGE_ALLE20
->Tageszähler auf Grenze setzen
lTZ = cTAGE_ALLE20->
End If
End If
End If
If lTZ >= cTAGE_ALLE20 Then
If cVERSCHIEBEN <> 1 Then
->normal behandeln
With ws.Cells(z, sp)
.Interior.ColorIndex = lCIndex
.Offset(0, 1).Interior.ColorIndex = lCIndex
.Offset(0, 2).Interior.ColorIndex = lCIndex
End With
lTZ = lAnzTagVerschiebung
lAnzTagVerschiebung = 0
Else
->wenn Sonnabend/Sonntag, dann auf Montag verschieben
If vbSunday = WeekDay(ws.Cells(z, sp).Value) Then
->Sonntag -> Zähler um 1 erniedrigen
lTZ = lTZ - 1
lAnzTagVerschiebung = 1
ElseIf vbSaturday = WeekDay(ws.Cells(z, sp).Value) Then
->Samstag -> Zähler um 2 erniedrigen
lTZ = lTZ - 2
lAnzTagVerschiebung = 2
Else
->kein Samsatg/Sonntag -> Tag kennzeichnen
With ws.Cells(z, sp)
.Interior.ColorIndex = lCIndex
.Offset(0, 1).Interior.ColorIndex = lCIndex
.Offset(0, 2).Interior.ColorIndex = lCIndex
End With
lTZ = lAnzTagVerschiebung
lAnzTagVerschiebung = 0
End If
End If
End If
End If
Loop
AUFRAEUMEN:
Set ws = Nothing
End Sub