Anzeige
Archiv - Navigation
1516to1520
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

Verschiedene Darstellungen im Urlaubsplaner

Verschiedene Darstellungen im Urlaubsplaner
27.09.2016 07:57:48
Loddar
Moin,
bei der Umsetzung eines Urlaubsplaners stosse ich auf folgendes Problem bei der Umsetzung:
Grundsätzlich ist es ja kein Problem einen Urlaubsplaner zu erstellen. Es stehen in den Zeilen die Namen der Mitarbeiter und in den Spalten entsprechend das Datum. Alles kein Hexenwerk.Dabei kann zwischen Jahres- und Monatsübersicht gewählt werden. Das Problem ist anstatt nur die "klassische" Ansicht zu haben, möchte ich auch eine Wochenansicht erstellen/programmieren in der die Mitarbeiter untereinander aufgeführt sind. Da es auch oft entscheidend ist, wer in welcher Reihenfolge den Urlaub angemeldet hat. Wie könnte man am besten dieses Problem angehen?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Verschiedene Darstellungen im Urlaubsplaner
28.09.2016 11:13:00
AndrRo
Hallo Loddar,
hier hilft nur eine DemoDatei wie du dir deine Ausgabe vorstellst. Wie sieht die Eingabe aus? Wie sieht die Datenstrukur aus?
Ich habe dir mal ein Schaubild meiner Urlaubsliste geschickt. Die Balken werden über bedingte Formatierungen "gezeichnet". Meinst du so etwa? Das ist nur ein Ausschnitt meiner Datei.
https://www.herber.de/bbs/user/108474.xlsx
Ohne DemoDatei ist zu viel Raten im Spiel!
Gruß
AndrRo
AW: Verschiedene Darstellungen im Urlaubsplaner
28.09.2016 18:19:43
Loddar
Hallo AndrRo,
danke für deine Antwort. In der Excel-Datei kann man sehen wie ich es aktuell habe(Musterdatei).
Es ist ähnlich wie in deiner Datei. In der Jahresübersicht werden die Tage eingetragen und können in Monatübersicht können die Monate ausgewertet werden(Click auf Monat zum wechseln), allerdings ist hier nicht ersichtlicht in welcher Reihenfolge die Mitarbeiter die Urlaubstage eingetragen haben. Das ist wichtig zu wissen z. B. bei Freitagen oder Brückentagen wo viele Mitarbeiter gerne Urlaub anmelden und erst kurzfristig entschieden werden kann wieviele wirklich frei bekommen können. In dem Arbeitsblatt Wochenansicht sieht an die KW1 die händisch eingegeben wurde. Dies sollte irgendwie automatisch geschehen.Im Moment stelle ich mir eine Datentabelle vor, wo in jeder Zeile das fortlaufende Datum steht und daneben die Namen und dieses dann per VBA abfragen und auswerten. Wäre für jeden Tipp dankbar wie man sowas angeht.
https://www.herber.de/bbs/user/108493.zip
Anzeige
AW: Verschiedene Darstellungen im Urlaubsplaner
01.10.2016 16:41:46
Michael
Hi,
"fortlaufendes Datum und daneben die Namen" ist unhandlich bei der Programmierung; m.E.s wäre die passende Struktur einfach:
Datum (Eingabe) Datum (Urlaubstag) Name was(Urlaub, krank, halt das, was eingegeben wurde)
Wenn Du diese Tabelle nach a) Urlaubstag und b) Eingabedatum sortierst und einen Filter für a) setzt, siehst Du die Reihenfolge der Eingaben.
Das Makro
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a(0, 1 To 4)
If Target.Row > 11 And Target.Column > 3 Then
If Range("C" & Target.Row)  "" And _
Target  "" And _
Cells(9, Target.Column).Text  "" Then
a(0, 3) = Range("C" & Target.Row)
a(0, 4) = Target
a(0, 2) = Cells(9, Target.Column)
a(0, 1) = Date
With Sheets("Eingabe am")
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 4) = a
End With
End If
End If
End Sub

