Schichtplanung Tagesbasis
#21
(29.09.2019, 11:25)Klaus-Dieter schrieb: Hallo,

auf dem Blatt Schichtplanung werden die Urlaubstage doch ohnehin markiert, wenn ich das richtig verstanden habe. Dann hast du doch alles was du brauchst.


Ja, ich finde jedoch es wird unübersichtlich wenn alles nur über das eine Tabellenblatt dargestellt wird. Dann habe ich dort Urlaub, Krankheit, Gleitzeit, Tage durch Teilzeit an denen die MA nicht da sind, Schule und Prüfungen der Azubis und dann noch die verschiedenen Schichten der Schichtplanung. Das finden auch meine Kolleginnen und Kollegen blöd, die ebenfalls mit dem Plan arbeiten sollen / müssen. Daher das zweite Tabellenblatt. Auch wenn es das natürlich nicht gerade einfacher macht...

(29.09.2019, 12:02)Rabe schrieb: Hi,

ich würde das B1 noch mit $ fixieren:
=WENN('Urlaub 2020'!F10="";SVERWEIS($C17;$C$8:$NG$15;SPALTE(B$1);FALSCH);"X")

Hallo Rabe,

ach so - das dient dazu das B beibehalten bleibt wenn ich den Code nach unten kopiere, aber die Zahl sich verändert, wenn das kopieren zur Seite stattfindet?! Ja, das macht dann definitiv Sinn Smile
Top
#22
Hallo,

Zitat:ach so - das dient dazu das B beibehalten bleibt wenn ich den Code nach unten kopiere, aber die Zahl sich verändert, wenn das kopieren zur Seite stattfindet?! Ja, das macht dann definitiv Sinn

nein das hast du falsch verstanden. Mit dem Dollarzeichen ($) wird die Zeilennummer (1) festgeschrieben. Die Funktion SPALTE(B1) liefert lediglich einen numerischen Wert, für den jeweiligen Spaltenbuchstaben. B=2, C=3 usw.. Die 1 steht da nur, weil es sonst einen Fehler geben würde. Welche Zahl da steht, ist völlig wumpe.

Tabelle1

ABCDEF
2234567
3234567
4#NAME?
Formeln der Tabelle
ZelleFormel
A2=SPALTE(B1)
B2=SPALTE(C1)
C2=SPALTE(D1)
D2=SPALTE(E1)
E2=SPALTE(F1)
F2=SPALTE(G1)
A3=SPALTE(B7)
B3=SPALTE(C7)
C3=SPALTE(D7)
D3=SPALTE(E7)
E3=SPALTE(F7)
F3=SPALTE(G7)
A4=SPALTE(B)

Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Top
#23
(29.09.2019, 15:11)Gast 123 schrieb: Hallo

ich freue mich einen Erstentwurf für eine VBA Lösung hochladen zu können, im Augenblick noch mit Fehlern. Weil die Datei erst naechstes Jahr zum Einsatz kommen soll spielt das keine Rolle. Für interessierte Kollegen auch als xlsx Datei, da fehlt natürlich die schöne UserForm für neue Mitarbeiter. Die Makros sind in einer Tabelle aufgelistet.  

Neu für Christian ist eine Spalte in "Daten" für den Wochentag, und das klappt zur Zeit noch nicht 100%.  Ein Problem beim automatischn ausfüllen sehe ich darin:  an welchem Wochentag wird gearbeitet, wenn ein MTA nur 1-3 Tage arbeiten will? Das kann ja nicht immer Montag sein. Also richtete ich dafür eine neue Spalte ein.

Das normale Ausfüllen einer ganzen Woche oder 4 tage klappt schon recht gut, nur bei Einzeltage ist noch eine "Macke" im Makro. 
Zum testen wie gut die Lösung geworden ist reicht es aber durchaus aus. Fehler finden man immer noch. 

Bitte in der Testphase nicht im Original testen, denn ich lösche alle Formeln im Blatt!  Nun bin ich gespannt auf die Rückmeldung ....  

mfg Gast 123

Hallo Gast 123,

vielen Dank für deine Mühen und deinen Erstentwurf.

Deine Idee mit den Wochentagen ist gut. Heißt das, dass das Makro versucht die dort hinterlegten Wochentage aufzugreifen und ausschließlich an genau diesen Tagen, quasi so eine Art Sverweis oder Wenn Funktion zu sagen das er nur an diesen betimmten Tagen was eintragen soll?!

Zu den Teilzeitkräften:
Die Tage an denen eben nicht gearbeitet werden soll sind im Urlaubsplan durch ein TZ gekennzeichnet. An Tagen wo der MA anwesend ist, ist das Feld im Plan leer, wodurch in meiner Wenn/Sverweis Kombination die Zeit des Schichtmodells eingetragen wurde.

Aufgefallen sind mir die folgenden Punkte:
Der Übertrag von allen Eintragungen laufen super. Ich sehe jetzt nicht, dass auch nur einer der bisher getätigten Eintragungen fehlt.
Die Mitarbeiter werden z.T. gar nicht bzw. nur fehlerhaft aufgefüllt.
Die vollständigen Eintragungen finden nur bei Mitarbeiter 1 und 2 statt.
3,4 und 5 finden irgendwie nicht so wirklich statt.
6,7,8 nur an dem erstgenannten Tag der Woche aus Tabellenblatt 'Daten' Spalte 'WoTag'


Macht es hier mehr Sinn mit 5 Feldern zu arbeiten? Bzw. ist das überhaupt möglich abzubilden? Wenn der MA am Montag, Dienstag und Freitag z.B. arbeitet, dann bleiben die Felder 3 und 4 einfach leer und 1, 2 und 5 sind befüllt mit den Wochentagen?! Klingt zumindest plausibel, sofern man die Abfragen entsprechend einrichten kann.

EDIT:

Im Urlaubsplan habe ich doch die Teilzeit durch TZ markiert, so kann das Tool definitiv an allen frei verfügbaren Tagen einen Eintrag machen, da an allen anderen Tagen die TZ steht...

   

Mein Problem ist, dass ich nicht weiß wann bzw. wo und wie ich einen Code hinzufügen muss bzw. überhaupt kann. Die Codes der Userform habe ich durch ein kürzlich angesehenes Tutorial in die passende Reihenfolge eingefügt - Schritt für Schritt. Wenn du mir jetzt sagst, das Beispiel mit dem Datum und cdate, dann weiß ich gar nicht an welcher Stelle ich hier anfangen und das einsetzen muss. Das lerne ich aber sicher noch in den nächsten Wochen.

Fakt ist jedenfalls, dass es riesen Spaß macht wenn man fürs Erste die Ergebnisse sieht. Hätte noch vor ein paar Tagen nicht gedacht, dass ich das mit der Userform z.B. so hinbekomme bzw. das es sowas überhaupt für Excel gibt :19:



Danke und Gruß
Christian

(29.09.2019, 15:50)Klaus-Dieter schrieb: Hallo,


nein das hast du falsch verstanden. Mit dem Dollarzeichen ($) wird die Zeilennummer (1) festgeschrieben. Die Funktion SPALTE(B1) liefert lediglich einen numerischen Wert, für den jeweiligen Spaltenbuchstaben. B=2, C=3 usw.. Die 1 steht da nur, weil es sonst einen Fehler geben würde. Welche Zahl da steht, ist völlig wumpe.

Tabelle1

ABCDEF
2234567
3234567
4#NAME?
Formeln der Tabelle
ZelleFormel
A2=SPALTE(B1)
B2=SPALTE(C1)
C2=SPALTE(D1)
D2=SPALTE(E1)
E2=SPALTE(F1)
F2=SPALTE(G1)
A3=SPALTE(B7)
B3=SPALTE(C7)
C3=SPALTE(D7)
D3=SPALTE(E7)
E3=SPALTE(F7)
F3=SPALTE(G7)
A4=SPALTE(B)

Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4.8

Stimmt natürlich, habe das falsch dargestellt. Die Zahl der Zeile ändert sich hierbei nicht, sondern nur die Spalte... :16:  Gemeint hatte ich das aber auch so wie du geschrieben hast :19: :19: :19:
War ja der Grund weshalb ich Spalte(B1) genommen habe anstelle der eigentlich üblichen Spalte in der Matrix...
Top
#24
Hallo Christian

dank für die Rückmeldung, und Sorry für den Fehler mit TZ = Abwesend! Habe ich im Makro vergessen auszuwerten.
Die Idee mit den Tagen ist, die Anwesenheit dann in dieser Woche genau für diesen Tag/e einzutragen.  
Die Fehler warum einige Mitarbeiter nicht vollstaendig ausgefüllt sind muss ich mir in Ruhe ansehen.  Anfangs weh wehchen!

mfg Gast 123

PS  hier noch mal der mit CDate korrigierte Code für die UserForm. Mir fiel auf das du bei "Vertrag bis:" die Vertragsdauer in Monaten eingetragen hast. Das habe ich korrigiert. Ich weiss nicht ob man auf die ComboBox ganz verzichten kann, wenn wir das Datum erfassen? Für die Einzeltage wie "Mo, Mi, Fr" zu erfassen brauchst du noch ein Textfeld.

Code:
Private Sub Button_Eingabe_Click()

'Erste freie Zeile ausfindig machen
Dim last As Integer, msg As String
last = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row + 1

'Vorprüfung Pflichtfelder:
If TextBox_Name.Text = "Name, Vorname" Then msg = msg & " / TextBox_Name"
If ComboBox_Bereich.Text = "Bitte auswählen" Then msg = msg & " / ComboBox_Bereich"
If ComboBox_Schichtmodell.Text = "Bitte auswählen" Then msg = msg & " / ComboBox_Schichtmodel"
If TextBox_Eintrittsdatum.Text = "TT.MM.JJJJ" Then msg = msg & " / TextBox_Eintrittsdatum"

If ComboBox_Vertragsart.Text = "Bitte auswählen" Then msg = msg & " / ComboBox_Vertragsart"
If ComboBox_Vertragsdauer.Text = "Bitte auswählen" Then msg = msg & " / ComboBox_Vertragsdauer"
If ComboBox_Tage.Text = "Bitte auswählen" Then msg = msg & " / ComboBox_Tage"
If ComboBox_MonateAnwesend.Text = "Bitte auswählen" Then msg = msg & " / ComboBox_MonateAnwesend"

If msg <> "" Then MsgBox "Es fehlen die Eingaben in:  " & Chr(10) & Mid(msg, 4, 500): Exit Sub

'Name:
Cells(last, 1).Value = TextBox_Name

'Bereich:
Cells(last, 2).Value = ComboBox_Bereich

'alternativer Bereich:
Cells(last, 3).Value = ComboBox_BereichAlt

'Schichtmodell:
Cells(last, 4).Value = ComboBox_Schichtmodell

'Kommentar:
Cells(last, 5).Value = TextBox_Kommentar

'Eintrittsdatum:
Cells(last, 6).Value = CDate(TextBox_Eintrittsdatum)

'Vertragsart:
Cells(last, 7).Value = ComboBox_Vertragsart

'Vertrag bis:          'ComboBox_Vertragsdauer
Cells(last, 8).Value = CDate(TextBox_VertragBis)

'ErsetztMitarbeiter:
Cells(last, 9).Value = TextBox_ErsetztMitarbeiter

'Tage:
Cells(last, 10).Value = ComboBox_Tage

'MonateAnwesend:
Cells(last, 11).Value = ComboBox_MonateAnwesend

'Urlaubsanspruch:
Cells(last, 12).Value = TextBox_Urlaubsanspruch
End Sub
Top
#25
Wenn ich Daten in mehrere Arbeitsblätter packen möchte und zwar immer in die nächstfreie Zeile ebendieser Tabellenblätter nutze ich bisher zur Füllung des aktiven Blattes den folgenden Code:


Code:
Dim last As Integer

last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1

Was ich jedoch gerne ändern würde zu:
Code:
Dim last As Integer

last = Worksheets("Daten", "Schichtplanung", "Urlaub 2020").Cells(Rows.Count, 1).End(xlUp).Row + 1

bekomme ich einen Fehler:

---------------------------
Microsoft Visual Basic for Applications
---------------------------
Fehler beim Kompilieren:

Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft


Wie muss der Code richtig lauten?

Überhaupt nicht schlimm, freue mich über jede Hilfestellung, da ist es auch nicht schlimm wenn was vergessen wird ;)

Es wird doch eh die ganze Zeile von Mo-Fr gefüllt, sofern im Blatt "Urlaub 2020" an vereinzelten Tagen ebendiese frei sind.
Wenn der MA also Mo+Di Urlaub hat, wird jeweils ein U eingetragen, sowie Mi, Do und Fr seine Schicht. Oder nicht? Dann müsste das doch eigentlich gedeckt sein.
Top
#26
Hallo Christian

ich freue mich das du dich für VBA interessierst. Das Prinzip ist schon richtig, aber die genauen Details stimmen nicht!

Wenn du in drei Tabellen die LastZelle suchst, kann das nicht in EINE Variable gepackt werden, denn jede LastZelle ist anders!  Du brauchst also drei Variablen, wie in meinem Beispiel, und dreimal den Suchlauf mit End xlUp!  Für die Tabelle "Schichtplanung" benutze ich immer die With Klammer. Für die anderen ist die Set Anweisung vorteihafter. Sie erleichtert das Programmieren durch kurze Objekt Namen!

mfg Gast 123

Code:
Sub Test()
Dim AC As Range, lastSpl As Long
Dim Dat As Worksheet, lzDat As Long
Dim Ulb As Worksheet, lzUlb As Long

'so voll ausgeschrieben über Worksheets Name
lastDat = Worksheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row + 1
lastUlb = Worksheets("Urlaub 2020").Cells(Rows.Count, 1).End(xlUp).Row + 1
lastSpl = Worksheets("Schichtplanung").Cells(Rows.Count, 1).End(xlUp).Row + 1

'oder so über Set Anweisung für "Daten" + "Urlaub"!
Set Dat = Worksheets("Daten")
Set Ulb = Worksheets("Urlaub 2020")
lastDat = Dat.Cells(Rows.Count, 1).End(xlUp).Row + 1
lastUlb = Ulb.Cells(Rows.Count, 1).End(xlUp).Row + 1

'und so über With Klammer für "Schichtplanung"!
'Vorteil: man muss vor Cells/Range nur einen Punkt machen!!
With Worksheets("Schichtplanung")
  lastSpl = .Cells(Rows.Count, 1).End(xlUp).Row + 1
  'hier der nachfolgende Code
End With
End Sub
Top
#27
Hallo Gast 123,

Danke für die ausführliche Erklärung.

Wenn ich jetzt z.B. lastSpl vorgebe, dann muss ich in den einzlenen Punkten durch wessen Inhalt die Felder im entsprechenden Tabellenblatt geschrieben werden sollen immer mit lastSpl.Cells beginnen, damit Excel bzw. das Script weiß in welches Blatt geschrieben werden soll?
Top
#28
Hallo nochmal,

ich habe nun etwas Zeit gefunden mich weiter in deine Codes einzulesen. Vorallem ist mir dadurch aber auch aufgefallen, dass eigentlich alles in die Schichtplanung einfließt was ich möchte. Ich finde es auch richtig genial das Eintrittsdatum zu berücksichtigen und erst ab dann zu planen.
Was geändert werden könnte ist der Versuch die Anzahl Tage in die Schichtplanung unterzubringen, denn die dienen für mich ausschließlich für die Berechnung des Urlaubsanspruches. Auch die Wochentage könnten wir eigentlich wieder rausnehmen. Ich denke das würde die Programmierung einfacher gestalten, meinst du nicht auch?
Die nicht anwesenden Tage werden wie gesagt im Schichtplaner an den ebendiesen Tagen mit TZ angegeben und somit eh ausgeblendet.

Ich habe das mit deinem Code noch nicht so ganz verstanden, wenn es darum geht die verschiedenen Tabellenblätter gleichzeitig anzusprechen und zu füllen. Da bin ich wahrscheinlich einfach noch zu grün für... Undecided
Top
#29
Hallo Christian,

den ganzen Thread habe ich nicht gelesen. Das war mir einfach zu viel.
Ich will auch dem Gast123 nicht in die Parade fahren, aber hierauf mußte ich einfach reagieren

Zitat:Ich habe das mit deinem Code noch nicht so ganz verstanden, wenn es darum geht die verschiedenen Tabellenblätter gleichzeitig anzusprechen und zu füllen. Da bin ich wahrscheinlich einfach noch zu grün für...

Versuche es gar nicht erst, Du wirst scheitern. Gleichzeitig geht da nichts.
Das macht man in einer oder mehreren Schleifen oder in einer Case Select-Anweisung, oder ..., oder ..., oder ...,
aber immer hübsch der Reihe nach, ein Blatt nach dem anderen. Und damit der User von der Arbeit des Makros
nichts mitbekommt, schaltet man zu Beginn der Geschichte die Bildschirmanzeige ab, das Makro tut seine Arbeit,
dann schaltet man die Bildschirmanzeige wieder ein und kann mit den durch den Code geänderten Werten, ...
was auch immer der Code getan hat, ...  weiterarbeiten.
Top
#30
Hallo Peter

ich kann deinen Einwand gut verstehen, habe auch dreimal nachlesen müssen was Christian damit konkret meint??
Ich nehmen an er hat im Code noch nicht verstanden das ich zum Übertragen von Daten aus einer anderen Tabelle beide mit Set definieren muss, z.B. so:  Ist nicht der Original Code, zeigt aber das Problem das IF eine andere Tabelle auswertet, und dann Daten aus Tabelle "Daten" übertragen werden. Wie das Zusammenspiel funktioniert hat er glaube ich noch nicht verstanden. Da werden ja zwei Tabellen gleichzeitig angesprochen. Wir verstehen das auch.

mfg Gast 123

Code:
With Worksheets("Schichtplanung")
    lzDat = DAT.Cells(Rows.Count, 1).End(xlUp).Row 'Tabelle Daten
    lzUlb = ULB.Cells(Rows.Count, 1).End(xlUp).Row 'Tabelle Urlaub
    lz1 = .Cells(Rows.Count, 2).End(xlUp).Row 'eigenes Blatt

    If ULB.Cells(j, 1) <> Empty Then
      .Cells(AC.Row, 7).Value = DAT.Cells(z, spa).Value
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste