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
Pingback: Materialflussanalysen in Activity Relationship Charts transformieren - Tech+Code
Pingback: Von-Nach Tabellen aus Materialflussanalysen unidirektional konsolidieren - Tech+Code