Text ein- und ausblenden

Im Abschnitt »Miscellaneous« befindet sich die Zelle HideText. Wie der Name sagt, kann darüber der Text ausgeblendet werden. Normalerweise ist der Wert dieser Zelle FALSE. Sollte man nun beispielsweise über eine Aktionszelle darauf zugreifen, so könnte man mit

=SETF(„HideText“,TRUE)

Den Text ausblenden. Oder besser:

=SETF(„HideText“,NOT(HideText))

So wird der Text abwechselnd ein- oder ausgeblendet. Dies kann im Kontextmenü, das heißt in der Zelle Menu angezeigt werden:

=IF(HideText,“Text einblenden“,“Text ausblenden“)

Ein Bug im ShapeSheet?

Sehr herstaunlich. Wenn man im ShapesSheet eines Shapes in Visio einen Abschnitt „Action“ einfügt und in die Zelle „Menu“ einen Text einträgt, wird dieser im Kontextmenü angezeigt. So weit so gut.
Früher (?) konnte man in der Zelle „TagName“ einen Kommentar eintragen, der dann in der Statuszeile angezeigt wurde. Jetzt (?) unter Windows 10 (?) in Visio 2016 (?) verschwindet dieser Kontextmenüeintrag. Ein Bug?

Dynamische Datenfelder

Letzte Woche wollte ein Teilnehmer in der Visio-Schulung wissen, wie man dynamische Daten erzeugen kann. Also: wenn in den Daten eines Shapes eine Information ausgewählt wird, sollen weitere Informationen sichtbar sein. Bei der Wahl eines anderen Eintrags sollen wiederum andere Infos ausfüllbar sein.
Nun: Die Daten kann man leicht in Visio über „Daten / Daten definieren“ erzeugen.
Dann muss das ShapeSheet herhalten: Dort wird in der Zelle eine Formel eingetragen. Es funktioniert nicht:
=Prop.Geldfluss=“Ausgaben“
oder mit einer WENN-Verzweigung:
=If(Prop.Geldfluss=“Ausgaben“,True,False)
Man muss die Funktion STRSAME bemühen:
=STRSAME(Prop.Geldfluss,“Ausgaben“)
Sie vergleicht zwei Texte und liefert True oder False.
Und damit hat man die dynamischen Daten:

Wir bauen uns einen Schrank – eigene Shapes mit Visio estellen

Genauer: Die Aufgabe lautet: aus einer DWG-Zeichnung soll in Visio eine Zeichnung (ein Schrank) nachgebaut werden.

Die DWG-Zeichnung wird importiert.
Mit Entsetzen stelle ich fest, dass sie unbrauchbar ist – sie besteht aus sehr vielen einzelnen Linien.
Also neu zeichnen. Ich markiere die Linien, gruppiere sie und schütze sie.
Färbe die Linien ein, damit ich sie besser sehe. Danach male ich mit dem Rechteck-, Linien- und Ellipsenwerkzeug die Linien nach. Die Wiederholfunktion [F4] hilft dabei; ebenso Hilfslinien und das Fenster „Größe und Position“.
Die fertigen Shapes werden gruppiert, geschützt, mit Daten versehen, auf einen Layer gelegt und mit Verbindungspunkten versehen.
Damit die Punkte äquidistant sind, greife ich auf das ShapeSheet zu und ändere dort die Daten. Ebenso wird ein Modul gebaut, das – als Linie in den Verbindungspunkten einrastet.
Beides wird in einer Schablone gespeichert.
Was sich hier so leicht liest – dafür habe ich zirka drei Stunden benötigt. Ein bisschen Feinarbeit.

Zweig mit mehr als sechs Ästen

In der letzten Visio-Schulung beschwerte sich ein Teilnehmer über das Shape „Zweige schräg“. Dort könne man nur bis zu sechs Zweige herausziehen. Er benötigt allerdings acht Linien.
Kein Problem: Im ShapeSheet muss man nur zwei weitere Zeilen für die Controls (die gelben Steuerelemente) einfügen und die Formeln von oben nach unten kopieren.
Außerdem muss man zwei neue Abschnitte einfügen; den Zeilentyp auf MoveTo und LineTo ändern. Bei beiden Abschnitten wird jeweils eine neue Zeile eingefügt. Die Formeln können von Abschnitt Geometrie7 nach geometrie8 und Geometrie9 kopiert werden. Die Formeln müssen angepasst werden – so wird beispielsweise aus:
Width+ABS(Controls.Row_6.Y-Height/2)/Scratch.A1
die neue Formel:
Width+ABS(Controls.Row_7.Y-Height/2)/Scratch.A1
bzw.
Width+ABS(Controls.Row_8.Y-Height/2)/Scratch.A1
Ein Test – und fertig ist der neue Zweig. Er kann in einer Schablone gespeichert werden.

Multishape

Das Bodenshape und das Shape „Schuss“
===================================
Und so habe ich das Shape erstellt:
Ich ziehe die sieben Shapes auf das Zeichenblatt und sehe sie mir an:

Es fällt auf, dass einige der Shapes gruppiert sind. Da es schwierig ist eine Gruppe auszublenden (weil das Gruppenshape auf den einzelnen Shapes liegen und die Gruppe selbst keine Linie und Füllung hat). Also hebe ich so lange die Gruppen auf, bis die Shapes „flach“ sind:

Da ich nun einzelne Shapes habe, werden sie über Entwicklertools / Vorgänge / Verbinden zu einem Shape verbunden.
Die sieben Shapes werden mit Ausrichten ([F8]) übereinander gelegt und erneut gruppiert.
Im ShapeSheet der Gruppe füge ich einen Abschnitt „userdefinied cell“ ein. Die Zeile heißt „Boden“.
Ich fügen einen Abschnitt „Action“ ein, der sieben Zeilen erhält (Einfügen / Zeilen). Die Menüs lauten: =“Füllkörper unregelmäßig“, =“Kaskadeneinbauten“, =“Füllkörper regelmäßig“, … In den Actions baue ich die Formel ein:
SETF(„User.Boden“,1)
SETF(„User.Boden“,2)
SETF(„User.Boden“,3) usw.
Das heißt: in die Zelle User.Boden wird der Wert 1 oder 2 oder 3 … hineingeschrieben – je nachdem, welcher Eintrag im Kontextmenü ausgewählt wurde. Schließlich wird noch in der Spalte Checked die Formel =User.Boden=1 oder =User.Boden=2 oder =User.Boden=3 … eingetragen. Das heißt: steht in der Zelle User.Boden der Wert 1, dann liefert =User.Boden=1 den Wert True. Die Folge: der Haken wird gesetzt.

Ich sehe unter Entwicklertools / Shapename nach, wie das Shape heißt – hier: Sheet.548. Die Gruppe wird geöffnet (über das Kontextmenü). Achtung: nicht Gruppe aufheben – denn an der Gruppe steckt ja das selbstgebaute Kontextmenü:

Die einzelnen Mitglieder der Gruppe werden markiert. Das ShapeSheet wird angezeigt. Dort wird nun in die Zelle NoShow im Geometrieabschnitt eingetragen:
Sheet.548!User.Boden<>6
Das heißt: wenn in der Zelle User.Boden der Gruppe NICHT der Wert 6 (hier: Glockenboden) steht, liefert die Formel Sheet.548!User.Boden<>6 den Wert True und NoShow = True bedeutet: dieses Shape wird nicht angezeigt.

Das muss man für alle sieben Mitgliedsshapes machen. Achtung: einige der Shapes haben mehrere Geometrieabschnitte – man muss in jedem Abschnitt diese Formel eintragen.
Das Shape ist fertig – in Visio kann man über Entwicklertools / Verhalten einschalten: „Nur Gruppe“, damit der Anwender nicht fälschlicherweise in die Gruppe hineinklickt.

Dieses Shape habe ich in den Schuss eingebaut. Ich habe den Schuss aus der Schablone gezogen, die Gruppierung aufgehoben. Erneut gruppiert. Nun heißt die Gruppe „Sheet.100“ und nicht „Schuss mit EBH (Packung)“ – die Leerzeichen und die Sonderzeichen sind unglücklich. An die Gruppe füge ich die Daten an, wobei die Liste der Füllung die gleiche Reihenfolge hat, wie mein Boden-Shape:
leer;Füllkörper unregelm.;Kaskade;Füllkörper regelm.;Siebboden;Ventilboden;Glockenboden;Packung

Das Shape erhält im ShapeSheet zwei benutzerdefinierte Zellen:
User.Boden und User.Bodennummer
In User.Boden wird der ausgewählte Text der Shapedaten wiederholt:
=FIND(Prop.Füllung,Prop.Füllung.Format)
In User.Bodennummer wird die Nummer des Eintrags bestimmt – ich suche also die Position des Textes in der Liste:
=IF(User.Boden=1,0,IF(User.Boden=6,1,IF(User.Boden=27,2,IF(User.Boden=35,3,IF(User.Boden=54,4,IF(User.Boden=64,5,IF(User.Boden=76,6,7)))))))
Diese Formel liefert 0 bei „leer“, 1, bei „Füllkörper unregelm.“, 2 bei „Kaskade“ usw.
Das Bodenshape wird in die Gruppe eingefügt. Dort verweist nun die Zelle User.Boden des inneren Shapes auf die Zelle des äußeren Gruppenshapes.
=Sheet.100!User.BodenNummer
Die Gruppe kann über Verhalten geschützt werden.

Das fertige Shape:

Länge einer Linie: LengthIU

Folgende Zeilen Code berechnen die Länge einer Linie:

Sub LängeAnzeigen()

Const ShapeLinieAnzeigen As String = „Dynamischer Verbinder“

Dim i As Long

 

For i = 1 To ActivePage.Shapes.Count

If ActivePage.Shapes(i).Name Like „*“ & ShapeLinieAnzeigen & „*“ Then

ActivePage.Shapes(i).Text = Format(Application.ConvertResult(ActivePage.Shapes(i).LengthIU, „in“, „mm“), „0.00“)

End If

Next i

End Sub

Erklärung: Die Eigenschaft LengthIU liefert die Länge – allerdings in inch. Sie muss in cm oder m umgewandelt werden. Dies kann die Funktion Application.ConvertResult. Und dieses Ergebnis wird mit der Funktion Format auf zwei Stellen nach dem Komma formatiert: „0.00“. Und diese Ergebnis wird auf das Shape als Text geschrieben. Auf welches Shape?

 

Eine Schleife durchläuft alle Shapes und schreibt den Text jeweils auf die „Dynamischen Verbinder“.

 

Für Ihre Fluchtwege können Sie den Code anpassen. Erstellen Sie ein Mastershape „Fluchtweg“ in einer Schablone, ziehen es aufs Zeichenblatt (formatieren es, machen es transparent …). In Entwicklertools / Shape-Name befindet sich ja der Name – beispielsweise „Fluchweg“ oder „Fluchtweg.24“ Wenn die Konstante in „Fluchtweg“ geändert wurde, wenn Sie die Formatierung auf „m“ ändern, dann liefert der folgende Code:

Sub LängeAnzeigen()

Const ShapeLinieAnzeigen As String = „Fluchtweg“

Dim i As Long

 

For i = 1 To ActivePage.Shapes.Count

If ActivePage.Shapes(i).Name Like „*“ & ShapeLinieAnzeigen & „*“ Then

ActivePage.Shapes(i).Text = Format(Application.ConvertResult(ActivePage.Shapes(i).LengthIU, „in“, „m“), „0.00“)

End If

Next i

End Sub

 

die Länge des Fluchtwegs (hier: 77,13 – schließlich muss man noch nachsehen, wenn beim Billard gewonnen hat, bevor man in die Raucherecke geht)

Wechseln Sie zu VBA. Erstellen dort ein Modul. Und fügen den Code von oben ein. Sie können diese Datei als VSDM speichern – oder die Vorlage als VSTM (Mit Makros!). Das Programm wird von Visio über Ansicht / Makros ausgeführt.

Ein weiterer Bug – im ShapeSheet

Eigentlich mag ich Visio sehr gerne. Cleveres Programm! Allerdings finde ich in der Version 2016 leider sehr viele Bugs. Beispielsweise folgender:
Ich nehme Bezug im ShapeSheet auf eine Zelle des Abschnitts „Daten“. Beispielsweise so:
=User.Dateinummer&“-„&Prop.ShapeNumber
Ich ändere den Wert der Zelle, auf den Bezug genommen wird. Visio löscht mir die Zeilen. So kann ich nicht arbeiten. Damit ist eine Modifikation des Assistenten „Shapes nummerieren“ hinfällig. Schade!

Suchen

Die Tastenkombination Strg + F zum Suchen ist hinlänglich bekannt. Sie funktioniert in allen Anwendungsprogrammen, die ich kenne, in allen Browsern, pdf-Programmen (allerdings leider nicht in Outlook). Aber in Visio.
Meistens werden Sie dort nach bestimmten Texten suchen.
Für die Programmierung ist es enorm wichtig, dass man auch nach Shape-Namen suchen kann. Also beispielsweise das Shape Sheet.18727. Der Name wird durch den (VBA-)Code ermittelt.