Ziel Priorisierung mit paarweisem Vergleich

Paarweiser Vergleich mit automatisierter Erstellung

Um Layoutvarianten zu vergleichen, ist es sinnvoll eine Nutzwertanalyse einzusetzen. Varianten werden dabei anhand von Kriterien miteinander, auf deren Erfüllung hin, verglichen. Sind die Kriterien unterschiedlich wichtig, müssen sie priorisiert werden. Dafür kann man einen paarweisen Vergleich mit allen Kombinationen durchführen und so eine Kriterien-Reihenfolge festlegen.

Im Internet gibt es eine riesige Anzahl an Umsetzungen und Vorlagen. Eine Google-Suche nach „Paarweiser Vergleich“ bringt >500.000 Treffer. Eine Suche nach „Nutzwertanalyse“ liefert auch noch >200.000 Ergebnisse.

Sehr oft können Sie auf so einer Trefferseite auch gleich eine Excel Vorlage downloaden. Das ist schon mal sehr gut. Trifft aber nach meiner Erfahrung überhaupt nicht das Thema.

Probleme im Workshop

Vielleicht geht es Ihnen ähnlich. Ich brauche eine Nutzwertanalyse nie alleine, sondern immer zusammen mit einer Planungsgruppe, einem Lenkungskreis oder eine Geschäftsführung. Und dort hat bei mir noch keine Vorlage perfekt funktioniert.

Die Vorlagen haben fast immer eine vorbereitete Logik eingebaut und passen für eine bestimmte Anzahl von Kriterien. Braucht man mehr Kriterien hat man Pech – Tabelle umbauen, Wartezeit für alle Teilnehmer. Vielleicht kommt dann in der Hektik noch ein Formelfehler dazu – Fiasko.

Auch nicht besser ist es, wenn ein Kriterium vorher in der Erklärung gestrichen werden kann und es z. B. zu einer Rahmenbedingung wird. Dann kann man zwar die Vorlage so lassen, schön sieht sie aber nicht mehr aus.

Aber damit kann ich noch klarkommen. Man kann sich ja auf ein paar Fälle vorbereiten und mehrere Vorlagen mitnehmen. Was viel stärker ins Gewicht fällt, ist in meinen Augen das:

Die Kriterien sind nicht klar definiert und sorgen in der ersten Hälfte des paarweisen Vergleichs immer wieder für nachträgliche Erklärungen und damit Wartezeiten für alle anderen.

Selbst mit einem hochauflösenden Beamer muss man den Bildschirm oft scrollen. Gibt es dann noch viele Kriterien, weiß ohnehin niemand mehr was gerade mit wem vergleichen wird, und wie das mit der Punktevergabe war.

Hat die Gruppe es dann geschafft und alles bewertet, erzeugen viele Tools sogar eine Reihenfolge. Die ist entweder nach Punkten oder nach Rang bewertet. Das ist schon ganz gut und immer unterhaltsam, denn so muss eine ganze Gruppe die Reihenfolge zusammensuchen oder alles wegkopieren und sortieren.

Dabei ist das Verfahren perfekt geeignet, eine fokussierte Sicht auf die Lösungsfindung zu lenken.

Höchste Zeit, dass wir uns das aus Coding-Sicht anschauen und es besser lösen, als das was man sonst so downloaden kann.

Nutzwertanalyse 2.0

Das war eine lange Einleitung. Aber finde es wichtig, dass Sie verstehen an welchen Ecken wir am besten ansetzen können, um die Methode, besonders für Workshops oder Planungsrunden zu verbessern.

Ich fasse mal die obigen Anforderungen zusammen:

  • Die Anzahl der Kriterien muss variabel sein und sich auch im Workshop ändern lassen
  • Jedes Kriterium braucht bei Bedarf eine zusätzliche Erklärung, welche mitgespeichert werden muss
  • Die Eingabe in Tabellenform ist als Ergebnis-Zusammenfassung praktisch und muss vorhanden sein
  • Die Bewertung muss Workshop-tauglich sein, und eine Gruppe durch die Tabelle visuell und klar führen
  • Die Reihenfolge muss als sortierte Liste ausgegeben werden

