Werden Fabriklayouts neu geplant oder verändert, spielt die Anordnung der Arbeitsplätze oder Einrichtungen die wesentliche Rolle, um die Ausbringung zu maximieren und die Aufwände zu minimieren. Im Fokus steht der Materialfluss zwischen den Arbeitsplätzen. Das ist für viele Planungen genau richtig. Der Materialfluss alleine ist aber nicht die Lösung, es zählen alle Beziehungen.
Materialfluss alleine ist nicht die Lösung
Der Materialfluss ist wichtig, werden doch über ihn die Bewegungen des Produktes abgebildet. Was aber, wenn andere Kriterien an bestimmten Stellen wichtiger sind als der Materialfluss? Das Potenzial, eine optimale Arbeitsplatzanordnung zu entwickeln, wird dann verschenkt.
Diese Stellen im Materialfluss sind i. d. R. den Beteiligten bekannt, werden aber bei Fokus auf den reinen Materialfluss in der Anordnungsplanung einfach nicht berücksichtigt.
Es gibt eine Reihe von Kriterien, die nicht über den Materialfluss abgebildet werden. Einige Beispiele sind:
Um diese quantitativen Kriterien dennoch systematisch zu erkennen und damit berücksichtigen zu können, setzen Tompkins/White/Bozer/Tanchoco (Facilities Planning, Seite 115ff) das „Activity Relationship Chart“ (ARC) ein.
Es handelt sich um eine Diagrammart, die auf einem dreieckigen Mileage-Diagramm basiert. Das ARC stellt die Beziehungen zwischen den Arbeitsplätzen visuell in einer Dreiecksform dar.
Aufbau eines Activity Relationship Chart
Das Diagramm enthält alle Arbeitsplätze und die Kriterien, mit denen sie in Beziehung stehen. Auf der linken Seite stehen die Arbeitsplätze.
In den Dreiecksfeldern steht in der oberen Hälfte die Relevanz der Beziehung, dargestellt als Buchstabe.
Die untere Hälfte erklärt den Grund für die ausgewählte Relevanz der Beziehung. Diese Kriterien definieren sich jeweils aus dem untersuchten Planungsfall.
In Wikipedia werden beispielsweise diese aufgeführt:
Problem Datenerhebung
Die notwendigen Beziehungsdaten zu erheben, ist der wesentlich schwierigere Teil. Dafür bieten sich Umfragen oder Interviews mit den beteiligten Personen an. Bei der Sicht von Einzelpersonen ergeben sich mit hoher Wahrscheinlichkeit unterschiedliche Eingruppierungen. Im Activity Relationship Chart lässt sich aber nur eine Beurteilung der Relevanz erfassen.
Deswegen ist eine Datenerhebung in Workshops mit allen beteiligten Personen eine effizientere Möglichkeit. Jede Beziehung zwischen zwei Arbeitsplätzen lässt sich direkt diskutieren und fixieren.
Dafür muss der Fokus auf die Beziehung zwischen den zwei aktuell zu bewertenden Arbeitsplätzen liegen. Das Activity Relationship Chart zeigt immer alle Beziehungen an. Deswegen ist schwieriger den Fokus auf eine Bestimmte zu halten. Besser ist es im Workshop jede Bewertung fokussiert durchzuführen.
Die Methode funktioniert theoretisch mit einer beliebigen Anzahl von Arbeitsplätzen. Ab 10 Arbeitsplätzen müssen bereits 45 Beziehungen untersucht werden. Bei 8 Arbeitsplätzen sind es noch 28 Beziehungen. Das kann noch gut in einem Workshop untersucht werden. Gibt es mehr Arbeitsplätze, ist es sinnvoller, diese vorher in Gruppen aufzuteilen und die Gruppen getrennt voneinander zu analysieren.
Ein selber programmiertes Activity Relationship Chart für Workshops
Wenn Sie soweit gelesen haben, wollen Sie bestimmt ein Activity Relationship Chart ausprobieren. Eine passende Vorlage ist über Google auch schnell gefunden. Die Vorlagen für Microsoft Office sehen optisch meistens nicht gut aus. Die grafisch ansprechenden basieren aber eher auf Webanwendungen, wie creately.com.
Da wir jetzt wissen, was wir wollen und brauchen, können wir es auch selber für Microsoft Excel programmieren.
Als Ergebnis entsteht der ARC-Generator. Mit ihm können Sie sehr schnell Activity Relationship Charts in jeder beliebigen Größe erstellen und es unterstützt Sie auch beim Ausfüllen – speziell in Workshops.
Es gilt, zwei Herausforderungen zu lösen. Einmal muss die ungewöhnliche Darstellungsform als dreieckiges Mileage Diagramm gelingen. Zum anderen brauchen wir eine Möglichkeit zum Ausfüllen und Bewerten in einer Workshop Situation.
Teil 1: Das Activity Relationship Chart in Excel umsetzen
Eine passende Darstellung finden
Schaut man sich das Diagramm an, bietet Excel erst einmal mit seiner Zeilen- und Spaltenorientierung keine gute Ausgangsbasis für die Darstellung. Eine perfekte Umsetzung gibt es auch nicht wirklich. Aber Excel stellt die Möglichkeit bereit, für einzelne Zellen nicht nur einen Rahmen außen darzustellen, sondern auch quer durch die Zelle.
Mit dieser Logik lässt sich das Diagramm sehr gut aufbauen. Die Bewertungscodes lassen sich sinnvoll nur rechtsbündig anordnen, um ungefähr an der richtigen Stelle zu stehen.
Die Bewertung lässt für die Begründung auch mehrere Antworten zu. Mit der rechtsbündigen Anordnung sieht das dann unsauber aus.
Mit einem kleinen Trick wird es besser. Dafür fügt man eine zusätzliche Spalte für die Beschriftung ein und wählt aus Ausrichtung mittig. Diese dient nur als Hilfsspalte. Im fertigen Diagramm setzt man die Spaltenbreite auf den minimalsten Wert, der noch den Text anzeigt. Das ist bei mir 0,03.
So ist zwar die manuelle Eingabe etwas komplizierter, aber das Ergebnis wesentlich schöner.
Kriterien frei wählbar machen
Je nach Planungsaufgabe ergeben sich die Kriterien für die Beziehungsgründe unterschiedlich. Es macht also Sinn, diese Variabilität gleich mit zu berücksichtigen. Genauso müssen die zu bewertenden Arbeitsplätze, irgendwo festgelegt werden können.
Noch variabler wird der ARC Generator, wenn auch die Beziehungsrelevanz frei definiert werden kann.
Damit ist klar, es wird eine Eingabetabelle mit drei Listen benötigt. Jede besteht aus zwei Spalten. In der ersten steht der Code, in der zweiten eine Beschreibung zum Code.
Wir haben alle notwendigen Informationen, um mit VBA die Excel Zellen entsprechend zu formatieren.
Um arbeiten zu können, braucht unser Algorithmus für das ARC die Daten aus dem Eingabe-Worksheet. Die Definition, wo welche Daten stehen, geben globale Konstanten vor.
'Input Global Const SHEET_INPUT = "ARC data" 'name of the worksheet Global Const ROW_INPUT_START = 5 'row where all input data starts Global Const COL_DEPARTMENT = 2 'column no Global Const COL_DEPARTMENT_DESCRIPTION = 3 'column no Global Const COL_RATING_SYMBOL = 5 'column no Global Const COL_REASON_CODE = 8 'column no Global Const COL_ARC_DATA = 11 'column no 'Output Global Const SHEET_OUTPUT_ARC = "Activity relationship chart" 'name of the worksheet Global Const ARC_TOP = 4 Global Const ARC_LEFT = 2 Global Const ARC_WIDTH = 6 'column width of the triangular cells Global Const ARC_WIDTH_TEXT = 0.03 'column width of the "invisible" text Global Const ARC_WIDTH_TEXT_EDIT = 10 'column width for manual editing
Jetzt geht es an das Formatieren des Diagramms. Falls genau passiert, steht in den Bemerkungszeilen direkt im Quellcode.
In der Zeichnenroutine dreht sich viel, um das Einzeichnen von Rahmenlinien. Damit das etwas komfortabler und kürzer geht, ist die Funktionalität in eine eigene Prozedur DoBorder() ausgelagert.
Private Sub DoBorder(rng As Range, bi As XlBordersIndex, bw As Double) With rng.Borders(bi) .LineStyle = xlContinuous .ColorIndex = xlAutomatic .TintAndShade = 0 .weight = bw End With End Sub Sub CreateARC() Dim i As Integer Dim j As Integer Dim si As String Dim sj As String Dim x As Integer Dim y As Integer Dim shArc As Worksheet Dim shData As Worksheet 'Zuerst das Worksheet für die Eingabedaten definieren Set shData = Sheets(SHEET_INPUT) 'Das gleiche für das Tabellenblatt in welches das Activity Relationsship Chart gezeichnet wird Set shArc = Sheets(SHEET_OUTPUT_ARC) 'Falls schon ein ARC vorhanden ist, muss das vorher gelöscht werden shArc.Rows(CStr(ROW_INPUT_START) & ":" & CStr(Rows.Count)).Delete 'Jetzt durchlaufen zwei Schleifen die Beziehungen zwischen allen Arbeitsplätzen 'Begonnen wird mit der Ersten und den Beziehungen zu allen anderen 'Dann weiter mit der Zweiten i = 0 Do 'Code des Arbeitsplatzes vom Eingabe-Worksheet einlesen si = shData.Cells(ROW_INPUT_START + i, COL_DEPARTMENT) 'Arbeitsplatz Code und Bezeichnung auf das Ziel Tabellenblatt schreiben shArc.Cells(ARC_TOP + i * 2, ARC_LEFT) = si shArc.Cells(ARC_TOP + i * 2, ARC_LEFT).Font.Bold = True 'und gleich einen Rahmen Oben und Links zeichnen Call DoBorder(shArc.Cells(ARC_TOP + i * 2, ARC_LEFT), xlEdgeTop, xlThick) Call DoBorder(shArc.Cells(ARC_TOP + i * 2, ARC_LEFT), xlEdgeLeft, xlThick) shArc.Cells(ARC_TOP + i * 2 + 1, ARC_LEFT) = shData.Cells(ROW_INPUT_START + i, COL_DEPARTMENT + 1) Call DoBorder(shArc.Cells(ARC_TOP + i * 2 + 1, ARC_LEFT), xlEdgeLeft, xlThick) Call DoBorder(shArc.Cells(ARC_TOP + i * 2 + 1, ARC_LEFT), xlEdgeBottom, xlThick) 'jetzt die Pfeilspitzen rechts neben der Arbeitsplatz-Bezeichnung formatieren shArc.Cells(ARC_TOP + i * 2, ARC_LEFT + 1) = "" Call DoBorder(shArc.Cells(ARC_TOP + i * 2, ARC_LEFT + 1), xlDiagonalDown, xlThick) Call DoBorder(shArc.Cells(ARC_TOP + i * 2 + 1, ARC_LEFT + 1), xlDiagonalUp, xlThick) 'wenn es nicht, der letzte Arbeitsplatz in der Liste ist, dann zweite Schleife durchlaufen If shData.Cells(ROW_INPUT_START + i + 1, COL_DEPARTMENT) <> "" Then j = i + 1 Do 'x und y bezeichnen die Left und Top Position des Bewertungscode-Texts y = ARC_TOP + i * 2 + j - i x = ARC_LEFT + (j - i) * 2 sj = shData.Cells(ROW_INPUT_START + j, COL_DEPARTMENT) 'jetzt wieder die Rahmen für das gekippte Rechteck formatieren Call DoBorder(shArc.Cells(y, x + 1), xlDiagonalDown, xlThick) Call DoBorder(shArc.Cells(y, x + 1), xlEdgeBottom, xlThin) Call DoBorder(shArc.Cells(y + 1, x + 1), xlDiagonalUp, xlThick) If shData.Cells(ROW_INPUT_START + j + 2, COL_DEPARTMENT) <> "" Then Call DoBorder(shArc.Cells(y + 1, x - 1), xlEdgeTop, xlThin) End If Call DoBorder(Range(shArc.Cells(y, x - 2), shArc.Cells(y, x + 1)), xlEdgeBottom, xlThin) 'Hier die Bewertungscodes löschen und die Formatierung vorbereiten 'WarpText ist extrem wichtig, sonst wird der Text nicht angezeigt shArc.Cells(y, x) = "" With shArc.Cells(y, x) .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False End With Call DoBorder(shArc.Cells(y, x), xlEdgeTop, xlThick) shArc.Cells(y + 1, x) = "" With shArc.Cells(y + 1, x) .HorizontalAlignment = xlCenter .VerticalAlignment = xlTop .WrapText = False End With Call DoBorder(shArc.Cells(y + 1, x), xlEdgeBottom, xlThick) j = j + 1 Loop Until shData.Cells(ROW_INPUT_START + j, COL_DEPARTMENT) = "" End If i = i + 1 Loop Until shData.Cells(ROW_INPUT_START + i, COL_DEPARTMENT) = "" ' Mit dieser Sub setzt eine Routine die Spaltenbreiten, so dass das ARC hübsch aussieht Call SetArcColumWidth(ColumnTypes.ArcColumn, ARC_WIDTH) 'Über diese Routine wird das Eingabe-Worksheet vorbereitet für Statistik-Auswertungen Call UpdateReasonCodes 'Am Ende auf das Ziel Tabellenblatt wechseln und damit das ARC anzeigen shArc.Activate End Sub
Teil 2: Die Workshop Funktionalität einbauen
In Workshops brauchen wir die Aufmerksamkeit auf die beiden zu bewertenden Arbeitsplätze mit einer einfachen Auswählmöglichkeit für die Beziehungsrelevanz und den Gründen dafür. Gleichzeitig müssen die Teilnehmer eine Gesamtübersicht sehen können.
Das spricht dafür, dass als Gesamtübersicht das erstellte Activity Relationship Chart gezeigt werden muss und gleichzeitig separat Bewertungen der Arbeitsplätze sichtbar sein müssen.
Eine gute Möglichkeit für eine Umsetzung dieser Anforderungen ist es, ein VBA Dialog Formular zu benutzen. Der Workshopleiter kann den Dialog frei platzieren und trotzdem beide Informationen sichtbar machen.
Der Dialog braucht die zu bewertenden Arbeitsplätze. Bei mir sind das zwei Frame-Objekte mit einem Label für den Arbeitsplatz Code und die Bezeichnung.
Die Bewertungen erfolgen über zwei Listboxen. Die Listbox für die Gründe darf mehrere gewählte Elemente beinhalten. Das steuern wir über die Eigenschaft MultiSelect.
Die Ereignisse im Dialog bringen die Funktionalität für die Bewertung mit.
Option Explicit ' die Variable speichert die Position der aktuelle Bewertung Dim position As Integer ' zuerst wird die Form initialisiert, die beiden Listbox werden mit den Werten ' aus dem Eingabe-Worksheet befüllt ' die Position wird auf den ersten noch nicht bewertete Beziehung gesetzt Private Sub UserForm_Initialize() Call UpdateReasonListbox(ListBoxSymbol, COL_RATING_SYMBOL) Call UpdateReasonListbox(ListBoxCodes, COL_REASON_CODE) position = FirstEmptyRating() Call UpdateView End Sub ' nächste Bewertung vornehmen und Position erhöhen ' vorher werden die Eingaben in den Listboxen im ARC gespeichert Private Sub CommandButton1_Click() Call Save If position = RatingsCount() Then Exit Sub position = position + 1 Call UpdateView End Sub ' zur vorherigen Bewertung zurückspringen Private Sub CommandButton2_Click() Call Save If position = 1 Then Exit Sub position = position - 1 Call UpdateView End Sub ' eine neue Bewertung beginnen, dabei wird auch das ARC neu erzeugt Private Sub CommandButton3_Click() If MsgBox("Eine neue Bewertung beginnen? Alle Diagramm-Daten werden dabei gelöscht.", vbYesNoCancel, "Neue Bewertung") <> vbYes Then Exit Sub Call CreateARC position = 1 Call UpdateView End Sub ' die aktuelle Bewertung im ARC speichern Private Sub Save() Dim rating As RatingType Dim i As Integer Dim s As String rating.department1 = LabelDepartment1.Caption rating.department2 = LabelDepartment2.Caption For i = 0 To ListBoxSymbol.ListCount - 1 If ListBoxSymbol.Selected(i) = True Then rating.symbol = Sheets(SHEET_INPUT).Cells(ROW_INPUT_START + i, COL_RATING_SYMBOL) End If Next s = "" For i = 0 To ListBoxCodes.ListCount - 1 If ListBoxCodes.Selected(i) = True Then s = s & Sheets(SHEET_INPUT).Cells(ROW_INPUT_START + i, COL_REASON_CODE) & ";" End If Next If Right$(s, 1) = ";" Then s = Left$(s, Len(s) - 1) rating.codes = s Call SetRating(position, rating) End Sub ' die Ansicht aktualisieren: die Daten aus dem ARC der aktuellen Position ' einlesen und in den Dialogfeldern darstellen Private Sub UpdateView() Dim rating As RatingType Dim i As Integer Dim arr() As String Dim code As Variant Dim total As Integer rating = GetRating(position) LabelDepartment1.Caption = rating.department1 LabelDepartment2.Caption = rating.department2 LabelDepartmentDescription1.Caption = rating.description1 LabelDepartmentDescription2.Caption = rating.description2 For i = 0 To ListBoxSymbol.ListCount - 1 ListBoxSymbol.Selected(i) = False Next For i = 0 To ListBoxSymbol.ListCount - 1 If Left$(ListBoxSymbol.List(i), Len(rating.symbol & " ")) = rating.symbol & " " Then ListBoxSymbol.Selected(i) = True Exit For End If Next arr = Split(rating.codes, ";") For i = 0 To ListBoxCodes.ListCount - 1 ListBoxCodes.Selected(i) = False For Each code In arr If Left$(ListBoxCodes.List(i), Len(code & " ")) = code & " " Then ListBoxCodes.Selected(i) = True End If Next Next total = RatingsCount() Frame2.Width = Frame1.Width / total * position LabelPosition.Caption = CStr(position) & " von " & CStr(total) End Sub Private Sub UpdateReasonListbox(lb As msforms.ListBox, column As Integer) Dim i As Integer Dim k As Integer Dim shData As Worksheet Set shData = Sheets(SHEET_INPUT) lb.Clear i = ROW_INPUT_START Do lb.AddItem (shData.Cells(i, column) & " " & shData.Cells(i, column + 1)) i = i + 1 Loop Until shData.Cells(i, column) = "" End Sub
Etwas Statistik
Ein Activity Relationship Chart sollte nur sehr wenige A- und X-Beziehungen (nicht mehr als fünf Prozent) beinhalten.
Das in einer Workshop Situation vorzugeben, halte ich für schwierig und als Hemmnis. Schließlich sollen Einschätzungen besprochen und gemeinsam entschieden werden. Eine Vorgabe kann das ausbremsen.
Für das spätere Nutzen des Activity Relationship Chart sieht das anders aus, schließlich ist es die Basis für die Anordnungsoptimierung. Damit grundlegende Auswertungen nicht eingeschränkt werden, speichert die Methode SetRating() alle Bewertungsdaten in einer Liste ab.
Die Sub trägt die Bewertungsdaten an der angegebenen Position in das Eingabe-Worksheet ein. Die zusammengefassten Gründe-Codes werden mit der Split Funktion aufgelöst und in einzelne Spalten geschrieben.
Sub SetRating(position, rating As RatingType) Dim i As Integer Dim j As Integer Dim p As Integer Dim c As Integer Dim arr() As String Dim code As Variant Dim shArc As Worksheet Dim shData As Worksheet Set shArc = Sheets(SHEET_OUTPUT_ARC) Set shData = Sheets(SHEET_INPUT) i = 0 p = 0 Do If shData.Cells(ROW_INPUT_START + i + 1, COL_DEPARTMENT) <> "" Then j = i + 1 Do p = p + 1 If p = position Then shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA) = position shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 1) = rating.department1 shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 2) = rating.department2 shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 3) = rating.symbol shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 4) = rating.codes If rating.codes = "" Then shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 5) = 1 Else shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 5) = 0 End If arr = Split(rating.codes, ";") c = ROW_INPUT_START Do shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 5 + c - ROW_INPUT_START + 1) = 0 For Each code In arr If CStr(code) = shData.Cells(c, COL_REASON_CODE) Then shData.Cells(ROW_INPUT_START + p - 1, COL_ARC_DATA + 5 + c - ROW_INPUT_START + 1) = 1 End If Next c = c + 1 Loop Until shData.Cells(c, COL_REASON_CODE) = "" shArc.Cells(ARC_TOP + i * 2 + j - i, ARC_LEFT + (j - i) * 2) = rating.symbol Call AssignFont(shData.Cells(ROW_INPUT_START + RatingSymbolPosition(rating.symbol), COL_RATING_SYMBOL), shArc.Cells(ARC_TOP + i * 2 + j - i, ARC_LEFT + (j - i) * 2)) shArc.Cells(ARC_TOP + i * 2 + j - i + 1, ARC_LEFT + (j - i) * 2).NumberFormat = "@" shArc.Cells(ARC_TOP + i * 2 + j - i + 1, ARC_LEFT + (j - i) * 2) = rating.codes Exit Sub End If j = j + 1 Loop Until shData.Cells(ROW_INPUT_START + j, COL_DEPARTMENT) = "" End If i = i + 1 Loop Until shData.Cells(ROW_INPUT_START + i, COL_DEPARTMENT) = "" End Sub
Wollen Sie die ARC Daten nachfolgend für Methoden wie Schmigalla oder CORELAP (Computerized Relationship Layout Planning) nutzen, brauchen Sie die Listenform für Punktebewertungen der Beziehungen, um eine Reihenfolge zu erzeugen.
Zusammenfassung
Activity Relationship Charts sind sinnvolle Hilfsmittel bei der Anordnungsplanung von Fabriklayouts. Mit ihnen ist es möglich, neben dem Materialfluss, auch andere Kriterien zu berücksichtigen. Activity Relationship Charts visualisieren die Beziehungen zwischen Arbeitsplätzen mittels dreieckiger Mileage-Diagramme.
Die Erhebung der Beziehungsdaten erfordert oft die Zusammenarbeit von mehreren Beteiligten. Das ist über geführte Workshops am besten möglich.
Dabei hilft ein selber entwickelter Activity Relationship Chart Generator unter Microsoft Excel, der auch komfortabel bei gemeinsamen Bewertungen in Workshops unterstützt.
Links
Factory Planning by James A. Tompkins, John A. White, Yavuz A. Bozer, J. M. A. Tanchoco
https://books.google.de/books/about/Facilities_Planning.html?id=-xBIq6Qm2SQC&redir_esc=y
Activity Relationship Chart by Wikipedia
https://en.wikipedia.org/wiki/Activity_relationship_chart
Method to Generate Activity Relationship Chart in Facility Layout Problems by Monika Sharma, Ashwani Mor
https://www.ijspr.com/citations/v13n3/IJSPR_1303_144.pdf
Pingback: Systematische Layoutplanung: Der Weg zum optimalen Fabriklayout mit dem Activity Relationship Diagram - Tech+Code