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 | A | B | C | D | E | F | 1 | Datum | Schlüssel | 1 | 2 | 3 | 4 | 2 | 01.01.2006 | 22 | N | S | F | - | 3 | 02.01.2006 | 23 | - | N | S | F | 4 | 03.01.2006 | 24 | - | N | S | F | 5 | 04.01.2006 | 25 | F | - | N | S | 6 | 05.01.2006 | 26 | F | - | N | S | 7 | 06.01.2006 | 27 | S | F | - | N | 8 | 07.01.2006 | 0 | S | F | - | N | 9 | 08.01.2006 | 1 | S | F | - | N | 10 | 09.01.2006 | 2 | N | S | F | - | 11 | 10.01.2006 | 3 | N | S | F | - | 12 | 11.01.2006 | 4 | - | N | S | F | 13 | 12.01.2006 | 5 | - | N | S | F | 14 | 13.01.2006 | 6 | F | - | N | S | 15 | 14.01.2006 | 7 | F | - | N | S | 16 | 15.01.2006 | 8 | F | - | N | S | 17 | 16.01.2006 | 9 | S | F | - | N | 18 | 17.01.2006 | 10 | S | F | - | N | 19 | 18.01.2006 | 11 | N | S | F | - | 20 | 19.01.2006 | 12 | N | S | F | - | 21 | 20.01.2006 | 13 | - | N | S | F | 22 | 21.01.2006 | 14 | - | N | S | F | 23 | 22.01.2006 | 15 | - | N | S | F | 24 | 23.01.2006 | 16 | F | - | N | S | 25 | 24.01.2006 | 17 | F | - | N | S | 26 | 25.01.2006 | 18 | S | F | - | N | 27 | 26.01.2006 | 19 | S | F | - | N | 28 | 27.01.2006 | 20 | N | S | F | - | 29 | 28.01.2006 | 21 | N | S | F | - | 30 | Ab hier wiederholt sich die Schichtfolge | |
|
Formeln der Tabelle | Zelle | Formel | 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