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.