Startseite

Schichtfolge berechnen

Anzeige mit VLookup (SVerweis)

Da die Berechnung der Schichtfolge, wie ich sie auf der Seite Schichtfolge dargestellt habe, nicht so leicht zu verstehen ist, habe ich noch eine zweite Methode entwickelt. Das Grundprinzip ist zwar das gleiche, aber die Darstellung mehrerer Schichten ist so einfacher geworden, weil die Berechnung der Ausgeleichwerte weggefallen ist. Kernstück dieser Methode ist ebfalls die Berechnung eines Schlüsselwertes aus dem Datum. Wie die Formel Rest funktioniert, habe ich auf der Seite Formellösung detailiert beschrieben.
Schichtfolge

 ABCDEF
1DatumSchlüssel1234
201.01.200622NSF-
302.01.200623-NSF
403.01.200624-NSF
504.01.200625F-NS
605.01.200626F-NS
706.01.200627SF-N
807.01.20060SF-N
908.01.20061SF-N
1009.01.20062NSF-
1110.01.20063NSF-
1211.01.20064-NSF
1312.01.20065-NSF
1413.01.20066F-NS
1514.01.20067F-NS
1615.01.20068F-NS
1716.01.20069SF-N
1817.01.200610SF-N
1918.01.200611NSF-
2019.01.200612NSF-
2120.01.200613-NSF
2221.01.200614-NSF
2322.01.200615-NSF
2423.01.200616F-NS
2524.01.200617F-NS
2625.01.200618SF-N
2726.01.200619SF-N
2827.01.200620NSF-
2928.01.200621NSF-
30Ab hier wiederholt sich die Schichtfolge

   
Formeln der Tabelle
ZelleFormel
B2=REST(A2;28)
B3=REST(A3;28)
B4=REST(A4;28)
B5=REST(A5;28)
B6=REST(A6;28)
B7=REST(A7;28)
B8=REST(A8;28)
B9=REST(A9;28)
B10=REST(A10;28)
B11=REST(A11;28)
B12=REST(A12;28)
B13=REST(A13;28)
B14=REST(A14;28)
B15=REST(A15;28)
B16=REST(A16;28)
B17=REST(A17;28)
B18=REST(A18;28)
B19=REST(A19;28)
B20=REST(A20;28)
B21=REST(A21;28)
B22=REST(A22;28)
B23=REST(A23;28)
B24=REST(A24;28)
B25=REST(A25;28)
B26=REST(A26;28)
B27=REST(A27;28)
B28=REST(A28;28)
B29=REST(A29;28)
In den Spalten C bis F sind die Schichten der Schichten 1 (A) bis 4 (D) so eingetragen, wie sie auf bestimmte Tage gefallen sind. Das zugrunde gelegte Datum ist dabei beliebig auswählbar, es muß nur die eingetragene Schicht dazu passen. Im vorliegenden Beispiel haben wir eine Schichtfolge, die sich alle 28 Tage wiederholt. Deshalb wird in der Spalte B aus dem Datum in der Spalte A der Schlüsselwert mit der Funktion Rest berechnet. Da sich hinter dem Datum eine serielle Zahl verbirgt bekommen wir für jeden Tag ein anderes Ergebnis. Wegen der Division durch 28 sind das die Zahlen von 0 bis 27.
Diese Berechnungen sind die Basis für die Funktion VLookup (SVerweis). Damit wird passend zu jedem Datum der Suchbegriff ermittelt. Zuständig dafür ist dieser Teil des Makro:
            we = Sheets("Kalender").Cells(s + iSta, sp - 1) Mod intZieWe        ' Feldwert für Variable berechnen 
Die Variable intZieWe wird automatisch mit einem Wert versehen. Damit wird die Bedienung des Programms für die Anwender erleitert, weil im Quelltext keine Änderungen mehr vorgenommen werden müssen. Der folgende Teil des Makro weist jedem Tag über ein Array das passende Schichtkürzel zu:
            arr(s, 0) = Application.WorksheetFunction.VLookup(we, Sheets _
            ("Schichtfolge").Range("B2:H" & Sheets("Schichtfolge").Range("B1") _
            .End(xlDown).Row), Schi, False)                                     ' Neue Inhalte in Array einlesen 
Über das Array erfolgen dann die Einträge im Kalender Monatsweise. Das spart einiges an Zeit.
        Range(Sheets("Kalender").Cells(iSta, sp), Sheets("Kalender") _
        .Cells(ziel, sp)) = arr                                                 ' Array in Tabelle schreiben 
Abschließend das vollständige Makro, ich hoffe, damit die Bedienfreundlichkeit des Programms verbessert zu haben. Der Anwender muß nur noch die Einträge auf der Seite Schichtfolge vornehmen, so wie es oben zu sehen ist. Wobei die Länge der Schichtfolge und die Lage der einzelnen Schichten beliebig verändert werden können. Wenn mehr als vier Schichten benötigt werden, kann das realisiert werden, Anfragen dazu beantworte ich gerne.
Sub schichten()
' trägt vorgegebene Schichtkürzel in einen Kalender ein
' geschrieben von Klaus-Dieter Oppermann
' am 16.03.2004
' Änderung 28.11.2004           ' Korrektur für Schaltjahr zugefügt
' Änderung 28.10.2006           ' geänderte Ausgabe der Halbjahre
' Änderung 24.01.2010           ' Berechnung der Schichtkürzel geändert (VLookup)
' Variablen deklarieren
Dim s As Integer                ' Schleifenzähler für Tabellenzeilen
Dim we As Integer               ' Zuweisungsschlüssel
Dim sp As Integer               ' Schleifenzähler für Spalten
Dim arr(50, 0)                  ' Array zum Eintragen der Kürzel
Dim ziel As Integer             ' letzte Zelle für Array
Dim iHalbj                      ' Halbjahr
Dim iZei As Integer             ' Zeilenbezug Zielzeile
Dim iSta As Integer             ' Zeilenbezug Startzeile
Dim Schi As Integer             ' Arrayfeld für Schichtkorrektur
Dim intZieWe As Integer         ' Länge der Schichtfolge
intZieWe = Application.WorksheetFunction.Max(Sheets("Schichtfolge").Range _
("B2:B" & Sheets("Schichtfolge").Range("B1").End(xlDown).Row)) + 1              ' Länge der Schichtfolge ermitteln
iZei = 37                                                                       ' Zielzeile definieren
iSta = 6                                                                        ' Startzeile definieren
' Suchspalten für VLookup (SVerweis) festlegen
Select Case Schichtkalender.ComboBox2.ListIndex                                           ' Gewählte Schicht ermitteln
    Case 0                                                                      ' Wenn Schicht A, dann ...
        Schi = 2                                                                ' ... Spaltenindex 2
    Case 1                                                                      ' wenn Schicht B, dann ...
        Schi = 3                                                                ' ... Spaltenindex 3
    Case 2                                                                      ' wenn Schicht C, dann ...
        Schi = 4                                                                ' ... Spaltenindex 4
    Case 3                                                                      ' wenn Schicht D, dann ...
        Schi = 5                                                                ' ... Spaltenindex 5
End Select                                                                      ' Ende der Festlegung
' Kürzel in Kalender schreiben
For iHalbj = 1 To 2                                                             ' Halbjahr definieren
    If iHalbj = 2 Then                                                          ' wenn 2. Halbjahr, dann ...
        iZei = 71                                                               ' ... Zielzeile ändern
        iSta = 41  '40                                                          ' ... Startzeile ändern
    End If                                                                      ' Ende
    For sp = 2 To 17 Step 3                                                     ' Schleife für Spaltenzuweisung
        ziel = Sheets("Kalender").Cells(iSta, sp - 1).End(xlDown).Row           ' Zielwert für Schleife
        For s = 0 To ziel - iSta                                                ' Schleife für Einträge in Zeilen
            we = Sheets("Kalender").Cells(s + iSta, sp - 1) Mod intZieWe        ' Feldwert für Variable berechnen
            arr(s, 0) = Application.WorksheetFunction.VLookup(we, Sheets _
            ("Schichtfolge").Range("B2:H" & Sheets("Schichtfolge").Range("B1") _
            .End(xlDown).Row), Schi, False)                                     ' Neue Inhalte in Array einlesen
        Next s                                                                  ' Schleifenzähler (Zeile) plus 1
        Range(Sheets("Kalender").Cells(iSta, sp), Sheets("Kalender") _
        .Cells(ziel, sp)) = arr                                                 ' Array in Tabelle schreiben
        Erase arr                                                               ' Array löschen
    Next sp                                                                     ' Schleifenzähler (Spalte) plus 1
    If Cells(1, 4) Mod 4 <> 0 Then Sheets("Kalender").Cells(34, 5) = ""         ' Korrektur für Schaltjahr
Next iHalbj
End Sub
iZei = 37 ' Zielzeile definieren iSta = 6 ' Startzeile definieren ' Suchspalten für VLookup (SVerweis) festlegen Select Case Sheets("Kalender").Cells(3, 1) ' Gewählte Schicht ermitteln Case "Schicht 1" ' Wenn Schicht A, dann ... Schi = 2 ' ... Spaltenindex 2 Case "Schicht 2" ' wenn Schicht B, dann ... Schi = 3 ' ... Spaltenindex 3 Case "Schicht 3" ' wenn Schicht C, dann ... Schi = 4 ' ... Spaltenindex 4 Case "Schicht 4" ' wenn Schicht D, dann ... Schi = 5 ' ... Spaltenindex 5 End Select ' Ende der Festlegung ' Kürzel in Kalender schreiben For iHalbj = 1 To 2 ' Halbjahr definieren If iHalbj = 2 Then ' wenn 2. Halbjahr, dann ... iZei = 71 ' ... Zielzeile ändern iSta = 41 '40 ' ... Startzeile ändern End If ' Ende For sp = 2 To 17 Step 3 ' Schleife für Spaltenzuweisung ziel = Sheets("Kalender").Cells(iSta, sp - 1).End(xlDown).Row ' Zielwert für Schleife For s = 0 To ziel - iSta ' Schleife für Einträge in Zeilen we = Sheets("Kalender").Cells(s + iSta, sp - 1) Mod intZieWe ' Feldwert für Variable berechnen arr(s, 0) = Application.WorksheetFunction.VLookup(we, Sheets _ ("Schichtfolge").Range("B2:H" & Sheets("Schichtfolge").Range("B1") _ .End(xlDown).Row), Schi, False) ' Neue Inhalte in Array einlesen Next s ' Schleifenzähler (Zeile) plus 1 Range(Sheets("Kalender").Cells(iSta, sp), Sheets("Kalender") _ .Cells(ziel, sp)) = arr ' Array in Tabelle schreiben Erase arr ' Array löschen Next sp ' Schleifenzähler (Spalte) plus 1 If Cells(1, 4) Mod 4 <> 0 Then Sheets("Kalender").Cells(34, 5) = "" ' Korrektur für Schaltjahr Next iHalbj End Sub
Natürlich stelle ich auch diese Programm als fertige Datei zu Verfügung: Programm herunter laden
Bisher mal herunter geladen.