springt an, wenn in der Jahresübersicht eine Änderung vorgenommen wird.
Die Zeile Target <> "" And _
sorgt dafür, daß nur was passiert, wenn die Zelle nicht leer ist. Du könntest das so ändern, daß tatsächlich nur Urlaubstage übertragen werden.
Aus Deiner Tabelle geht nicht recht hervor, was Urlaub ist; k ist krank, ok, aber was ist "L"?
Jedenfalls kannst Du die Zeile ändern in: Target = "U" And _
wenn U das Kürzel für Urlaub ist; sonst schreibst halt was anderes rein.
Anbei die abgespeckte Tabelle zum Testen. Du kannst das Makro einfach in Deine Tabelle kopieren, mußt aber bitte vor dem ersten Aufruf das Blatt "Eingabe am" händisch anlegen.
Datei: https://www.herber.de/bbs/user/108541.xlsm
Schöne Grüße,
Michael
Anzeige
AW: Verschiedene Darstellungen im Urlaubsplaner
02.10.2016 10:56:53
Loddar
Hallo Michael,
vielen Dank für deine Mühe. Genau das habe ich gemeint mit "Wie geht man sowas an".
Dein Code zeigt mir wirklich ganz neue Möglichkeiten.
Die Lösung mit dem Ereignis "Selection_Change" ist eine super Idee und zeigt mir nochmal auf, warum ich mich überhaupt seit ein paar Wochen mit VBA beschäftige.
Auch ein Array zu nutzen und sich dieses so zusammen zu "stricken", dass es direkt für die Dateneingabe in der Tabelle genutzt werden kann ist ein super Tipp.
Leider habe ich nicht ganz verstanden was genau dieser Code bewirkt/funktioniert:
.Offset(1).Resize(1, 4) = a
Würdest du mir das nochmal erläutern?
Auf deine Frage nach den Kürzeln. Hier gibt einige die genutzt werden. U für Urlaub/ K für krank / L für Lehrgang. Darüber hinaus gibt es verschiedene Überstunden-Konnten usw.
Der nächste Schritt wäre jetzt wohl die Zeile Target "" so abzufragen ob etwas gelöscht wurde. Denn wenn ich wieder etwas lösche im Jahresplaner bleibt es ja im "Eingabe_am"-Blatt bestehen. Das soll natürlich nicht.
Ganz davon ab die Daten vom Jahrenplaner in die Wochenübersicht einzutragen bin ich auch noch nicht.
Da es sehr für mich zur Übersichtlichkeit beiträgt.
Bin jetzt erstmal total motiviert weiter zu tüfteln
Bisschen Zeit habe ich ja auch noch bis 2017 um mit dem neuen Planer zu starten ;-)
Gruß
Lothar
Anzeige
AW: Verschiedene Darstellungen im Urlaubsplaner
02.10.2016 18:48:36
Michael
Hi Loddar,
bist Du aa Frangge? Man kommt ja nicht umhin, an den Maddäus zu denken...
Zum Wochenplaner: ich habe den nur rausgeworfen, um die Datei beim Upload nicht komprimieren zu müssen (sonst habe ich immer Dateileichen rumfliegen).
Ja, das mit dem Löschen hast Du klar erkannt: ich hatte gehofft, Du merkst es erst Mal nicht, hehe.
1. Array und Resize
Also, 1 nach dem anderen: beim Kopieren eines Bereichs, z.B. range("A1:A5").copy range ("B1"), genügt die Angabe der linken, oberen Zelle des Zielbereichs. Nicht so bei Arrays: damit ein Array ohne weiteren Code in einen Zellbereich geschrieben werden kann, muß der a) genauso groß sein wie das Array, und b) muß das Array 2-dimensional sein.
.resize(1,4) erweitert also den angegebenen Zell-"Bereich" (in dem Fall eine einzelne Zelle) auf 1 Zeile (man hätte auch schreiben können .resize(,4), weil die Anzahl der Zeilen nicht verändert wird) und 4 Spalten.
Teste einfach mal zur Veranschaulichung: range("A1").resize(3,5).interior.color=vbyellow
Der komplette Codeblock
With Sheets("Eingabe am")
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 4) = a
End With

Bedeutet: schnapp das Blatt "Eingabe am", und zwar die (".", also dortige) Spalte A und davon die (".", also dortige) letzte Zeile (Zeilennummer) des Tabellenblatts; von dort aus springe nach oben (also zur untersten, beschriebenen Zeile) und gehe eine Zeile nach unten (also in die erste, unbeschriebene). Dann vergrößere diesen Bereich (die erste, leere Zelle in Spalte A) auf vier Spalten und schreibe das Array rein.
Spiel halt einfach mal mit ein paar Kombinationen von Offset und resize herum und färbe die jeweiligen Bereiche mit verschiedenen Farben. Vor ein paar Jahren mußte ich mir das auch immer wieder mühsam vergegenwärtigen, aber mit etwas Übung wird's schon.
2. Finden bei Löschen/Überschreiben
Das Suchen nach Datum UND Name ist etwas aufwendig, läßt sich aber dadurch vermeiden, daß man die Zelladresse auch mit abspeichert: dann muß man nur DIE suchen.
Das geht erst Mal so:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a(0, 1 To 5)
Dim c As Range
If Target.Row > 11 And Target.Column > 3 Then
If Range("C" & Target.Row)  "" And _
Target  "" And _
Cells(9, Target.Column).Text  "" Then
a(0, 3) = Range("C" & Target.Row)
a(0, 4) = Target
a(0, 5) = Target.Address(0, 0)
a(0, 2) = Cells(9, Target.Column)
a(0, 1) = Date
With Sheets("Eingabe am")
Set c = .Range("E:E").Find(a(0, 5), .Range("E1"), _
LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
c.Offset(, -4).Resize(1, 5) = a
'gef. Zelle in E vier nach links ist A
Else
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 5) = a
End If
End With
End If
End If
End Sub
Allerdings wird hier erst mal nicht gelöscht, weil das Makro gar nicht anspringt, wenn die bearbeitete Zelle leer ist (Target ungleich ""): hier nochmal die Überlegung, ob Du "k" und "L" auch mit drin haben willst oder nicht (wahrscheinlich ja, oder? Denn wenn einer krank ist, soll ein anderer ja auch keinen Urlaub nehmen - wenn es eng ist).
Überleg es Dir halt mal...
Schöne Grüße,
Michael
Anzeige
AW: Verschiedene Darstellungen im Urlaubsplaner
03.10.2016 10:53:59
Loddar
Moin Michael,
Hi Loddar,
bist Du aa Frangge? Man kommt ja nicht umhin, an den Maddäus zu denken...
... nein mehr so aus dem Norden (Ostfriesland). Irgendwie hat sich das durch meinen Namensvetter in den letzten Jahren so eingebürgert, dass aus Lothar schnell mal Loddar wird. Ich dachte ich komm einfach mal den anderen zuvor ;-)
Ich habe jetzt Mal ein wenig mit dem Code "herumgespielt", insbesondere mit den Befehlen Resize / Offset usw. Hatte ich so noch nicht in meinen VBA-Wortschatz. Es lässt sich aber viel und einfach damit anstellen. Du hat es wirklich super erklärt, es könnte eigentlich so in ein Fachbuch übernommen werden. Danke nochmal, das du dir soviel Mühe gibts mit einem VBA-Dummie.
Es wird auf jedenfall mehrere Kürzel geben, also mindestens fünf für Urlaub/Krankheit/Lehrgang/Überstunden-Konto/Langzeit-Konto. "Urlaubsplaner" ist vielleicht sowieso das falsche Wort, die Datei müsste wohl eher Personal(-kapazitäts)-Planer heißen :-). Der Urlaub z.B. soll natürlich auch noch vom "Konto" abgezogen werden bzw. eine Überprüfung stattfinden ob überhaupt noch Urlaubstage vorhanden sind.
Sich eine "Hilfsspalte" anzulegen mit dem Zellbezug der "Quelldaten" ist eine clevere Idee und der die Abwesenheitskürzel werden ja nun nach deiner "If-Else Abfrage" geändert oder neu hinzugefügt.
Aus meiner Sicht müsste der nächste Schritt sein die Zeilen von Spalte "was?" ("Eingabe am" Tabellen-Blatt) auf "ist leer" abzufragen und entsprechend dann die Zeile löschen.
Es gibt noch einen Schönheitsfehler der zum Programmabbruch führt. Man kann auf den Jahresplaner immer nur einen Tag eintragen. Also Montag Urlaub eintragen und bis auf Freitag "ziehen" funktioniert ja so noch nicht.
Ich werde die Datei jetzt erstmal überarbeiten und nochmal neu einstellen.
Danke und Gruß
Lothar
Anzeige
dann schau mal
03.10.2016 15:45:04
Michael
Moin Loddar,
das mit mehreren habe ich eingebaut.
Das "Aufziehen" sind ja zwei Schritte:
1. Eingabe des Wertes in EINE Zelle
2. "Aufziehen" dieser Zelle auf einen Bereich
Analog arbeitet das Makro, wobei im 2. Schritt der 1. überschrieben wird: ist doppelt gemoppelt, aber nicht zeitkritisch.
Makro:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim a(0, 1 To 5)
Dim c As Range, t As Range
If Target.Rows.Count > 1 Then MsgBox "mehrzeilig is nicht": Exit Sub
If Target(1).Row > 11 And Target(1).Column > 3 Then
For Each t In Target
If Range("C" & t.Row)  "" Then
a(0, 3) = Range("C" & t.Row)
a(0, 4) = t.Value
a(0, 5) = t.Address(0, 0)
a(0, 2) = Cells(9, t.Column)
a(0, 1) = Date
With Sheets("Eingabe am")
Set c = .Range("E:E").Find(a(0, 5), .Range("E1"), _
LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
If Trim(a(0, 4))  "" Then
c.Offset(, -4).Resize(1, 5) = a
'gef. Zelle in E vier nach links ist A
Else
c.EntireRow.Delete
End If
Else
If Trim(a(0, 4))  "" Then _
.Range("A" & .Rows.Count).End(xlUp).Offset(1).Resize(1, 5) = a
End If
End With
End If
Next
End If
End Sub
Mit der Kapazitätsplanung sind wir uns ja dann so weit einig: im Prinzip mußt Du nur "irgendwo" hinterlegen, wer wie viele Urlaubstage hat, dann kann man das automatisieren - aber im Moment geht es ja schon "halbautomatisch" je nach Filter: Du brauchst nur nach "was?" sortieren und etwa Teilergebnisse auswerfen lassen. Das sind nur ein paar Handgriffe, aber ich schau mir's an, wenn Du die neue Datei hochgeladen hast.
Schöne Grüße,
Michael
Anzeige
AW: dann schau mal
04.10.2016 14:58:09
Loddar
Hallo,
ja stelle die überarbeitete Version dann hier rein. Die letzten Tage haben wirklich einen Schritt nach vorne gebracht, auch wenn der Tag noch fern ist wo ich solch einen Code so aus dem Ärmel schüttel.
Gruß
Lothar

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige