Startseite

Schichtfolge berechnen

Das Berechnen der Schichtfolge funktioniert nach einem bestimmten Schema. Es wird dabei die Schicht mit dem Datum verbunden. Um das zu verstehen, ist es hilfreich die untere Darstellung zu betrachten. Dabei beschränken wir uns zunächst auf die Spalten B und F. Letztere ist die mit der Überschrift Arrayfeld.
 ABCDEFG
1 ABCDArrayfeld 
201.01.2006NS-F22 
302.01.2006-NFS23 
403.01.2006-NFS24 
504.01.2006F-SN25 
605.01.2006F-SN26 
706.01.2006SFN-27 
807.01.2006SFN-0 
908.01.2006SFN-1 
1009.01.2006NS-F2 
1110.01.2006NS-F3 
1211.01.2006-NFS4 
1312.01.2006-NFS5 
1413.01.2006F-SN6 
1514.01.2006F-SN7 
1615.01.2006F-SN8 
1716.01.2006SFN-9 
1817.01.2006SFN-10 
1918.01.2006NS-F11 
2019.01.2006NS-F12 
2120.01.2006-NFS13 
2221.01.2006-NFS14 
2322.01.2006-NFS15 
2423.01.2006F-SN16 
2524.01.2006F-SN17 
2625.01.2006SFN-18 
2726.01.2006SFN-19 
2827.01.2006NS-F20 
2928.01.2006NS-F21 
3029.01.2006NS-F Ab hier wiederholt sich die Schichtfolge
3130.01.2006-NFS  
3231.01.2006-NFS  

Formeln der Tabelle
ZelleFormel
F2=REST(A2;28)
F3=REST(A3;28)
F4=REST(A4;28)
F5=REST(A5;28)
F6=REST(A6;28)
F7=REST(A7;28)
F8=REST(A8;28)
F9=REST(A9;28)
F10=REST(A10;28)
F11=REST(A11;28)
F12=REST(A12;28)
F13=REST(A13;28)
F14=REST(A14;28)
F15=REST(A15;28)
F16=REST(A16;28)
F17=REST(A17;28)
F18=REST(A18;28)
F19=REST(A19;28)
F20=REST(A20;28)
F21=REST(A21;28)
F22=REST(A22;28)
F23=REST(A23;28)
F24=REST(A24;28)
F25=REST(A25;28)
F26=REST(A26;28)
F27=REST(A27;28)
F28=REST(A28;28)
F29=REST(A29;28)


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
In Spalte B sind die Schichten der Schicht 1 (A) 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 F das Datum des jeweiligen Tages durch 28 geteilt, in diesem Fall wird nur das Ganzzahlige Ergebnis der Rechenoperation benötigt. Das liefert uns die verwendete Formel. 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 erforderlich, damit man weiß, in welcher Reihenfolge die Schichtkürzel im Makro eingebunden werden. Wichtig ist dabei die Zeile mit dem Ergebnis Null. Das Schichtkürzel aus dieser Zeile ist das erste, das im Makro eingetragen wird. Die anderen folgen in aufsteigender Reihenfolge. Zum besseren Verständnis sehen wir uns das im Makro an:
sk = Array("S", "S", "N", "N", "-", "-", "F", "F", "F", "S", "S", "N", "N", "-", "-", "-", "F", "F", "S", "S", "N", "N", "N", "-", "-", "F", "F", "S") ' Schichtbezeichnungen
Es sind hier in einem Array, das ist eine spezielle Variable mit vielen Feldern, alle Schichtkürzel in der Reihenfolge von 0 bis 27 eingetragen. die Feldadressen des Array sind fortlaufend nummeriert. Die Nummerierung beginnt ebenfalls mit der Null. Das machen wir uns im weiteren zu Nutze.
Das sind die entscheidenden Zeilen im Makro:
we = Sheets("Kalender").Cells(s + iSta, sp - 1) Mod 28 ' Feldwert für Variable berechnen
In dieser Zeile wird passend zum Datum der Wert berechnet, den wir schon aus der Beschreibung weiter oben kennen. Es handelt sich bei der Formel um die VBA-Umsetzung der Formel(n) =REST(A2;28). Die Variablen innhalb der Cells-Anweisung sorgen dafür, dass immer das richtige Datum berechnet wird. Die anfallenden Ergebnisse sind, wie schon oben, die Werte von 0 bis 27. (Das gilt natürlich nur für dieses Beispiel. Bei einem anderen Divisor kommen auch andere Werte heraus. Bei 36 wären das die Werte 0 bis 35).
Die nächste Programmzeile können wir zunächst außen vor lassen, sie berechnet einen Korrekturwert, der erst interessant wird, wenn es um die anderen Schichten geht. Das werde ich noch genauer darstellen.
iSchiKorr = we - vKoArr(Schi, we + 1) ' Arrayfeld aus Datum und Schicht berechnen
In der dritten Zeile wird das berechnete Schichtkürzel an ein Feld eines weiteren Array übergeben. Ich gebe zu, das ist nicht leicht zu verstehen. Leider auch nicht leicht zu beschreiben. Im Grunde reicht es aber, wenn man nachvollziehen kann, wie mit der Tabellenformel die Reihenfolge der Schichtkürzel berechnet wird. Die werden dann in der richtigen Reihenfolge in die zuerst beschriebene Makrozeile eingetragen. Außerdem muß in der Zeile, die ich als zweite beschrieben habe, statt der 28 der richtige Werte geschrieben werden, wenn die Schichtfolge eine andere Anzahl von Tagen hat.
arr(s, 0) = sk(iSchiKorr) ' Neue Inhalte in Array einlesen
Jetzt muss ich noch eins draufsetzen, es geht um die Beschreibung, wie die anderen Schichten berechnet werden. Ich habe das alles in ein Makro eingebaut. Was zwar vom Programm her elegant ist, (glaube ich wenigstens), aber das Verständnis der Vorgänge nicht erleichtert. Zunächst eine Überlegung die für das Grundverständnis wichtig ist, und für den geneigten Leser auch noch leicht nachvollziehbar sein sollte. Wir sind von einem Schichtsystem ausgegangen, das vier Schichten beinhaltet. Die Schichtfolge wechselt alle 28 Tage. 28 dividiert (geteilt) durch 4 ergibt 7. Das heißt, die Schichten untereinander sind, was die Schichtfolge betrifft, jeweils um sieben Tage versetzt. Das habe ich im nächsten Bild dargestellt.
 ADAEAFAGAH
1ArrayfeldAbwicklung der Schichten
222N   
323-   
424-   
525F   
626F   
727S   
80S   
91SS  
102NN  
113NN  
124--  
135--  
146FF  
157FF  
168FFF 
179SSS 
1810SSS 
1911NNN 
2012NNN 
2113--- 
2214--- 
2315----
2416FFFF
2517FFFF
2618SSSS
2719SSSS
2820NNNN
2921NNNN
3022NNNN
3123----
3224----
3325 FFF
3426 FFF
3527 SSS
360 SSS
371 SSS
382 NNN
393 NNN
404  --
415  --
426  FF
437  FF
448  FF
459  SS
4610  SS
4711   N
4812   N
4913   -
5014   -
5115   -
5216   F
5317   F


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Daraus folgt, das die Schichten 2 bis 4 einen anderen Startwert für die Schichtfolge benötigen, als die Schicht 1. Das wird im nächsten Bild noch deutlicher:
 ABCDEF
1 1234Arrayfeld
201.01.2006NS-F22
302.01.2006-NFS23
403.01.2006-NFS24
504.01.2006F-SN25
605.01.2006F-SN26
706.01.2006SFN-27
807.01.2006SFN-0
908.01.2006SFN-1
1009.01.2006NS-F2
1110.01.2006NS-F3
1211.01.2006-NFS4
1312.01.2006-NFS5
1413.01.2006F-SN6
1514.01.2006F-SN7
1615.01.2006F-SN8
1716.01.2006SFN-9
1817.01.2006SFN-10
1918.01.2006NS-F11
2019.01.2006NS-F12
2120.01.2006-NFS13
2221.01.2006-NFS14
2322.01.2006-NFS15
2423.01.2006F-SN16
2524.01.2006F-SN17
2625.01.2006SFN-18
2726.01.2006SFN-19
2827.01.2006NS-F20
2928.01.2006NS-F21

Jetzt hätte ich also einfach vier Arrays definieren können, die zwar letzlich die gleiche Schichtfolge enthalten, aber immer einen anderen Startwert haben. Das wollte ich vermeiden, deshalb habe ich mich entschlossen, das mit Korrekturwerten zu lösen. Die findet man hier:
 ABCDEFGHIJKLMNOPQRSTUVWXYZAAABAC
34Korrekturwerte für Schicht. Nicht Löschen!                            
3510000000000000000000000000000
362-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-721212121212121
373-21-21-21-21-21-21-21777777777777777777777
384-14-14-14-14-14-14-14-14-14-14-14-14-14-141414141414141414141414141414


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Wer den Kurs von Anfang an durchgearbeitet hat, kann sich daran erinnern. Bei Schicht 1 stehen diese Werte auf Null, weil das die Berechnungsgrundlage ist. Bei den anderen Schichten wird damit der Wert modifiziert, den diese Programmzeile berechnet hat:
we = Sheets("Kalender").Cells(s + iSta, sp - 1) Mod 28 ' Feldwert für Variable berechnen
Alles nächstes betrachten wir noch mal die Zeile, die ich zu Anfang nur am Rand erwähnt hatte:
iSchiKorr = we - vKoArr(Schi, we + 1) ' Arrayfeld aus Datum und Schicht berechnen
Das ist die Zeile, die die Korrekturwerte für die anderen Schichten berechnet. Für diesen Zweck wurden die Inhalte der Zellen A35 bis AC 38 in ein zweidimensionales Array eingelesen. Das geschah in dieser Zeile:
vKoArr = Sheets("Schichtfolge").Range("B35:AC38").Value2 ' Korrekturwerte einlesen
Jetzt muß noch eine Besonderheit beachtet werden: weiter oben hatte ich geschieben, dass Arrayfelder mit der Null anfangen zu zählen. Leider stimmt das nicht immer. In diesem Fall, also wenn der Bereich einer Range eingelesen wird, so wie ich es hier gemacht habe, dann beginnen die Adressen der Arrayfelder mit 1 zu zählen. Warum das so ist weiß ich nicht, es ist aber wichtig, das für das Verständnis der weiteren Ausführungen zu wissen.
Mit diesem Wissen betrachten wir noch einmal diese Zeile:
iSchiKorr = we - vKoArr(Schi, we + 1) ' Arrayfeld aus Datum und Schicht berechnen
Die Variable iSchiKorr soll mit einem Wert gefüllt werden, der das richtige Schichtkürzel dem richtigen Datum zuweist. Im ersten Teil der Formel iSchiKorr = we ist das, wie ich denke, noch klar. Dann geht es aber weiter, - vKoArr(Schi, we + 1). Was bedeutet das? Nun, Schi ist die Variable für die Schicht, nimmt also den Wert 1, 2, 3 oder 4 ein, je nach dem, welche Schicht angezeit werden soll. we ist ein Wert von 0 bis 27, das hängt, wie wir schon erfahren haben, vom jeweiligen Datum ab. Aber warum + 1? Das hängt mit der Zählweise unserer Arrays zusammen. Der Wert we geht von 0 bis 27, das Array iSchiKorr erwartet aber Werte von 1 bis 28, alles klar?
Gehen wir also einfach mal davon aus, es wurde die Schicht 2 gewählt und das datum gibt den Wert 18 vor. Dann sieht die Adresse der Arrayfeldes, das für die aktuelle Berechnung verwendet werden soll so aus: vKoArr(2, 19), 19 wegen we + 1!
Im nächsten Bild habe ich versucht, das Array iKoArr mit seinen Feldern darzustellen. Die oben genannte Adresse habe ich rot markiert.
 ABCDEFGHIJKLMNOPQRSTUVWXYZAAABAC
1 12345678910111213141516171819202122232425262728
210000000000000000000000000000
32-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-721212121212121
43-21-21-21-21-21-21-21777777777777777777777
54-14-14-14-14-14-14-14-14-14-14-14-14-14-141414141414141414141414141414


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Heißt unsere Rechnung also im Klartext we - (-7). Nehmen wir also mal an, we hat den Wert 8, dann bedeutet das 8 - (-7) = 15. Donnerwetter! wie kommt denn das? Nun die eine oder der andere wird sich noch dunkel erinnern, da war doch was in Mathe? Stimmt, wenn man von einer Zahl eine neagtive Zahl subthraiert (abzieht), dann wird daraus eine Addition. Auf dieser Basis wird man dann das nächste Bild verstehen:
Schichtkürzel

 ABCDEFGHIJKL
1Datum1234Arrayfeld  1234
207.01.2006SFN-0  072114
308.01.2006SFN-1  182215
409.01.2006NS-F2  292316
510.01.2006NS-F3  3102417
611.01.2006-NFS4  4112518
712.01.2006-NFS5  5122619
813.01.2006F-SN6  6132720
914.01.2006F-SN7  714021
1015.01.2006F-SN8  815122
1116.01.2006SFN-9  916223
1217.01.2006SFN-10  1017324
1318.01.2006NS-F11  1118425
1419.01.2006NS-F12  1219526
1520.01.2006-NFS13  1320627
1621.01.2006-NFS14  142170
1722.01.2006-NFS15  152281
1823.01.2006F-SN16  162392
1924.01.2006F-SN17  1724103
2025.01.2006SFN-18  1825114
2126.01.2006SFN-19  1926125
2227.01.2006NS-F20  2027136
2328.01.2006NS-F21  210147
2401.01.2006NS-F22  221158
2502.01.2006-NFS23  232169
2603.01.2006-NFS24  2431710
2704.01.2006F-SN25  2541811
2805.01.2006F-SN26  2651912
2906.01.2006SFN-27  2762013

Formeln der Tabelle
ZelleFormel
I2=$F2-$B$32
J2=$F2-$B$33
K2=$F2-$B$34
L2=$F2-$B$35


Array vKoArr (Inhalte)

 ABCDEFGHIJKLMNOPQRSTUVWXYZAAABAC
31Korrekturwerte für Schicht. Nicht Löschen!                 
3210000000000000000000000000000
332-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-721212121212121
343-21-21-21-21-21-21-21777777777777777777777
354-14-14-14-14-14-14-14-14-14-14-14-14-14-141414141414141414141414141414


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Ich habe also im grünen Bereich die Werte dargestellt, die sich bei den oben beschriebenen Berechnungen ergeben können. Aus Platzgründen habe ich, in der Hoffnung, das das auch so verständlich ist, nicht alle Formeln dargestellt. Es ändern sich immer die Spaltenbezeichnungen von B auf C usw.