Option Explicit
Private Const cSPDATETIME = 2 'Spalte Datum/Zeit
Private Const cSPTELNR = 3 ->Spalte Telefonnummer
Private Const cSPTIMEOFFSET = 6 'Spalte Zeitoffset
Private Const cZUEBERCHRIFT = 1 'Zeile Überschrift
'Werden die Zeitgrenzen 9:00 bzw. 18:00 durch den Offset überschritten
'werden die Zeit(DATETIME) und der ZeitOffset angepasst, wenn
'der folgende Schalter auf True steht.
'bei False werden bleiben beide Werte unverändert
Private Const cSCHALTER_BEIZEITGRENZE_ZEITEN_MODIFIZIEREN = True
'********************************************************************
Sub Excel_ZLoeNichtWerktags9bis18Uhr()
Dim lLetzteZeile As Long, lZeile As Long, sTelNr As String
Dim dDateTime As Date, dTimeOffset As Date
Dim bZeitGrenzeDurchOffset As Boolean
Dim b9UhrGrenze As Boolean
Dim dDateTime859 As Date, dDiffDateTimeBis859 As Date
Dim dDateTime900 As Date, dDiffDateTimeAb900 As Date
Dim b18UhrGrenze As Boolean
Dim dDateTime1800 As Date, dDiffDateTimeBis1800 As Date
Dim dDateTime1801 As Date, dDiffDateTimeAb1801 As Date
lLetzteZeile = ActiveSheet.UsedRange.Row + _
ActiveSheet.UsedRange.Rows.Count - 1
For lZeile = lLetzteZeile To cZUEBERCHRIFT + 1 Step -1
sTelNr = ActiveSheet.Cells(lZeile, cSPTELNR).Value
If TelefonNummernfilter(sTelNr) Then
->gefilterte Telnummern auf jeden Fall löschen
ActiveSheet.Rows(lZeile).Delete
Else
->Zeilen ohne Datum überspringen
If IsDate(ActiveSheet.Cells(lZeile, cSPDATETIME).Value) Then
dDateTime = ActiveSheet.Cells(lZeile, cSPDATETIME).Value
dTimeOffset = ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value
If Not WerktagsVon09Bis1800(dDateTime, dTimeOffset, _
bZeitGrenzeDurchOffset, _
b9UhrGrenze, _
dDateTime859, dDiffDateTimeBis859, _
dDateTime900, dDiffDateTimeAb900, _
b18UhrGrenze, _
dDateTime1800, dDiffDateTimeBis1800, _
dDateTime1801, dDiffDateTimeAb1801) Then
If Not bZeitGrenzeDurchOffset Then
ActiveSheet.Rows(lZeile).Delete
End If
End If
If bZeitGrenzeDurchOffset Then
If cSCHALTER_BEIZEITGRENZE_ZEITEN_MODIFIZIEREN Then
If b9UhrGrenze Then
ActiveSheet.Cells(lZeile, cSPDATETIME).Value = dDateTime900
ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value = dDiffDateTimeAb900
End If
If b18UhrGrenze Then
ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value = dDiffDateTimeBis1800
End If
End If
End If
End If
End If
Next
End Sub
'********************************************************************
Sub Excel_ZLoeWerktags9bis18Uhr()
Dim lLetzteZeile As Long, lZeile As Long, sTelNr As String
Dim dDateTime As Date, dTimeOffset As Date
Dim bZeitGrenzeDurchOffset As Boolean
Dim b9UhrGrenze As Boolean
Dim dDateTime859 As Date, dDiffDateTimeBis859 As Date
Dim dDateTime900 As Date, dDiffDateTimeAb900 As Date
Dim b18UhrGrenze As Boolean
Dim dDateTime1800 As Date, dDiffDateTimeBis1800 As Date
Dim dDateTime1801 As Date, dDiffDateTimeAb1801 As Date
lLetzteZeile = ActiveSheet.UsedRange.Row + _
ActiveSheet.UsedRange.Rows.Count - 1
For lZeile = lLetzteZeile To cZUEBERCHRIFT + 1 Step -1
sTelNr = ActiveSheet.Cells(lZeile, cSPTELNR).Value
If TelefonNummernfilter(sTelNr) Then
->gefilterte Telnummern auf jeden Fall löschen
ActiveSheet.Rows(lZeile).Delete
Else
->Zeilen ohne Datum überspringen
If IsDate(ActiveSheet.Cells(lZeile, cSPDATETIME).Value) Then
dDateTime = ActiveSheet.Cells(lZeile, cSPDATETIME).Value
dTimeOffset = ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value
If WerktagsVon09Bis1800(dDateTime, dTimeOffset, _
bZeitGrenzeDurchOffset, _
b9UhrGrenze, _
dDateTime859, dDiffDateTimeBis859, _
dDateTime900, dDiffDateTimeAb900, _
b18UhrGrenze, _
dDateTime1800, dDiffDateTimeBis1800, _
dDateTime1801, dDiffDateTimeAb1801) Then
If Not bZeitGrenzeDurchOffset Then
ActiveSheet.Rows(lZeile).Delete
End If
End If
If bZeitGrenzeDurchOffset Then
If cSCHALTER_BEIZEITGRENZE_ZEITEN_MODIFIZIEREN Then
If b9UhrGrenze Then
If Hour(dDiffDateTimeBis859) = 0 And Minute(dDiffDateTimeBis859) = 0 Then
ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value =
Else
ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value = dDiffDateTimeBis859
End If
End If
If b18UhrGrenze Then
ActiveSheet.Cells(lZeile, cSPDATETIME).Value = dDateTime1801
If Hour(dDiffDateTimeAb1801) = 0 And Minute(dDiffDateTimeAb1801) = 0 Then
ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value =
Else
ActiveSheet.Cells(lZeile, cSPTIMEOFFSET).Value = dDiffDateTimeAb1801
End If
End If
End If
End If
End If
End If
Next
End Sub
'********************************************************************
Private Function WerktagsVon09Bis1800(dDateTime As Date, dTimeOffset As Date, _
bZeitGrenzeDurchOffset As Boolean, _
b9UhrGrenze As Boolean, _
dDateTime859 As Date, _
dDiffDateTimeBis859 As Date, _
dDateTime900 As Date, _
dDiffDateTimeAb900 As Date, _
b18UhrGrenze As Boolean, _
dDateTime1800 As Date, _
dDiffDateTimeBis1800 As Date, _
dDateTime1801 As Date, _
dDiffDateTimeAb1801 As Date) As Boolean
'*** True, wenn Datum/Zeit Werktags(Mo-Fr) 9:00 bis 18:00 ist
Dim iWochentag As Integer
Dim iStd As Integer, iMin As Integer, iSec As Integer
Dim iOffsetStd As Integer, iOffsetMin As Integer
Dim dDateTime2 As Date
Dim iWochentag2 As Integer
Dim iStd2 As Integer, iMin2 As Integer, iSec2 As Integer
Dim bWerktagsVon09Bis1800 As Boolean
->*** Löschsperre erstmal löschen
bZeitGrenzeDurchOffset = False
->*** DateTime
iWochentag = WeekDay(dDateTime)
iStd = Hour(dDateTime)
iMin = Minute(dDateTime)
iSec = Second(dDateTime)
iOffsetStd = Hour(dTimeOffset)
iOffsetMin = Minute(dTimeOffset)
->Werktags9bis18Uhr ? für DateTime
If IstFeiertag(dDateTime) Then
WerktagsVon09Bis1800 = False
ElseIf (iWochentag = vbSaturday) Or (iWochentag = vbSunday) Then
WerktagsVon09Bis1800 = False
ElseIf iStd >= 9 And iStd <= 17 Then
WerktagsVon09Bis1800 = True
ElseIf iStd = 18 And iMin = 0 And iSec = 0 Then
WerktagsVon09Bis1800 = True
Else
WerktagsVon09Bis1800 = False
End If
->*** DateTime + Zeitoffset
->Zeitoffset auf DateTime addieren -> DateTime2
dDateTime2 = DateAdd(h, iOffsetStd, dDateTime)->std
dDateTime2 = DateAdd(n, iOffsetMin, dDateTime2)->min
iWochentag2 = WeekDay(dDateTime2)
iStd2 = Hour(dDateTime2)
iMin2 = Minute(dDateTime2)
iSec2 = Second(dDateTime2)
->Werktags9bis18Uhr ? für DateTime2
If IstFeiertag(dDateTime2) Then
bWerktagsVon09Bis1800 = False
ElseIf (iWochentag2 = vbSaturday) Or (iWochentag2 = vbSunday) Then
bWerktagsVon09Bis1800 = False
ElseIf iStd2 >= 9 And iStd2 <= 17 Then
bWerktagsVon09Bis1800 = True
ElseIf iStd2 = 18 And iMin2 = 0 And iSec2 = 0 Then
bWerktagsVon09Bis1800 = True
Else
bWerktagsVon09Bis1800 = False
End If
b9UhrGrenze = False
b18UhrGrenze = False
->Urteil für beide Datum ungleich ?
If Not (bWerktagsVon09Bis1800 = WerktagsVon09Bis1800) Then
->nein -> nicht löschen
bZeitGrenzeDurchOffset = True
->Grenze 9:00 bzw. 18:00
If iStd < 9 And iStd2 >= 9 Then b9UhrGrenze = True Else b18UhrGrenze = True
If b9UhrGrenze Then
->datum 9 uhr erzeugen
dDateTime900 = Format(dDateTime, dd.mm.yyyy)
dDateTime900 = DateAdd(h, 9, dDateTime900)
->datum 8:59 uhr erzeugen
dDateTime859 = Format(dDateTime, dd.mm.yyyy)
dDateTime859 = DateAdd(h, 8, dDateTime859)
dDateTime859 = DateAdd(n, 59, dDateTime859)
->Differenzen für Offset berechnen
dDiffDateTimeBis859 = dDateTime859 - dDateTime
dDiffDateTimeAb900 = dDateTime2 - dDateTime900
End If
If b18UhrGrenze Then
->datum 18 uhr erzeugen
dDateTime1800 = Format(dDateTime, dd.mm.yyyy)
dDateTime1800 = DateAdd(h, 18, dDateTime1800)
->datum 18:01 uhr erzeugen
dDateTime1801 = Format(dDateTime, dd.mm.yyyy)
dDateTime1801 = DateAdd(h, 18, dDateTime1801)
dDateTime1801 = DateAdd(n, 1, dDateTime1801)
->Differenzen für Offset berechnen
dDiffDateTimeBis1800 = dDateTime1800 - dDateTime
dDiffDateTimeAb1801 = dDateTime2 - dDateTime1801
End If
End If
End Function
'********************************************************************
Private Function IstFeiertag(dDateTime As Date) As Boolean
'*** True, wenn Datum/Zeit Feiertag ist
Dim FeiertageDatum As Variant
FeiertageDatum = Array(14.4.2006, 16.4.2006, 17.4.2006, _
1.5.2006, 25.5.2006, 4.6.2006, _
5.6.2006)
Dim sDatum As String, x As Long
sDatum = Format(dDateTime, d.m.yyyy)
IstFeiertag = False
For x = LBound(FeiertageDatum) To UBound(FeiertageDatum)
If sDatum = FeiertageDatum(x) Then IstFeiertag = True: Exit For
Next
End Function
Private Function TelefonNummernfilter(sTelNr As String) As Boolean
'*** True, wenn sTelNr mit einem TelNrFilter anfängt
Dim TelNrFilter As Variant, x As Long
TelNrFilter = Array(170, 171)
TelefonNummernfilter = False
If sTelNr = Then Exit Function
For x = LBound(TelNrFilter) To UBound(TelNrFilter)
If TelNrFilter(x) = Left(sTelNr, Len(TelNrFilter(x))) Then
TelefonNummernfilter = True: Exit For
End If
Next
End Function