MS-Project ist ein sehr mächtiges Programm. Was aber merkwürdigerweise nicht geht, ist es, zusammenhängende Vorgänge einzublenden. Insbesondere wenn zwischen einzelnen Vorgängen viele Zeilen liegen, ist die Übersicht nicht immer gegeben. Die Filteroptionen versagen an dieser Stelle leider.
Der vorliegende Code beseitigt das Dilemma. Ich zeige hier zwei Makros. Das eine filtert und zeigt den ausgewählten Vorgang mit seinen Nachfolgern, das andere löscht den Filter.
Ich habe den fertigen Code als "Vorgaenge.bas" (erst entzippen) zum Download am Ende dieses Tutorials beigefügt. Sie können diese Datei direkt per Datei Import (rechte Maustaste auf "ThisProject (Global.MPT)") laden. Sie erhalten dann ein Modul mit dem Namen "Vorgaenge". Wenn Sie das in "Global.MPT" machen und anschließend auf das Speichern-Symbol oben links klicken, steht Ihnen fortan dieser Code immer zur Verfügung. Sie können nun auch beispielsweise die beiden Makros über die Schnellzugriffsleiste oder per Menü ansprechen. Wie das geht, können Sie unter dem folgenden Link nachlesen.
Für Nichtprogrammierer habe ich hier ein kleines Tutorial, wo man diesen Code hinkopieren oder programmieren muss:
https://www.time4joomla.de/ms-excel/314-fuer-nicht-programmierer-wie-und-wo-wird-vba-untergebracht.html
Benjamin Dargatz hat einen Fehler in meinem Code gefunden und war so nett, die verbesserte Version zur Verfügung zu stellen. Fürs Suchen, Finden und Zusenden einen lieben Dank!
Der Code mit Erklärung
Sub VorgangZusammenFassen()
' ---------------------------------------------------
' Axel Tüting - www.time4mambo.de / modifiziert by Benjamin Dargatz
' ---------------------------------------------------
Dim Vorgang As Task
Dim AktuellerVorgang As Task
' Erstellen und Bearbeiten des Filters "Zusammenhängende Vorgänge"
FilterEdit Name:="Zusammenhängende Vorgänge", TaskFilter:=True, Create:=True, OverwriteExisting:=True, FieldName:="Text30", Test:="Gleich", Value:="V", ShowInMenu:=True, ShowSummaryTasks:=False
FilterEdit Name:="Zusammenhängende Vorgänge", TaskFilter:=True, FieldName:="", NewFieldName:="Text30", Test:="Gleich", Value:="N", Operation:="Oder", ShowSummaryTasks:=False
' Erfasst die Nachfolger zum ausgewählten Vorgang
HighlightSuccessors Set:=True
HighlightPredecessors Set:=True
' Überprüfen, ob eine Zelle aktiv ist und ob sie eine Aufgabe enthält
If Not Application.ActiveCell Is Nothing Then
Set AktuellerVorgang = Application.ActiveCell.Task
End If
' Schreibt in Text30 ein N oder V für Nachfolger/Vorgänger rein
' Wobei das V der ausgewählte Vorgang ist
For Each Vorgang In ActiveProject.Tasks
If Not Vorgang Is Nothing Then
If Not AktuellerVorgang Is Nothing And Vorgang.ID = AktuellerVorgang.ID Then
Vorgang.Text30 = "V"
ElseIf Vorgang.PathSuccessor Then
Vorgang.Text30 = "N"
ElseIf Vorgang.PathPredecessor Then
Vorgang.Text30 = "N"
End If
End If
Next Vorgang
' Ruft den benutzerdefinierten Filter auf, der nach Text30 entsprechend filtert
FilterApply Name:="Zusammenhängende Vorgänge"
End Sub
Wenn Sie wieder alle Vorgänge sehen möchten, rufen Sie dieses Makro auf. Zunächst wird der Filter wieder zurückgesetzt/gelöscht mit FilterClear
. Und danach die farbliche Markierung der Vorgänge mit RemoveHighlight
gelöscht/zurückgesetzt.
Mit diesen beiden Zeilen wählen Sie zunächst die gesamte Spalte "Text30" aus, markieren diese und löschen den Inhalt (also "V" und "N"):
SelectTaskColumn Column:="Text30"
EditClear Contents:=True
Zu guter Letzt wird mit FindEx
der Vorgang gesucht, den Sie ursprünglich markiert hatten und der Vorgangsname wird selektioniert.
Am Rande: Mit Field:="Name"
wird die Spalte "Vorgangsname" angesprochen.
Den Filter wieder zurücksetzen und alle Vorgänge sichtbar machen:
Sub Zuruecksetzen()
On Error Resume Next
'Alle Filter entfernen und die Vorgänge wieder alle anzeigen
FilterClear
RemoveHighlight
'Inhalt von Text30 löschen (Text30 MUSS eingeblendet sein!)
SelectTaskColumn Column:="Text30"
EditClear Contents:=True
'Da vorher die ganze Spalte selektioniert wurde,
'wird nun wieder auf den Vorgangsnamen gesprungen, bzw. selektioniert
FindEx Field:="Name", Test:="Enthält", Value:=VorgangsName, Next:=True, MatchCase:=False, SearchAllFields:=False
End Sub