Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Feiertage mit VBA hervorheben

Feiertage mit VBA hervorheben
11.11.2006 14:25:15
Nils
Habe nun erfolgreich mein Dienstplan mit Excel erstellt.
http://www.clumsy-net.de/dienstplan.zip
Auf dem Tabellenblatt "Daten" habe ich die gesetzlichen Feiertage berechnet!
Was ich mir nun vorstelle ist folgendes:
Mit VBA programmieren und alle Zellen aller Blätter mit den berechneten Feiertagen vergleichen, bei gefundener Übereinstimmung, den Text "Feiertag" in die Zelle UNTER das Datum schreiben.
Siehe Beispiel:
http://www.clumsy-net.de/beispiel.jpg
Die Zelle mit dem gefundenem Datum und die Zelle darüber mit dem Wochentag soll dann hellgrau ausgefüllt werden.
Ist das möglich?
Kann mir da jemand helfen?
Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Feiertage mit VBA hervorheben
11.11.2006 21:28:31
Peter
Hallo Nils,
ich habe dir ein Makro zum Markieren der Feiertage eingefügt.
Im Blatt 'Daten' findest du den Button zu Starten.
Die Texte Feiertag werden allerdings Groß und Fett eingetragen, weil das Zellenformat offensichtlich so ist.
https://www.herber.de/bbs/user/38088.xls
Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Anzeige
AW: Feiertage mit VBA hervorheben
11.11.2006 22:13:41
fcs
Hallo Nils,
hier mein Vorschlag zur Feiertagsmarkierung. Dabei wird auch die etwas zu große Schrift für den Eintrag mit korrigiert. Es werden zuerst evtl. vorhandenen Feiertagsmarkierungen gesucht und gelöscht, dann die neuen eingetragen.
MakroCode in ein Modul der Datei kopieren.
Gruss
Franz

Sub Feiertagemarkieren()
Dim wksDaten As Worksheet, wksMonat As Worksheet, Feiertag As Variant, Zelle As Range
Dim Zeile As Long, Monat As Integer
Set wksDaten = Worksheets("Daten")
Zeile = 14 '1. Zeile mit Feiertag in Spalte G Blatt Daten
'vorhandene (alte) Feiertagseinträge löschen
For Monat = 1 To 12
Set wksMonat = Worksheets("A-" & Format(I, "00"))
For Each Zelle In wksMonat.Range("C20:G32")
If Zelle.Value = "Feiertag" Then
Zelle.ClearContents
Zelle.Font.Size = 18
Zelle.Offset(-2, 0).Range("A1:A2").Interior.ColorIndex = xlNone 'keine Farbe
End If
Next
Next
'Feiertage markieren
Do
Feiertag = wksDaten.Cells(Zeile, "G")
If Feiertag = 0 Then Exit Do
Set wksMonat = Worksheets("A-" & Format(Month(Feiertag), "00"))
For Each Zelle In wksMonat.Range("C19:G31")
If Zelle.Value = Feiertag Then
Zelle.Offset(1, 0).Value = "Feiertag"
Zelle.Offset(1, 0).Font.Size = 12
Zelle.Offset(-1, 0).Range("A1:A2").Interior.ColorIndex = 20 'Hellgrau
End If
Next
Zeile = Zeile + 2
Loop
End Sub

Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 10:11:34
Peter
Hallo Nils,
hier noch einmal - nun mit Dokumentation, löschen der Vorjahres-Einträge, farbigmachen der Feiertage.
https://www.herber.de/bbs/user/38094.xls
Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 13:08:30
Nils
Erst einmal vielen Dank für Eure Mühen, habe gerade die Vorschläge ausprobiert.
der Vorschlag von "fcs" funtioniert nicht, fehler bei:
Set wksMonat = Worksheets("A-" & Format(I, "00"))
Die 2. Variante von Peter Feustel gefällt mir schon sehr gut, nur zwei Kleinigkeiten stören mich noch:
Die Zelle in der "Feiertag" steht wird hier farbig hevorgehoben, kannst du anstatt dessen die beiden Zellen mit Wochentag und Datum farbig hevorheben?
Das zweite wäre die Ausrichtung des Textes "Feiertag", die Zellen sind auf "zentriert und zentriert" (vertikal und horizontal), Schriftgröße 18 und fett standardmäßig eingestellt. Diese Einstellung ist wichtig für die Verwendung des Dienstplanes. Der Text "Feiertag" sollte aber "zentriert und oben" ausgerichtet werden, außerdem schriftgröße 10 und fett. Bei erneuter Ausführung des Makros und dem Löschvorgang vorhandener Feiertage müsste hier der Standard wieder hergestellt werden, also "zentriert und zentriert", Schriftgröße 18 und fett.
Das wäre dann alles, ansonsten topp Makro!!!
Vielen dank für eure mühen.
ich find die angebotene hilfe hier im forum vorbildlich, echt klasse!
Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 13:35:12
fcs
Hallo Nils,
da hatte ich leider zum Schluss vergessen in dieser Zeile die variable "I" in "Monat" umzubenennen.
Die Fontgröße und vertikale Ausrichtung für "Feiertag" hab ich mit eingebaut.
Gruss
Franz