Projektierung

Die Vorlagen, die Sie im Internet finden können, sind zu 95% mit Excel erstellt. Das ist für mich auch die passende Wahl für diesen Einsatzfall. Damit wir aber alle Anforderungen unterstützen können, teile ich die Priorisierung auf vier Tabellenblätter auf.

  1. Tabellenblatt eins sammelt die Kriterien. Falls zu einem Kriterium eine Erklärung notwendig ist, tragen wir sie dort gleich mit ein.
  2. Das zweite Tabellenblatt enthält die Bewertungsmatrix. Sie wird aus den Kriterien erstellt. Auf dem Tabellenblatt gibt es einen Button, um die Kriterien zu aktualisieren. In die Matrix können manuell die Bewertungen eingetragen werden. Nach Ende kann auf einen Button Ergebnisliste geklickt werden, um eine Reihenfolgen-Liste zu generieren.
  3. Im dritten Tabellenblatt wird eine Workshop-Abfrage ermöglicht. Step-by-step wird jede Abfrage einzeln angezeigt und kann über Buttons klar und einfach bewertet werden. Falls notwendig, lassen sich auch Erklärungen zu den Kriterien erfassen.
  4. Nummer vier stellt die Ergebnisliste der Kriterien sortiert dar.

Umsetzung

Tabellenblatt 1: Kriterien

Eingabe von Kriterien und deren Beschreibung als Liste
Eingabe von Kriterien und deren Beschreibung als Liste

Dieses Tabellenblatt sammelt alle Kriterien und deren Beschreibung. Um zu wissen, wo die Liste beginnt, werden im VBA Quellcode die Startzeile, die Spaltennummer von Kriterien und Beschreibungen als eine Konstante hinterlegt.

Const KRITERIUM_START_ZEILE = 5
Const KRITERIUM_SPALTE = 2
Const KRITERIUMBEMERKUNG_SPALTE = 4

Das was hier auch schon. Der Rest ist Formatierung.

Tabellenblatt 2: Matrix

Matrix der Kriterien für den paarweisen Vergleich
Matrix der Kriterien für den paarweisen Vergleich

Dieses Sheet wird fast vollständig automatisch erstellt. In der obersten Zeile stehen die notwendigen Buttons dazu.

Sie haben die Wahl, ob die Matrix neu aufgebaut wird – dann wird auch eine evtl. vorhandene Bewertung gelöscht.

Sub MatrixErstellenUndInhaltLöschen()
  If MsgBox("Wollen Sie die Matrix neu aufbauen? Dabei werden auch evtl. vorhadene Abfrageergebnisse gelöscht.", vbYesNoCancel, "Matrix neu aufbauen?") <> vbYes Then Exit Sub
  Application.ScreenUpdating = False
  Call MatrixLöschen
  Call MatrixAktualisieren
  Application.ScreenUpdating = True
  
  Call AbfrageNächsteFrage(False)
End Sub

Private Sub MatrixLöschen()
Dim z As Integer
Dim s As Integer
Dim k As Integer
Dim w As String

