Sourcecode: Activity Relationship Diagramme
Hier finden Sie das Plus an Quellcode zum Artikel Systematische Layoutplanung: Der Weg zum optimalen Fabriklayout mit dem Activity Relationship Diagram.
Option Explicit
'Eigene Typen definieren
Type DepartmentInsertType
department As String
description As String
insertStep As Integer
End Type
Type RatingLineStyleType
weight As Double
color As Long
End Type
'Modulvariablen definieren
Dim step As Integer
Dim stepCaption As Variant
Dim departments() As DepartmentInsertType
Dim listRatings() As RatingType
Dim ratingLineStyles(6) As RatingLineStyleType
'Aktion beim Klicken auf den Button "STARTEN"
Sub StartActivityRelationshipDiagram()
If MsgBox("Neues Activity Relationship Diagramm starten und Anordnungoptimierung beginnen?", vbYesNoCancel, "Neues Activity Relationship Diagram") <> vbYes Then Exit Sub
'Vorbereitungen
step = 1
stepCaption = Array("", "Arbeitsplätze *A* einfügen", "Arbeitsplätze *E* einfügen", "Arbeitsplätze *X* einfügen", "Arbeitsplätze *I* einfügen", "Arbeitsplätze *O* einfügen", "Restliche Arbeitsplätze einfügen")
ActiveSheet.Buttons("ButtonNext").text = stepCaption(step)
Call CreateDepartmentRatingsList
'Definitionen für die Verbindungslinien mit Liniendicke und Linienfarbe für die Bewertungstypen
ratingLineStyles(1).weight = 10: ratingLineStyles(1).color = RGB(255, 0, 0) 'A
ratingLineStyles(2).weight = 6: ratingLineStyles(2).color = RGB(255, 192, 0) 'E
ratingLineStyles(3).weight = 3: ratingLineStyles(3).color = RGB(146, 208, 80) 'I
ratingLineStyles(4).weight = 2: ratingLineStyles(4).color = RGB(0, 112, 192) 'O
ratingLineStyles(5).weight = 1: ratingLineStyles(5).color = RGB(130, 130, 130) 'U
ratingLineStyles(6).weight = 8: ratingLineStyles(6).color = RGB(139, 90, 43) 'X
End Sub
'Aktion beim Klicken auf den Button "... einfügen"
Sub NextStepOfActivityRelationshipDiagram()
'nur weiter ausführen, wenn auch STARTEN angeklickt wurde
If step = 0 Then Exit Sub
'Arbeitsplätze entsprechenden dem "step" einfügen
Call InsertIntoLayout(step)
'nächster Schritt oder Abschluss der Methode
step = step + 1
If step > 6 Then
Call MsgBox("Alle Arbeitsplätze sind eingefügt. Das Activity Relationship Diagramm ist abgeschlossen und kann weiter optimiert werden.", vbOK, "Activity Relationship Diagramm")
step = 0
End If
'Neuen Text im Button anzeigen
ActiveSheet.Buttons("ButtonNext").text = stepCaption(step)
End Sub
'Auswertungsmatrix erstellen
Private Sub CreateDepartmentRatingsList()
Dim i As Integer
Dim j As Integer
Dim dc As Integer
Dim rc As Integer
Dim rt As RatingType
Dim r As Integer
Dim rtArr As Variant
'Reihenfolge der Einfügung in die Planungsumgebung, der erste Wert (0) bleibt leer und ohne Auswirkung
rtArr = Array("", "A", "E", "X", "I", "O")
'Arbeitsplätze ermitteln und Bezeichnungen einlesen in Array
dc = DepartmentsCount()
ReDim departments(dc)
For i = 1 To dc
departments(i).department = Sheets(SHEET_INPUT).Cells(i + ROW_INPUT_START - 1, COL_DEPARTMENT)
departments(i).description = Sheets(SHEET_INPUT).Cells(i + ROW_INPUT_START - 1, COL_DEPARTMENT + 1)
departments(i).insertStep = 6
Next
'Bewertungen einlesen
rc = RatingsCount()
ReDim listRatings(rc)
For i = 1 To rc
listRatings(i) = GetRating(i)
Next
'Einfügeschritt für jeden Arbeitsplatz ermitteln
For r = 1 To 5 'Reihenfolge AEXIO aus rtArr
For i = 1 To rc 'alle Bewertungen durchlaufen
If listRatings(i).type = rtArr(r) Then 'wenn Bewertungstyp übereinstimmt, dann
For j = 1 To dc 'alle Arbeitsplätze durchlaufen
If listRatings(i).department1 = departments(j).department Or listRatings(i).department2 = departments(j).department Then
'Arbeitsplatz stimmt, wenn dieser noch nicht eingefügt wurde, dann Schritt speichern
If departments(j).insertStep > r Then departments(j).insertStep = r
End If
Next
End If
Next
Next
End Sub
'Arbeitsplatz Shape mit Verbindungslinien-Shapes einfügen und verbinden
Private Sub InsertIntoLayout(insertStep As Integer)
Dim shp As Shape
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim top As Double
Dim left As Double
Dim rt As RatingType
Dim relationTo As String
Dim rc As Integer
Dim dc As Integer
Dim valid As Boolean
rc = RatingsCount()
dc = DepartmentsCount()
'Startpunkt für die ersten Einfügungen
top = 80
left = 100
'Arbeitsplatz-Shapes einfügen
For i = 1 To dc
'wenn der ermittelte Schritt des Arbeitsplatzes zum aktuellen Schritt passt, dann weiter
If departments(i).insertStep = insertStep Then
'falls das Arbeitsplatz Shape schon auf der Planungsumgebung vorhanden ist, dann dieses verwenden, sonst neu einfügen
If ShapeExists(ActiveSheet.name, "D-" & departments(i).department) = True Then
Set shp = ActiveSheet.Shapes("D-" & departments(i).department)
Else
Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, left, top, 80, 60)
End If
left = left + shp.width * 1.2
'Code und Bezeichnung des Arbeitsplatzes einfügen im Shape Text und ein wenig formatieren
shp.TextFrame2.TextRange.Characters.text = departments(i).department & " " & departments(i).description
shp.name = "D-" & departments(i).department
shp.TextFrame2.VerticalAnchor = msoAnchorMiddle
shp.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
End If
Next
'Verbindungslinien einfügen
For i = 1 To dc 'alle Arbeitsplätze durchlaufen
'wenn der Arbeitsplatz zum aktuellen Schritt passt, dann
If departments(i).insertStep = insertStep Then
For j = 1 To rc 'alle Bewertungen durchlaufen und schauen, ob einer der Arbeitsplätze gleich ist
If departments(i).department = listRatings(j).department1 Or departments(i).department = listRatings(j).department2 Then
'den Gegenpart zum Arbeitsplatz finden und in der Variablen relationTo speichern
If departments(i).department = listRatings(j).department1 Then
relationTo = listRatings(j).department2
Else
relationTo = listRatings(j).department1
End If
'wenn es das Verbindungs-Shape schon gibt, dann dieses auswählen, sonst neu anlegen
If ShapeExists(ActiveSheet.name, "D-" & departments(i).department) = True And ShapeExists(ActiveSheet.name, "D-" & relationTo) = True Then
'beim Bewertungstype U oder keinem wird keine Linie gezeichnet
If Not (listRatings(j).type = "U" Or listRatings(j).type = "") Then 'für U oder unbewertet keine Verbindungslinien zeichnen
If ShapeExists(ActiveSheet.name, "R-" & departments(i).department & "-" & relationTo) = True Then
Set shp = ActiveSheet.Shapes("R-" & departments(i).department & "-" & relationTo)
Else
Set shp = ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 0, 0, 100, 100)
shp.name = "R-" & departments(i).department & "-" & relationTo
End If
'Verbindungspunkte festlegen, beim Rechteck 1=oben, 2=rechts, 3=unten, 4=links
shp.ConnectorFormat.BeginConnect ActiveSheet.Shapes("D-" & departments(i).department), 3
shp.ConnectorFormat.EndConnect ActiveSheet.Shapes("D-" & relationTo), 3
'Formatierung des Linien-Shapes nach den festgelegten Voreinstellungen
k = RatingSymbolPosition(listRatings(j).type) + 1
shp.Line.weight = ratingLineStyles(k).weight
shp.Line.ForeColor.RGB = ratingLineStyles(k).color
End If
End If
End If
Next
End If
Next
'Arbeitsplatz-Shapes in den Vordergrund bringen (so ist das Neuanordnen einfacher)
For i = 1 To dc
If departments(i).insertStep <= insertStep Then
ActiveSheet.Shapes("D-" & departments(i).department).ZOrder msoBringToFront
End If
Next
End Sub
Zurück zum Artikel Systematische Layoutplanung: Der Weg zum optimalen Fabriklayout mit dem Activity Relationship Diagram
Der Sourcecode basiert auf dem ARC-Generator. Um zu funktionieren, muss er dort als Modul eingefügt werden. Mehr wird im obigen Artikel erklärt.