Sub Feiertagemarkieren()
Dim wksDaten As Worksheet, wksMonat As Worksheet, Feiertag As Variant, Zelle As Range
Dim Zeile As Long, Monat As Integer
Set wksDaten = Worksheets("Daten")
Zeile = 14 '1. Zeile mit Feiertag in Spalte G Blatt Daten
'vorhandene (alte) Feiertagseinträge löschen
For Monat = 1 To 12
Set wksMonat = Worksheets("A-" & Format(Monat, "00"))
For Each Zelle In wksMonat.Range("C20:G32")
If Zelle.Value = "Feiertag" Then
Zelle.ClearContents
Zelle.VerticalAlignment = xlVAlignCenter
Zelle.Font.Size = 18
Zelle.Offset(-2, 0).Range("A1:A2").Interior.ColorIndex = xlNone 'keine Farbe
End If
Next
Next
'Feiertage markieren
Do
Feiertag = wksDaten.Cells(Zeile, "G")
If Feiertag = 0 Then Exit Do
Set wksMonat = Worksheets("A-" & Format(Month(Feiertag), "00"))
For Each Zelle In wksMonat.Range("C19:G31")
If Zelle.Value = Feiertag Then
Zelle.Offset(1, 0).Value = "Feiertag"
Zelle.Offset(1, 0).Font.Size = 10
Zelle.Offset(1, 0).VerticalAlignment = xlVAlignTop
Zelle.Offset(-1, 0).Range("A1:A2").Interior.ColorIndex = 20 'Hellgrau
End If
Next
Zeile = Zeile + 2
Loop
End Sub

Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 18:18:50
Nils
Ich habe jetzt 12 neue Tabellenblätter hinzugefügt, und plötzlich funktioniert das Makro nicht mehr :(
http://www.clumsy-net.de/Dienstplan.zip
AW: Feiertage mit VBA hervorheben
12.11.2006 18:37:18
Nils
ok, es liegt am Blattschutz, ist er deaktiviert, gehts wieder! allerdings funktionniert das makro bei einem weiterem Dienstplan für die Spätschicht nicht mehr vernünftig!
er makiert mir Zelle E51 im Arbeitsblatt "A-01" als Feiertag... obwohl er dort garnicht nach einem Feiertag suchen soll!
PS:
Muss der Laufindex nun auch geändert werden? weil ich ja jtzt mehr Arbeitsblätter habe, und im Makro steht noch "1 to 12"
Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 18:39:44
Nils
da die blätter in zukunft geschützt werden sollen, frage ich mich, wie man das dem makro beibringen soll, so dass es immer noch funktioniert?!
AW: Feiertage mit VBA hervorheben
12.11.2006 20:04:55
fcs
Hallo Nils,
das mit der Zelle E51 war ein kleienr Programmierfehler meinerseits. Ist nun bereinigt.
Blattschutz wird Makro jetzt auch verarbeitet. Ist das Blatt geschützt, dann deaktivert das Makro ihn vorübergehend und schaltet ihn nach der bearbeitung wieder ein.
Laufindex:
Der Laufindex 1 bis 12 muß bleiben, er wird benötigt, um aus dem Feiertagsdatum den zugehörigen Blattnamen zu bestimmen.
Ich hab eine zusätzliche Schleife für die Schichten eingebaut. Falls es auch noch eine Nachtschicht geben sollte, dann muss du im Makro in der 4. Zeile das Array erweitern um einen Eintrag für die 2 Zeichen, die vor der Monatszahl stehen.
Gruss
Franz

Sub Feiertagemarkieren()
Dim wksDaten As Worksheet, wksMonat As Worksheet, Feiertag As Variant, Zelle As Range
Dim Zeile As Long, Monat As Integer, Bereich As Range
Dim Schichten, i As Integer, Schutz As Boolean
Schichten = Array("A-", "Z-")
Set wksDaten = Worksheets("Daten")
Zeile = 14 '1. Zeile mit Feiertag in Spalte G Blatt Daten
'vorhandene (alte) Feiertagseinträge löschen
For Monat = 1 To 12
For i = 0 To UBound(Schichten)
Set wksMonat = Worksheets(Schichten(i) & Format(Monat, "00"))
If wksMonat.ProtectContents = True Then
wksMonat.Unprotect
Schutz = True
Else
Schutz = False
End If
Set Bereich = Application.Union(wksMonat.Range("C20:G32"), wksMonat.Range("C67:G79"))
For Each Zelle In Bereich
If Zelle.Value = "Feiertag" Then
Zelle.ClearContents
Zelle.VerticalAlignment = xlVAlignCenter
Zelle.Font.Size = 18
Zelle.Offset(-2, 0).Range("A1:A2").Interior.ColorIndex = xlNone 'keine Farbe
End If
Next
If Schutz = True Then wksMonat.Protect
Next i
Next
'Feiertage markieren
Do
Feiertag = wksDaten.Cells(Zeile, "G")
If Feiertag = 0 Then Exit Do
For i = 0 To UBound(Schichten)
Set wksMonat = Worksheets(Schichten(i) & Format(Month(Feiertag), "00"))
If wksMonat.ProtectContents = True Then
wksMonat.Unprotect
Schutz = True
Else
Schutz = False
End If
Set Bereich = Application.Union(wksMonat.Range("C19:G31"), wksMonat.Range("C66:G78"))
For Each Zelle In Bereich
If Zelle.Value = Feiertag Then
Zelle.Offset(1, 0).Value = "Feiertag"
Zelle.Offset(1, 0).Font.Size = 10
Zelle.Offset(1, 0).VerticalAlignment = xlVAlignTop
Zelle.Offset(-1, 0).Range("A1:A2").Interior.ColorIndex = 15 'Hellgrau
End If
Next
If Schutz = True Then wksMonat.Protect
Next i
Zeile = Zeile + 2
Loop
End Sub

Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 22:07:27
Nils
hmmm... das mit dem Laufindex will ich jetzt irgendwie garnicht verstehen!
warum die 12 ?! wozu?! ich meine ich habe jetzt 24 Blätter plus das datenblatt, ich habe 11 feiertage,... hmmm... und wenn er jetzt mit dem Laufindex die Datenblätter A-01 bis A-12 durchläuft, woher weiß er denn, welche das sind? weil die ja jetzt durchmischt sind. die reihenfolge ist ja A-01, Z-01, A-02, Z-02, A-03, ... usw...
hmmm...
aber es funktionniert jetzt alles, excel ist schon ein tolles programm ;)
danke
Anzeige
AW: Feiertage mit VBA hervorheben
14.11.2006 14:18:08
Nils
Hallo Franz,
die Datenblätter Z-01 bis Z-12 sind zur eingabe der möglichen Arbeitstage und ihrer Dauer gedacht. Es erfolgt noch (in Zukunft von mir) eine weitere Lohnberechnung. Die Blätter A-01 bis A-12 sind ausschließlich zum Ausdrucken gedacht, an ihnen soll der Anwender später nix verändern können / dürfen.
Nun zum Problem:
Betrifft Arbeitsblätter Z-01 bis Z-12:
Macht der Anwender in einer Zelle D5:29 und H5:29 ein Kreuz "x" wird dies automatisch in den vorgefertigten Ausdruck (entweder Frühschicht oder Spätschicht) an entsprechender Stelle übernommen. D.h. die Zellen in den Arbeitsblättern A-01 bis A-12 müssten entsprechend verknüpft werden, damit das auch geschieht.logisch.
Das Problem ist jetzt aber, dass das Makro diese Verknüpfungen löscht, wenn es das Wort "Feiertag" in die entsprechenden Zellen schreibt. Was ja auch eigentlich völlig korrekt ist, weil die Verknüpfung auch gelöscht werden sollte. Berechnet man jetzt aber die Feiertagsdaten für ein anderes Jahr, und lässt die Feiertage erneut berechnen und markieren, dann werden ja wieder zuerst die vorhandenen alten Einträge gelöscht, um dann im nächsten Schritt die neuen Feiertage zu markieren. Bei den alten Feiertagen ist jetzt aber nun die Verknüpfung immer noch weg, obwohl sie keine Feiertage mehr sind.
Das Makro müsste also so verändert werden, dass diese Verknüpfung bei allen Arbeitstagen erhalten bleibt. Auch wenn ein jetziger Arbeitstag mal ein Feiertag war.
Das wäre ein Problem, das andere ist denke ich nicht besonders aufwendig:
Die Zellen mit den Feiertagen müssten auch in den Blättern Z-01 bis Z-12 mit der Farbe "15" (hellgrau) hinterlegt werden. Nur eine Zellenhinterlegung, weiter nix.
Hier ist das aktuelle Dokument:
https://www.herber.de/bbs/user/38148.xls
Ich danke dir sehr Franz,
liebe grüße
Nils
Anzeige
AW: Feiertage mit VBA hervorheben
14.11.2006 16:35:48
fcs
Hallo Nils,
hab das Makro jetzt nochmals angepasst. Sollte jetzt alle gewünschten Funktionen haben.
Für die Formel zur Übernahme der x-Einträge aus den Z-Blättern in die A-Blätter habe ich eine "jahresfeste" SVERWEIS-Formel eingefügt.
Diese Formeln hab ich mit einem Extra-Makro in allen 12-Blätern generiert.
Das Feiertagsmakro stellt diese Formel auch wieder her wenn es einen Feiertag des Vorjahres löscht.
Wegen der Dateigröße nach dem Einfügen aller Formeln Datei als ZIP-Datei
https://www.herber.de/bbs/user/38157.zip
Gruß
Franz
Anzeige
AW: Feiertage mit VBA hervorheben
14.11.2006 20:53:15
Nils
Ohhh man,
das ist ja echt wahnsinn!
Wo hast du das alles gelernt, wenn ich mal fragen darf? Brauchst du lange für sowas?
Ich sitz hier teilweise stundenlang um ein (für dich wahrscheinlich leichtes) Problem zu lösen.
Das mit dem SVERWEIS hab ich noch nicht so richtig verstanden, ich kannte die Arbeitsblattfunktion bis heute noch nicht. Bei Excel lernt man irgendwie nie aus...
Ich werd mir mal demnächst ein Buch über VBA für Anfänger kaufen, sowas will ich auch können :)
Danke Franz!
Echt super Leistung!
Ist mir schon voll unangenehm ;)
Liebe Grüße
Nils
Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 16:28:09
Nils
Supper sache!
Vielen dank!
Diese lösung funktionniert einwandfrei!
danke danke danke :)
AW: Feiertage mit VBA hervorheben
13.11.2006 18:14:41
Peter
Hallo Nils,
dann test einmal die beigefügte, geänderte Version:
https://www.herber.de/bbs/user/38119.xls
Viele Grüße Peter
Eine kurze Nachricht, ob es läuft, wäre nett - danke.
Anzeige
AW: Feiertage mit VBA hervorheben
12.11.2006 13:11:23
Nils
achso, eins habe ich vergessen. Auf dem Arbeitsblatt "Daten" werden ebenfalls fälschlicher weise feiertage markiert... fehler?!
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Feiertage mit VBA hervorheben in Excel


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und erstelle ein neues Arbeitsblatt.

  2. Füge ein neues Modul hinzu:

    • Klicke auf Entwicklertools > Visual Basic.
    • Wähle Einfügen > Modul.
  3. Kopiere den folgenden VBA-Code in das Modul:

    Sub Feiertagemarkieren()
       Dim wksDaten As Worksheet, wksMonat As Worksheet, Feiertag As Variant, Zelle As Range
       Dim Zeile As Long, Monat As Integer
       Set wksDaten = Worksheets("Daten")
       Zeile = 14 '1. Zeile mit Feiertag in Spalte G Blatt Daten
       'vorhandene (alte) Feiertagseinträge löschen
       For Monat = 1 To 12
           Set wksMonat = Worksheets("A-" & Format(Monat, "00"))
           For Each Zelle In wksMonat.Range("C20:G32")
               If Zelle.Value = "Feiertag" Then
                   Zelle.ClearContents
                   Zelle.Font.Size = 18
                   Zelle.Offset(-2, 0).Range("A1:A2").Interior.ColorIndex = xlNone 'keine Farbe
               End If
           Next
       Next
       'Feiertage markieren
       Do
           Feiertag = wksDaten.Cells(Zeile, "G")
           If Feiertag = 0 Then Exit Do
           Set wksMonat = Worksheets("A-" & Format(Month(Feiertag), "00"))
           For Each Zelle In wksMonat.Range("C19:G31")
               If Zelle.Value = Feiertag Then
                   Zelle.Offset(1, 0).Value = "Feiertag"
                   Zelle.Offset(1, 0).Font.Size = 10
                   Zelle.Offset(1, 0).VerticalAlignment = xlVAlignTop
                   Zelle.Offset(-1, 0).Range("A1:A2").Interior.ColorIndex = 20 'Hellgrau
               End If
           Next
           Zeile = Zeile + 2
       Loop
    End Sub
  4. Speichere die Datei als xlsm-Format, um Makros zu aktivieren.

  5. Führe das Makro aus:

    • Klicke auf Entwicklertools > Makros, wähle Feiertagemarkieren aus und klicke auf Ausführen.

Häufige Fehler und Lösungen

  • Fehler beim Ausführen des Makros:

    • Stelle sicher, dass alle Arbeitsblätter mit den korrekten Namen vorhanden sind (z.B. A-01, A-02 usw.).
  • Blattschutz:

    • Wenn das Arbeitsblatt geschützt ist, kann das Makro möglicherweise keine Änderungen vornehmen. Deaktiviere den Blattschutz, bevor du das Makro ausführst.
  • Fehler bei der Laufindex-Definition:

    • Wenn du mehr als 12 Blätter hast, musst du den Laufindex im Makro anpassen. Ändere die Schleife von 1 To 12 auf die Anzahl deiner Blätter.

Alternative Methoden

  • Excel-Formeln: Du kannst auch die Formel =WENN(A1=Feiertag; "Feiertag"; "") verwenden, um Feiertage zu markieren, allerdings ist dies weniger flexibel als ein VBA-Makro.

  • Bedingte Formatierung: Über Start > Bedingte Formatierung kannst du Zellen farbig markieren, wenn sie einen bestimmten Wert enthalten, z.B. "Feiertag".


Praktische Beispiele

  • Markieren von Feiertagen: Mit dem oben genannten VBA-Code kannst du Feiertage in einer Excel-Tabelle automatisch eintragen und farbig markieren.

  • Datenblatt: Erstelle ein Datenblatt, in dem du deine Feiertage auflistest. Das Makro wird diese Daten verwenden, um die Feiertage in den Monatsblättern zu markieren.


Tipps für Profis

  • Makros optimieren: Du kannst das Makro weiter optimieren, indem du zusätzliche Schleifen für verschiedene Schichten (Früh- und Spätschicht) einfügst, je nach Bedarf.

  • Dokumentation: Füge Kommentare zu deinem VBA-Code hinzu, damit du und andere Benutzer den Code später leichter verstehen können.


FAQ: Häufige Fragen

1. Wie kann ich Feiertage in Excel automatisch eintragen?
Du kannst das oben angegebene Makro verwenden, um Feiertage automatisch in deinen Excel-Datenblättern einzutragen.

2. Was mache ich, wenn das Makro nicht funktioniert?
Überprüfe, ob alle Arbeitsblätter korrekt benannt sind und ob der Blattschutz möglicherweise aktiviert ist.

3. Wie kann ich die Feiertage farbig markieren?
Das Makro hebt die Zellen mit Feiertagen automatisch in Hellgrau hervor. Du kannst die Farbe im Code anpassen, indem du den ColorIndex änderst.

4. Unterstützt das Makro mehrere Jahre?
Das Makro kann anpassbar gestaltet werden, um Feiertage für verschiedene Jahre zu berechnen, indem du die Daten entsprechend änderst.

5. Wie kann ich die Schriftgröße und -ausrichtung anpassen?
Im VBA-Code kannst du die Eigenschaften Font.Size und VerticalAlignment anpassen, um die gewünschte Darstellung zu erhalten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige