Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1032to1036
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Feiertage überspringen... geht nicht...

Feiertage überspringen... geht nicht...
12.12.2008 14:30:00
Nils
Hallo,
ich habe hier ein kleines Problem.
Und zwar habe ich unter dem Tabellenblatt "Feiertage" in einem Bereich mit den Namen "Feiertage" die drin stehen. Um für einen Projektplan die Feiertage und das Wochenende zu überspringen habe ich eine Abfrage. Allerdings scheint diese in Bezug auf die Feiertage nicht zu funktionieren. Wer kann mit helfen?
Nils
Code:
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objWks
Datum = .Cells(lngZeileDatum, lngSpalte)
If Not rngFeier.Find(what:=Datum, LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then _
bolFeiertag = True
'Feiertage und Wochenden überspringen
Do Until Not (WeekDay(Datum) = vbSaturday Or WeekDay(Datum) = vbSunday Or bolFeiertag = True)

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Feiertage überspringen... geht nicht...
12.12.2008 16:44:00
fcs
Hallo Nils,
das hat ja schon mal funktioniert.
Mögliche Ursachen:
Jahr der Feiertage stimmt nicht mit dem Jahr der Datumsangebn in lngZeileDatum überein.
benutzerdefiniertes Datumsformat für Feiertage eingestellt, Excel hat dann unter VBA manchmal Schwierigkeiten beim Suchen. Hier für datumseingaben am besten nur Format Standard bzw. das Datum wie unter den Systemeinstellungen formatieren.
Evtl. die nachfolgende etwas langsamere Alternative verwenden, die bei Datumsvergleichen normalerweise immer funktioniert.
Gruß
Franz

'langsamere Alternative
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objWks
Datum = .Cells(lngZeileDatum, lngSpalte)
bolFeiertag = False
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Exit For
End If
Next
'Feiertage und Wochenden überspringen
Do Until Not (Weekday(Datum) = vbSaturday Or Weekday(Datum) = vbSunday Or bolFeiertag = True)


Anzeige
AW: Feiertage überspringen... geht nicht...
12.12.2008 17:48:29
Nils
Hi Franz,
wieder mein Retter in der Not ((-;
Keine Ahnung warum das nicht geht .. die Formate habe ich angeglichen .. ohne Erfolg.
Aber die andere "langsamere" scheint zu funktionieren.
Jetzt habe ich eigentlich nur noch ein Problem. Und zwar läuft das alles soweit gut, wenn jeweils einen Tag weiter gesprungen wird.
Wie kann ich denn bewirken, dass das erste Feld +1 von Startdatum, dass nächste dann +3 von Startdatum dann +7 Tage von Startdatum usw. markiert wird.
Vielleicht kannst du das auch noch möglich machen ...
wäre klasse!
Liebe Grüße Nils
AW: Feiertage überspringen
14.12.2008 11:00:45
Erich
Hallo Nils,
die Feiertage kannst du besser mit Application.Match (ist VERGLEICH) abprüfen.
(Find hat beim Datum (allgemein bei Zahlen) ein Problem, hat Franz ja schon geschrieben.)
Deine weitere Frage mit dem Weiterspringen um 1, 3 oder 7 Zage habe ich nicht verstanden.
Probier mal

Option Explicit
Sub tst()
Dim rngFeier As Range, objwks As Worksheet, Datum As Date
Dim lngZeileDatum As Long, lngSpalte As Long
Set objwks = Sheets(1)
lngZeileDatum = 1
lngSpalte = 1
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objwks
Datum = .Cells(lngZeileDatum, lngSpalte)
'Feiertage und Wochenden überspringen
Do While Weekday(Datum, vbMonday) > vbFriday Or _
IsNumeric(Application.Match(CDbl(Datum), rngFeier, 0))
Datum = Datum + 1
Loop
.Cells(lngZeileDatum + 1, lngSpalte) = Datum
End With
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Feiertage überspringen
15.12.2008 10:49:43
Nils
Hallo Erich,
die Frage war auch nicht komplett. (war direkt an Franz gerichtet).
Aber hier der komplette Sachverhalt.
Die unten beschrieben Funktion markiert den 1,2,3,4 Tag nach dem Startdatum.
Ich bräuchte aber die Möglichkeit, den 1,7,10,11, usw. Tag zu markieren.
Gruß Nils
Option Explicit
Private objWks As Worksheet, lngSpalte As Long, SpalteLast As Long
Private Const Farbe0 As Long = 3 'Rot -Farbe 1. Arbeitstag ab Startdatum
Private Const Farbe1 As Long = 4 'grün -Farbe 2. Arbeitstag ab Startdatum
Private Const Farbe2 As Long = 6 'gelbe -Farbe 3. Arbeitstag ab Startdatum
Private Const Farbe3 As Long = 5 'blau -Farbe 4. Arbeitstag ab Startdatum
Private Const FarbeN As Long = 2 'hellbeige -Farbe restliche Tage im Kalender
Private Const strMark As String = "o" 'optionaler Markierungstext in Zellen
Sub Autoformat(wks As Worksheet, Startvar As Date, _
Zeile As Long, zeileDatum As Long, spalteDatum1 As Long)
Dim Zelle As Range, AktDatevar As Date, Spalte As Long, bolGefunden As Boolean
'wks = Tabellenblatt in dem Formatierung ausgeführt werden soll
'Startvar = Startdatum der Aktivität
'Zeile = Zeile in der Startdatum geändert wurde
'zeileDatum = Zeile mit den Datumswerten
'spalteDatum1 = Spalte mit 1. Datum in Zeile "zeileDatum"
Set objWks = wks
With wks
'Spalte mit Start-Datum suchen
SpalteLast = IIf(IsEmpty(.Cells(zeileDatum, .Columns.Count)), _
.Cells(zeileDatum, .Columns.Count).End(xlToLeft).Column, .Columns.Count)
For Spalte = spalteDatum1 To SpalteLast
'Vergleichsdatum einlesen
AktDatevar = .Cells(zeileDatum, Spalte).Value
If Startvar = AktDatevar Then
lngSpalte = Spalte
bolGefunden = True: Exit For
Else
'Zelle formatieren, leeren
With .Cells(Zeile, Spalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
End If
Next
If bolGefunden = True Then
'Tage ab Starttag markieren, Wochenende und Feiertage werden dabei übersprungen
'Starttag markieren
Call nextWorkday(Zeile, zeileDatum, Farbe0, strMark)
If lngSpalte = SpalteLast Then Exit Sub
'1. Tag nach Starttag markieren
lngSpalte = lngSpalte + 1
Call nextWorkday(Zeile, zeileDatum, Farbe1, strMark)
If lngSpalte = SpalteLast Then Exit Sub
'2. Tag nach Starttag markieren
lngSpalte = lngSpalte + 1
Call nextWorkday(Zeile, zeileDatum, Farbe2, strMark)
If lngSpalte = SpalteLast Then Exit Sub
'5. Tag Starttag markieren
lngSpalte = lngSpalte + 3
Call nextWorkday(Zeile, zeileDatum, Farbe3, strMark)
If lngSpalte = SpalteLast Then Exit Sub
'Restliche Spalten markieren
lngSpalte = lngSpalte + 1
If lngSpalte With .Range(.Cells(Zeile, lngSpalte), .Cells(Zeile, SpalteLast))
.Interior.ColorIndex = FarbeN
.ClearContents
End With
End If
Else
MsgBox "Startdatum " & Startvar & " nicht gefunden!"
End If
End With
End Sub



Private Function nextWorkday(lngZeile, lngZeileDatum As Long, Farbe As Long, _
Optional strText As String) As Long
Dim Datum As Date, rngFeier As Range, bolFeiertag As Boolean
'Zellenbereich mit den Datumsangaben zu den Feiertagen
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objWks
Datum = .Cells(lngZeileDatum, lngSpalte)
If Not rngFeier.Find(what:=Datum, LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then _
bolFeiertag = True
'Feiertage und Wochenden überspringen
Do Until Not (WeekDay(Datum) = vbSaturday Or WeekDay(Datum) = vbSunday Or bolFeiertag = _
True)
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
lngSpalte = lngSpalte + 1
nextWorkday = lngSpalte
If lngSpalte = SpalteLast Then
MsgBox "Konnte nicht markieren, da Ende von Kalenderbereich erereicht!"
Exit Function
End If
Datum = .Cells(lngZeileDatum, lngSpalte).Value
If Not rngFeier.Find(what:=Datum, LookIn:=xlValues, lookat:=xlWhole) Is Nothing Then
bolFeiertag = True
Else
bolFeiertag = False
End If
Loop
'Zelle formatieren und Markierung eintragen
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = Farbe
If strText  "" Then
.Value = strMark
Else
.ClearContents
End If
End With
End With
End Function


Anzeige
AW: Feiertage überspringen
15.12.2008 12:11:00
Nils
Hm .. also ich habe den Code jetzt wie folgt angepasst:

Private Function nextWorkday(lngZeile, lngZeileDatum As Long, Farbe As Long, Optional strText  _
As String) As Long
Dim Datum As Date, rngFeier As Range, bolFeiertag As Boolean
'Zellenbereich mit den Datumsangaben zu den Feiertagen
Dim intI As Long
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objWks
Datum = .Cells(lngZeileDatum, lngSpalte)
bolFeiertag = False
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Exit For
End If
Next
'Feiertage und Wochenden überspringen
Do Until Not (WeekDay(Datum) = vbSaturday Or WeekDay(Datum) = vbSunday Or bolFeiertag =  _
True)
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
lngSpalte = lngSpalte + 1
nextWorkday = lngSpalte
If lngSpalte = SpalteLast Then
MsgBox "Konnte nicht markieren, da Ende von Kalenderbereich erereicht!"
Exit Function
End If
Datum = .Cells(lngZeileDatum, lngSpalte).Value
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Else
bolFeiertag = False
End If
Next
Loop
'Zelle formatieren und Markierung eintragen
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = Farbe
If strText  "" Then
.Value = strMark
Else
.ClearContents
End If
End With
End With
End Function


Was aber irgendwie nicht funktioniert ist, wenn zwei Feiertage (also z. B. 25 und 26.12.) aufeinander folgen. Denn den zweiten ignoriert er dann?
Nils.

Anzeige
AW: Feiertage überspringen
15.12.2008 13:07:00
Nils
Hallo,
ich habe jetzt die Zeile wie folgt geändert.
Das funktioniert auch bei einer Feiertag. Bei zwei Feiertagen hintereinander gehts aber nicht (z. b. 25 und 26.12.2008). Woran kann das liegen?
Nils

Private Function nextWorkday(lngZeile, lngZeileDatum As Long, Farbe As Long, Optional strText  _
As String) As Long
Dim Datum As Date, rngFeier As Range, bolFeiertag As Boolean
'Zellenbereich mit den Datumsangaben zu den Feiertagen
Dim intI As Long
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objWks
Datum = .Cells(lngZeileDatum, lngSpalte)
bolFeiertag = False
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Exit For
End If
Next
'Feiertage und Wochenden überspringen
Do Until Not (WeekDay(Datum) = vbSaturday Or WeekDay(Datum) = vbSunday Or bolFeiertag =  _
True)
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
lngSpalte = lngSpalte + 1
nextWorkday = lngSpalte
If lngSpalte = SpalteLast Then
MsgBox "Konnte nicht markieren, da Ende von Kalenderbereich erereicht!"
Exit Function
End If
Datum = .Cells(lngZeileDatum, lngSpalte).Value
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Else
bolFeiertag = False
End If
Next
Loop
'Zelle formatieren und Markierung eintragen
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = Farbe
If strText  "" Then
.Value = strMark
Else
.ClearContents
End If
End With
End With
End Function


Anzeige
AW: Feiertage überspringen
15.12.2008 13:08:00
Nils
Hallo,
klappt jetzt bei einem Feiertag. Bei zweien hinterander gehts aber leider nicht?
Wer weiß, woran das liegt?
Nils

Private Function nextWorkday(lngZeile, lngZeileDatum As Long, Farbe As Long, Optional strText  _
As String) As Long
Dim Datum As Date, rngFeier As Range, bolFeiertag As Boolean
'Zellenbereich mit den Datumsangaben zu den Feiertagen
Dim intI As Long
Set rngFeier = Worksheets("Feiertage").Range("Feiertage")
With objWks
Datum = .Cells(lngZeileDatum, lngSpalte)
bolFeiertag = False
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Exit For
End If
Next
'Feiertage und Wochenden überspringen
Do Until Not (WeekDay(Datum) = vbSaturday Or WeekDay(Datum) = vbSunday Or bolFeiertag =  _
True)
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
lngSpalte = lngSpalte + 1
nextWorkday = lngSpalte
If lngSpalte = SpalteLast Then
MsgBox "Konnte nicht markieren, da Ende von Kalenderbereich erereicht!"
Exit Function
End If
Datum = .Cells(lngZeileDatum, lngSpalte).Value
For intI = 1 To rngFeier.Rows.Count
If Datum = rngFeier(intI, 1) Then
bolFeiertag = True
Else
bolFeiertag = False
End If
Next
Loop
'Zelle formatieren und Markierung eintragen
With .Cells(lngZeile, lngSpalte)
.Interior.ColorIndex = Farbe
If strText  "" Then
.Value = strMark
Else
.ClearContents
End If
End With
End With
End Function


Anzeige
AW: Feiertage überspringen
15.12.2008 14:37:25
fcs
Hallo Nils,
mit folgender Anpassung sollte es funktionieren.
Das Problem mit 1., 7. ,10., 11. Tag usw. markieren sollte eigentlich ähnlich wie für die bisherigen Tage funktionieren.
Der 1. Tag dürfte klar sein. Für die weiteren Tage muss du dann in Hauptprozedur den Spaltenzähler nach jedem abgearbeiteten Tag entsprechend höher setzen. Am besten eine kleine For-Next-Schleife einbauen, wobei unterschiedliche Farben innerhalb der Schleife dann in einer Select Case - Anweisung zugewiesen werden müssen.
Nachfolgend die nicht getesteten angepassten Prozeduren. Hoffe du kriegst das hin.
Gruß
Franz

Private objWks As Worksheet, lngSpalte As Long, SpalteLast As Long
Private Const Farbe0 As Long = 3 'Rot -Farbe 1. Arbeitstag ab Startdatum
Private Const Farbe1 As Long = 4 'grün -Farbe 2. Arbeitstag ab Startdatum
Private Const Farbe2 As Long = 6 'gelbe -Farbe 3. Arbeitstag ab Startdatum
Private Const Farbe3 As Long = 5 'blau -Farbe 4. Arbeitstag ab Startdatum
Private Const Farbe4 As Long = 7 'pink -Farbe 4. Arbeitstag ab Startdatum
Private Const Farbe5 As Long = 19 'hellgelb -Farbe 4. Arbeitstag ab Startdatum
Private Const FarbeN As Long = 2 'hellbeige -Farbe restliche Tage im Kalender
Private Const strMark As String = "o" 'optionaler Markierungstext in Zellen
Sub Autoformat(wks As Worksheet, Startvar As Date, _
Zeile As Long, zeileDatum As Long, spalteDatum1 As Long)
Dim Zelle As Range, AktDatevar As Date, Spalte As Long, bolGefunden As Boolean
Dim Tag As Long, FarbeTag As Long
'wks = Tabellenblatt in dem Formatierung ausgeführt werden soll
'Startvar = Startdatum der Aktivität
'Zeile = Zeile in der Startdatum geändert wurde
'zeileDatum = Zeile mit den Datumswerten
'spalteDatum1 = Spalte mit 1. Datum in Zeile "zeileDatum"
Set objWks = wks
With wks
'Spalte mit Start-Datum suchen
SpalteLast = IIf(IsEmpty(.Cells(zeileDatum, .Columns.Count)), _
.Cells(zeileDatum, .Columns.Count).End(xlToLeft).Column, .Columns.Count)
For Spalte = spalteDatum1 To SpalteLast
'Vergleichsdatum einlesen
AktDatevar = .Cells(zeileDatum, Spalte).Value
If Startvar = AktDatevar Then
lngSpalte = Spalte
bolGefunden = True: Exit For
Else
'Zelle formatieren, leeren
With .Cells(Zeile, Spalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
End If
Next
If bolGefunden = True Then
'Tage ab Starttag markieren, Wochenende und Feiertage werden dabei übersprungen
'Starttag markieren
For Tag = 1 To 20
Select Case Tag
Case 1, 7, 10 To 12
'Auflistung der Tage die einschließlich des 1. Tages markiert werden sollen
Select Case Tag
Case 1: FarbeTag = Farbe0
Case 7: FarbeTag = Farbe1
Case 10: FarbeTag = Farbe2
Case 11: FarbeTag = Farbe3
Case 12: FarbeTag = Farbe4
'usw.
Case Else
MsgBox "Für diesen Tag fehlt Farbzuweisung!"
End Select
Call nextWorkday(Zeile, zeileDatum, FarbeTag, strMark)
Case Else
'Arbeitstag mit neutraler farbe füllen
Call nextWorkday(Zeile, zeileDatum, FarbeN, "")
End Select
If lngSpalte = SpalteLast Then Exit For
lngSpalte = lngSpalte + 1
Next
If lngSpalte = SpalteLast Then Exit Sub
'Restliche Spalten markieren
If lngSpalte  "" Then
.Value = strMark
Else
.ClearContents
End If
End With
End With
End Function


Anzeige
AW: Feiertage überspringen
15.12.2008 15:09:00
Nils
Hi Franz,
DANKE!!!!!
Das funktioniert prima.
Was würde ich nur ohne dich machen!
Habe versucht ein anderes Problem selbst in den Griff zu bekommen.
Nämlich, dass drei verschiedene Timings aufgerufen werden müssen, wenn ein "x" in einer Spalte gesetzt ist. (ist die Auswahl, welche Timingplan zur Anwendung kommen soll - es gibt derzeit drei).
Das funktioniert auch soweit.
Nur das zum einen sicher geprüft werden sollte, wenn jemand ein Datum ändert, aber keine Auswahl in der Spalte 36,37 oder 38 getroffen hat und das dieser Weg dazu führt, dass ich die gesamte Sub duplizieren und die Variablen alle neu definieren muss, oder? Gibt es ggf. hier einen einfacheren Weg?
Nils

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle
Const SpalteDatum = 5 'Spalte E in der Startdatum überwacht werden soll
Const Zeile1 = 4 '1. zeile ab der Eingabedatum überwacht werden soll
'Prüfen ob Eingabezelle in Spalte "SpalteDatum" unterhalb von "Zeile1" geändert wurde
'Es können innerhalb der Spalte auch mehrere Zellen geändert werden.
If Not Intersect(Target, Range(Cells(Zeile1, SpalteDatum), Cells(Rows.Count, _
SpalteDatum))) Is Nothing Then
Application.EnableEvents = False
For Each Zelle In Target
If Zelle.Column = SpalteDatum And Cells(Zelle.Row, 36).Value  "" Then
Call Autoformat(wks:=Worksheets("Kalender"), Startvar:=Zelle.Value, _
Zeile:=Zelle.Row, zeileDatum:=3, spalteDatum1:=5)
ElseIf Zelle.Column = SpalteDatum And Cells(Zelle.Row, 37).Value  "" Then
Call Auto_2(wks2:=Worksheets("Kalender"), Startvar2:=Zelle.Value, _
Zeile2:=Zelle.Row, zeileDatum2:=3, spalteDatum2:=5)
ElseIf Zelle.Column = SpalteDatum And Cells(Zelle.Row, 38).Value  "" Then
Call Auto_3(wks3:=Worksheets("Kalender"), Startvar3:=Zelle.Value, _
Zeile3:=Zelle.Row, zeileDatum3:=3, spalteDatum3:=5)
End If
Next
Application.EnableEvents = True
End If
End Sub


Anzeige
AW: Feiertage überspringen
15.12.2008 17:08:00
fcs
Hallo Nils,
die Variablen muss du nicht alle umbnennen. Allerdings müsste man man eine etwas andere Strategie fahren, um den Variablen Werte zuzuweisen.
Ganz ideal ist es, die Parameter "Tage", die gefärbt werden sollen, und "Farbe für Tag" als ArrayVariable an die Prozedur zu übergeben. Da müsste man aber nochmals etwas umstricken. Wobei die Sub NextWorkday unverändert bleibt.
Gruß
Franz

'Modifizierte Prozedur
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zelle As Range, arrTage, arrFarben
Const SpalteDatum = 5 'Spalte E in der Startdatum überwacht werden soll
Const Zeile1 = 4 '1. zeile ab der Eingabedatum überwacht werden soll
'Prüfen ob Eingabezelle in Spalte "SpalteDatum" unterhalb von "Zeile1" geändert wurde
'Es können innerhalb der Spalte auch mehrere Zellen geändert werden.
If Not Intersect(Target, Range(Cells(Zeile1, SpalteDatum), Cells(Rows.Count, _
SpalteDatum))) Is Nothing Then
Application.EnableEvents = False
For Each Zelle In Target
If Zelle.Column = SpalteDatum And Cells(Zelle.Row, 36).Value  "" Then
'Array mit den Tagen inkl. Starttag die eingefärbt werden sollen
'Tage bitte aufsteigend im Array angeben
arrTage = Array(1, 2, 3, 5)
'Array mit den ColorIndex-Farben zu den Tagen, _
Array muss die gleiche Anzahl einträge haben wie arrTage!
arrFarben = Array(3, 4, 6, 5)
Call Autoformat(wks:=Worksheets("Kalender"), Startvar:=Zelle.Value, _
Zeile:=Zelle.Row, zeileDatum:=3, spalteDatum1:=5, arrTage:=arrTage, _
arrFarben:=arrFarben, GrundFarbe:=2)
ElseIf Zelle.Column = SpalteDatum And Cells(Zelle.Row, 37).Value  "" Then
arrTage = Array(1, 7, 10, 11, 12)
arrFarben = Array(3, 6, 5, 7, 19)
Call Autoformat(wks:=Worksheets("Kalender"), Startvar:=Zelle.Value, _
Zeile:=Zelle.Row, zeileDatum:=3, spalteDatum1:=5, arrTage:=arrTage, _
arrFarben:=arrFarben, GrundFarbe:=2)
ElseIf Zelle.Column = SpalteDatum And Cells(Zelle.Row, 38).Value  "" Then
arrTage = Array(1, 7, 14, 21)
arrFarben = Array(3, 6, 5, 7)
Call Autoformat(wks:=Worksheets("Kalender"), Startvar:=Zelle.Value, _
Zeile:=Zelle.Row, zeileDatum:=3, spalteDatum1:=5, arrTage:=arrTage, _
arrFarben:=arrFarben, GrundFarbe:=22)
End If
Next
Application.EnableEvents = True
End If
End Sub
'Neue Autoformat-Prozedur
Option Explicit
Private objWks As Worksheet, lngSpalte As Long, SpalteLast As Long
'usw ggf. weiter Variablen Anlegen
Private FarbeN As Long    ' Farbe restliche Tage im Kalender
Private strMark As String 'optionaler Markierungstext in Zellen
Sub Autoformat(wks As Worksheet, Startvar As Date, _
Zeile As Long, zeileDatum As Long, spalteDatum1 As Long, arrTage, arrFarben, _
Optional GrundFarbe As Long = 2, Optional strMarkierung As String = "o")
Dim Zelle As Range, AktDatevar As Date, Spalte As Long, bolGefunden As Boolean
Dim Tag As Long, FarbeTag As Long, intI As Integer, bolFaerben As Boolean
'wks = Tabellenblatt in dem Formatierung ausgeführt werden soll
'Startvar = Startdatum der Aktivität
'Zeile = Zeile in der Startdatum geändert wurde
'zeileDatum = Zeile mit den Datumswerten
'spalteDatum1 = Spalte mit 1. Datum in Zeile "zeileDatum"
'arrTage = Array mit den zu markierenden Tagen           Array(1, 2, 7, 10, 11, 12)
'arrFarben = Array mit den Farben der markierenden Tage  Array(3, 4, 6, 5, 7, 19)
'GrundFarbe =   Farbe für restliche Tage im Kalender, VorrgabeWert = 2
'strMarkierung = 'optionaler Markierungstext in Zellen, VorrgabeWert = "o"
'Werte die auch in NextWorkDay benutzt werden
FarbeN = GrundFarbe  'hellbeige -Farbe restliche Tage im Kalender
strMark = strMarkierung 'optionaler Markierungstext in Zellen
Set objWks = wks
With wks
'Spalte mit Start-Datum suchen
SpalteLast = IIf(IsEmpty(.Cells(zeileDatum, .Columns.Count)), _
.Cells(zeileDatum, .Columns.Count).End(xlToLeft).Column, .Columns.Count)
For Spalte = spalteDatum1 To SpalteLast
'Vergleichsdatum einlesen
AktDatevar = .Cells(zeileDatum, Spalte).Value
If Startvar = AktDatevar Then
lngSpalte = Spalte
bolGefunden = True: Exit For
Else
'Zelle formatieren, leeren
With .Cells(Zeile, Spalte)
.Interior.ColorIndex = FarbeN
.ClearContents
End With
End If
Next
If bolGefunden = True Then
'Tage ab Starttag markieren, Wochenende und Feiertage werden dabei übersprungen
'Starttag markieren
For Tag = 1 To arrTage(UBound(arrTage))
'Vergleich mit Tage-Array
FarbeTag = FarbeN
bolFaerben = False
For intI = LBound(arrTage) To UBound(arrTage)
If arrTage(intI) = Tag Then
FarbeTag = arrFarben(intI)
bolFaerben = True
Exit For
End If
Next
If bolFaerben = True Then
Call nextWorkday(Zeile, zeileDatum, FarbeTag, strMark)
Else
Call nextWorkday(Zeile, zeileDatum, FarbeN, "")
End If
If lngSpalte = SpalteLast Then Exit For
lngSpalte = lngSpalte + 1
Next
If lngSpalte = SpalteLast Then Exit Sub
'Restliche Spalten markieren
If lngSpalte 


Anzeige
AW: Feiertage überspringen
16.12.2008 09:37:00
Nils
Danke!
Funktioniert prima.
Wie viele Jahre VBA muss man auf dem Buckel haben um das schreiben zu können?
P.S.:Er hat mir beim Ändern des Datum zwar manchmal was von einem Zirkelverweis erzählt, aber beim erneuten Versuch ging es dann einwandfrei.

258 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige