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 Saplte 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:
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 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
Quelltexte eingefügt mit VBA in HTML 2.0.0.1