'bisherige Matrix löschen, wenn Sie größer ist als die bisherige
  k = KriterienAnzahl()
  'beschriebenene Zellen ermitteln
  z = Sheets("Matrix").UsedRange.SpecialCells(xlCellTypeLastCell).Row
  s = Sheets("Matrix").UsedRange.SpecialCells(xlCellTypeLastCell).Column
  'Bereiche löschen: nach rechts
  With Sheets("Matrix").Range(Sheets("Matrix").Cells(MATRIX_START_ZEILE - 1, MATRIX_START_SPALTE + k), Sheets("Matrix").Cells(z, s))
    .ClearContents
    .ClearComments
  End With
  'Bereiche löschen: nach unten
  With Sheets("Matrix").Range(Sheets("Matrix").Cells(MATRIX_START_ZEILE + k, 1), Sheets("Matrix").Cells(z, s))
    .ClearContents
    .ClearComments
  End With
  
  'Format von Spalte B auf leere Bereiche übertragen
  Sheets("Matrix").Range("B:B").Copy
  With Sheets("Matrix").Range(Sheets("Matrix").Columns(MATRIX_START_SPALTE + k), Sheets("Matrix").Columns(s))
    .Parent.Activate
    .PasteSpecial xlPasteFormats
  End With

  'Format von Zeile 2 auf leere Bereiche übertragen
  Sheets("Matrix").Range("2:2").Copy
  With Sheets("Matrix").Range(Rows(MATRIX_START_ZEILE + k), Rows(z))
    .Parent.Activate
    .PasteSpecial xlPasteFormats
  End With
  
  'Format für Matrix auf Spalten übertragen
  Sheets("Matrix").Range(Columns(MATRIX_START_SPALTE + 2), Columns(MATRIX_START_SPALTE + 2)).Copy
  With Sheets("Matrix").Range(Columns(MATRIX_START_SPALTE + 3), Columns(MATRIX_START_SPALTE + k - 1))
    .Parent.Activate
    .PasteSpecial xlPasteFormats
  End With
  
  'Format für Matrix auf Zeilen übertragen
  Sheets("Matrix").Range(Rows(MATRIX_START_ZEILE + 2), Rows(MATRIX_START_ZEILE + 2)).Copy
  With Sheets("Matrix").Range(Rows(MATRIX_START_ZEILE + 3), Rows(MATRIX_START_ZEILE + k - 1))
    .Parent.Activate
    .PasteSpecial xlPasteFormats
  End With

  z = 0
  s = k
  Do
    s = s + 1
    If s > k Then
      z = z + 1
      s = z
    Else
      Sheets("Matrix").Cells(MATRIX_START_ZEILE + z - 1, MATRIX_START_SPALTE + s - 1) = ""
      Sheets("Matrix").Cells(MATRIX_START_ZEILE + 1, MATRIX_START_SPALTE + 2).Copy
      With Sheets("Matrix").Cells(MATRIX_START_ZEILE + z - 1, MATRIX_START_SPALTE + s - 1)
        .Parent.Activate
        .PasteSpecial xlPasteFormats
      End With
      
      Sheets("Matrix").Cells(MATRIX_START_ZEILE + s - 1, MATRIX_START_SPALTE + z - 1).FormulaLocal = "=2-" & Sheets("matrix").Cells(MATRIX_START_ZEILE + z - 1, MATRIX_START_SPALTE + s - 1).Address(False, False)
      Sheets("Matrix").Cells(MATRIX_START_ZEILE + 2, MATRIX_START_SPALTE + 1).Copy
      With Sheets("Matrix").Cells(MATRIX_START_ZEILE + s - 1, MATRIX_START_SPALTE + z - 1)
        .Parent.Activate
        .PasteSpecial xlPasteFormats
      End With
    End If
  Loop Until (z = k And s = k)
  Application.CutCopyMode = False
End Sub

Falls Sie nur ein Kriterium nachträglich eintippen und eine Bewertung schon begonnen haben, gibt es den zweiten Button zum Aktualisieren der Matrix.

Mit Anklicken erweitern sich die Kriterien, die Bewertung bleibt bestehen.

Das funktioniert natürlich nur sinnvoll, wenn sich keine der Kriterien in der Reihenfolge verschoben haben.

Sub MatrixAktualisieren()
Dim i As Integer
Dim k As Integer
Dim kriterium As String
Dim bemerkung As String

  k = KriterienAnzahl()
  For i = 1 To k
    kriterium = Sheets("Kriterien").Cells(KRITERIUM_START_ZEILE + i - 1, KRITERIUM_SPALTE)
    bemerkung = Sheets("Kriterien").Cells(KRITERIUM_START_ZEILE + i - 1, KRITERIUMBEMERKUNG_SPALTE)
    If kriterium <> "" Then
      Call KriteriumEinfügen(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE - 1, kriterium, bemerkung)
      Call KriteriumEinfügen(MATRIX_START_ZEILE - 1, MATRIX_START_SPALTE + i - 1, kriterium, bemerkung)
    End If
    
    'Formeln eintragen
    Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE - 2).FormulaLocal = "=SUMME(" _
      & Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE).Address(False, False) & ":" _
      & Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE + k - 1).Address(False, False) & ")"
      
    Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, 1).FormulaLocal = "=RANG(" _
      & Sheets("matrix").Cells(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE - 2).Address(False, False) & ";" _
      & Sheets("matrix").Cells(MATRIX_START_ZEILE, MATRIX_START_SPALTE - 2).Address(False, False) & ":" _
      & Sheets("matrix").Cells(MATRIX_START_ZEILE + k - 1, MATRIX_START_SPALTE - 2).Address(False, False) & ")"
  Next
  
End Sub


Private Sub KriteriumEinfügen(zeile As Integer, spalte As Integer, kriterium As String, bemerkung As String)
  Sheets("Matrix").Cells(zeile, spalte) = kriterium
  If Not Sheets("Matrix").Cells(zeile, spalte).Comment Is Nothing Then Sheets("Matrix").Cells(zeile, spalte).Comment.Delete
  If bemerkung <> "" Then
    Sheets("Matrix").Cells(zeile, spalte).AddComment bemerkung
  End If
  Exit Sub
  
  Sheets("Matrix").Cells(MATRIX_START_ZEILE - 1, 1).Copy
  Sheets("Matrix").Cells(zeile, spalte).Parent.Activate
  Sheets("Matrix").Cells(zeile, spalte).PasteSpecial xlPasteFormats
  Application.CutCopyMode = False
End Sub

Haben Sie die Bewertung direkt in der Matrix durchgeführt, reicht ein dritter Klick auf den Button „Ergebnisliste erstellen“. Das führt Sie direkt auf das entsprechende Tabellenblatt.

Tabellenblatt 3: Abfrage

Dialog zur Steuerung des paarweisen Vergleichs im Workshop
Dialog zur Steuerung des paarweisen Vergleichs im Workshop

Wenn Sie im Workshop sind, ist es am übersichtlichsten den Vergleich als Abfrage per Dialog zu starten. Das realisieren wir auf diesem Tabellenblatt.

Um den Prozess zu beginnen, brauchen wir zwei Buttons. Mit einem Button fangen wir mit der nächsten Frage an. Bei dem anderen passiert genau dasselbe, vorher löschen wir aber eine bereits durchgeführte Bewertung.

Im ersten Fall ermitteln wir zuerst, welches der nächste Vergleich ist. So können wir die Datei auch speichern und zu einem anderen Zeitpunkt mit der Bewertung weitermachen. Dafür lassen durchlaufen wir die Zeilen und Spalten der Matrix, beginnen aber nicht mit Spalte 1, sondern mit der Spalte der Zeilennummer.

Enthält die Zelle keinen Wert (““), dann haben wir den nächsten Vergleich gefunden und speichern die Position in den globalen Variable AbfrageZeile und AbfrageSpalte. Finden wir keine leere Zelle, dann ist der Vergleich schon abgeschlossen und wir geben eine Meldung dafür aus.

Mit den gefundenen Werten für Zeile und Spalte suchen wir die beiden entsprechenden Kriterien aus der Matrix und schreiben sie in die Zellen im Dialog. Die beiden Zellen haben dafür einen Namen bekommen und heißen Kriterium1 und Kriterium2.

Damit die Workshopteilnehmer auch wissen, was noch vor Ihnen liegt, zeigen wir an viele Vergleiche noch durchgeführt werden müssen und wie viele schon erledigt sind.

Jetzt sind die Teilnehmer an der Reihe und können auf einen der drei Buttons klicken. Dabei wird jeweils der entsprechende Wert in die Matrix geschrieben:

  • Kriterium 1 ist wichtiger als Kriterium 2: Wert 2
  • Kriterien sind gleich wichtig: Wert 1
  • Kriterium 2 ist wichtiger als Kriterium 1: Wert 0
Sub AbfrageNeustart()
  If MsgBox("Wollen Sie die Ergebnisse löschen und neustarten?", vbYesNoCancel, "Neustarten?") <> vbYes Then Exit Sub

  Application.ScreenUpdating = False
  Call MatrixLöschen
  Application.ScreenUpdating = True
  
  Call AbfrageNächsteFrage
End Sub

Sub AbfrageNächsteFrage(Optional AufSeiteWechseln As Boolean = True)
Dim z As Integer
Dim s As Integer
Dim k As Integer
Dim w As String
Dim i As Integer

  If AufSeiteWechseln = True Then Sheets("Abfrage").Select
  
  'letzte Position finden
  k = KriterienAnzahl()
  z = 1
  s = 1
  AbfrageZeile = 0
  AbfrageSpalte = 0
  i = 0
  Do
    s = s + 1
    If s > k Then
      z = z + 1
      s = z
    Else
      i = i + 1
      w = Sheets("Matrix").Cells(MATRIX_START_ZEILE + z - 1, MATRIX_START_SPALTE + s - 1)
      If w = "" Then 'gefunden
        AbfrageZeile = z
        AbfrageSpalte = s
      End If
    End If
  Loop Until (AbfrageSpalte <> 0 And AbfrageZeile <> 0) Or (z = k And s = k)
  If AbfrageZeile = 0 And AbfrageSpalte = 0 Then
    Call ErgebnislisteErstellen
    If MsgBox("Die Bewertung ist bereits vollständig durchgeführt. Wollen Sie zur Ergebnistabelle wechseln?", vbYesNoCancel, "Bewertung ist beendet") = vbYes Then
      Sheets("Ergebnisreihenfolge").Select
    End If
    Exit Sub
  End If
  
  'Kriterien anzeigen
  Sheets("Abfrage").Range("Kriterium1") = FindeKriterium(AbfrageZeile)
  Sheets("Abfrage").Range("Kriterium2") = FindeKriterium(AbfrageSpalte)
  Sheets("Abfrage").Range("Bemerkung1") = FindeBemerkung(AbfrageZeile)
  Sheets("Abfrage").Range("Bemerkung2") = FindeBemerkung(AbfrageSpalte)
  
  'Fortschritt anzeigen
  Sheets("Abfrage").Range("fortschritt") = "Vergleich " & i & " von " & (k * k - k) / 2
End Sub

Sub AbfrageZeileIstWichtiger()
  If AbfrageZeile <> 0 And AbfrageSpalte <> 0 Then
    Sheets("Matrix").Cells(MATRIX_START_ZEILE + AbfrageZeile - 1, MATRIX_START_SPALTE + AbfrageSpalte - 1) = 2
  End If
  Call AbfrageNächsteFrage
End Sub

Sub AbfrageSpalteIstWichtiger()
  If AbfrageZeile <> 0 And AbfrageSpalte <> 0 Then
    Sheets("Matrix").Cells(MATRIX_START_ZEILE + AbfrageZeile - 1, MATRIX_START_SPALTE + AbfrageSpalte - 1) = 0
  End If
  Call AbfrageNächsteFrage
End Sub

Sub AbfrageGleichWichtig()
  If AbfrageZeile <> 0 And AbfrageSpalte <> 0 Then
    Sheets("Matrix").Cells(MATRIX_START_ZEILE + AbfrageZeile - 1, MATRIX_START_SPALTE + AbfrageSpalte - 1) = 1
  End If
  Call AbfrageNächsteFrage
End Sub

Tabellenblatt 4: Ergebnisreihenfolge

Automatische Ergebnisreihenfolge des paarweisen Vergleichs mit Rang und Punkten
Automatische Ergebnisreihenfolge des paarweisen Vergleichs mit Rang und Punkten

Auf der Ergebnisseite befassen wir uns mit der ermittelten Reihenfolge. Wir holen uns den Rang und die Punkte aus der Matrix und sortieren sie auf diesem Tabellenblatt.

Sub ErgebnislisteErstellen()
Dim k As Integer
Dim i As Integer
Dim j As Integer

  i = Sheets("Ergebnisreihenfolge").UsedRange.SpecialCells(xlCellTypeLastCell).Row
  Sheets("Ergebnisreihenfolge").Range(Sheets("Ergebnisreihenfolge").Cells(4, 1), Sheets("Ergebnisreihenfolge").Cells(i, 3)).ClearContents

  k = KriterienAnzahl()
  For i = 1 To k
    Sheets("Ergebnisreihenfolge").Cells(i + 3, 1) = Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, 1)
    Sheets("Ergebnisreihenfolge").Cells(i + 3, 2) = Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE - 2)
    Sheets("Ergebnisreihenfolge").Cells(i + 3, 3) = Sheets("Matrix").Cells(MATRIX_START_ZEILE + i - 1, MATRIX_START_SPALTE - 1)
  Next
    
  With Sheets("Ergebnisreihenfolge").Sort
    .SortFields.Clear
    .SortFields.Add Key:=Range(Cells(4, 1), Cells(4 + k, 1)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    .SetRange Range(Cells(4, 1), Cells(4 + k, 3))
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .Apply
  End With
End Sub

Ein besserer Workshop

Wenn Sie jetzt in einen Workshop gehen und Kriterien priorisieren, läuft es viel entspannter ab.

Das Sammeln der Kriterien erfolgt gleich zusammen mit einer passenden Erklärung – völlig egal wie viele Kriterien es auch werden.

Diese Beschreibung sollten Sie sich auch auf keinen Fall einsparen. Wenn am Projektende doch eine Meinungsverschiedenheit herrscht, können Sie nachschauen, was damals unter dem Kriterium verstanden wurde. Das hilft immer.

Um die Bewertungsmatrix darauf aufzubauen und für eine Eingabe vorzubereiten, reicht jetzt auch ein Klick aus.

Automatische Matrix-Erstellung des paarweisen Vergleichs mit einem Klick
Automatische Matrix-Erstellung des paarweisen Vergleichs mit einem Klick

Jetzt haben Sie die Wahl. Was passt besser? Ein direktes Eintragen in die Tabelle?

Zur Unterstützung gibt es Hilfskommentare zu Kriterien, wenn Bemerkungen eingegeben wurden. Oder eignet sich ein Dialog mit geführter Abfrage besser? Das passt auf jeden Beamer und kann beliebig vergrößert werden.

In beiden Fällen führt das zu einer Ergebnisreihenfolge. Entweder nach Anklicken auf „Ergebnisliste erstellen“ oder automatisch bei der Dialog-geführten Abfrage.

Probieren Sie es einfach aus. Sie können die Excel-Datei mit einem Beispiel downloaden. Und wenn der Workshop trotzdem zu lange dauert, hilft vielleicht der Workshop Timer.

Viel Spaß im Workshop!

Download

Excel-Vorlage mit Makros als Zip-Datei

Excel-Makros und das Internet: https://techpluscode.de/excel-makros-und-das-internet/

Links

Paarvergleich auf Wikipedia: https://de.wikipedia.org/wiki/Paarvergleich

Nutzwertanalyse auf Wikipedia: https://de.wikipedia.org/wiki/Nutzwertanalyse

Artikel Besprechungszeit visualisieren

Zusammenfassung der Möglichkeiten als Präsentation

Dieser Beitrag hat 2 Kommentare

  1. Christian

    Hallo Thomas,
    das ist ja eine sehr gelungene Umsetzung des Themas „Paarweiser Vergleich“! Genau was ich mir erhofft hatte an Unterstützung. Vielen Dank!
    Einzige Anmerkung: Wenn ich ein Kriterium hinzufüge, dann kann ich dieses per „Kriterien aktualisieren“ auch in die Matrix aufnehmen, nur die Formatierung der neuen Spalte/Zeile wird bei mir nicht nachgezogen.

    VG, Christian

  2. Thomas Angielsky

    Hallo Christian,
    danke für dein Feedback. Schön wenn es dir hilft.
    Mit deiner Beschreibung hast du recht. „Kriterien aktualisieren“ ist nur dazu gedacht, Texte zu aktualisieren.
    Wenn neue Merkmale dazukommen, oder auch rausfallen, löst das nur „Bewertungsmatrix neu aufbauen“ richtig.

    Gruß
    Thomas

Kommentar verfassen