Mit der Funktion Shapetext kann man Texte zwischen zwei Shapes verknüpfen. Man muss noch nicht einmal das ShapeSheet bemühen – es funktioniert über Einfügen / Feld. Man muss lediglich den Namen des anderen Quell-Shapes ermitteln (Entwicklertools / Shape-Name). Und dann eingeben:
=SHAPETEXT(Sheet.xx!TheText)
Es funktioniert auch blattübergreifend.
Kategorie: Blog: Der Visio Guru
Nicht druckbar und nicht sichtbar
Schöne Frage in der heutigen Visio-Schulung: Ein Teilnehmer zeigt mir eine Tabelle, die aus Rechtecks-Shapes bestehen. Damit diese Felder als Pflichtfelder gekennzeichnet sind, wurde ein großes, farbiges Rechteck unterlegt. Dieses wird auf nicht druckbar gesetzt (Entwicklertools / Verhalten). Die darüberliegenden Rechtecke sind ohne Füllfarbe formatiert. Ärgerlicherweise klickt man nun durch sie hindurch. Sie sind sehr schwer auszuwählen.
Die Lösung: man formatiert die Shapes mit einer beliebigen Füllfarbe und setzt die Transparenz auf 100% hoch. Und schon sind sie leichter zu selektieren.
Esc funktioniert auch
Bemaßungslinien
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.
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
Ansichten …
Sehr geehrter Herr Martin,
ich habe ein Anliegen bzgl. eines Fehlers der Bemaßungsshapes in Visio, den Sie in dem angehängten Screenshot sehen können.
Aufgetreten ist er bei mir durch einen Computerwechsel, allerdings hatten meine Kollegen diesen Fehler auch schon einmal, und er taucht immer auf wenn ich rein- oder rauszoome sowie den Drucker auswähle.
Wie kann ich nun diesen Fehler beheben?
Bitte um Rückmeldung und vielen Dank für Ihre Zusammenarbeit.
Ich wünsche Ihnen noch einen angenehmen Tag.
#####
Sehr geehrter Herr J.,
Sie meinen die Länge „26.350,15“, die übrigens auch auf dem Kühlregal steht – nicht nur auf dem Bemaßungsshape.
Wird diese Zahl auf einem anderen Rechner korrekt angezeigt? Wenn ja, dann schauen Sie einmal bitte in den „Seite einrichten“ (dort: Zeichenblatteigenschaften) nach, ob Millimeter eingestellt sind. Und sehen Sie mal nach den Dezimaltrennzeichen und Tausendertrennzeichen in der Systemsteuerung nach. Und: was ist denn im Kontextmenü „Genauigkeiten und Einheiten“ der Bemaßungsshapes eingestellt?
Und schließlich: schicken Sie mir doch einfach so eine Zeichnung – ich schaue sie mir gerne an
####
Vielen Dank für Ihre Rückmeldung.
Also eigentlich werden die Zahlen korrekt bei den anderen Rechner angezeigt, nur gestern hatten wir mal einen Fall wo es bei Herr Demmer auch nicht korrekt angezeigt worden ist.
Ich habe Ihre Hinweise einmal nachgeschaut bzw. hatten wir auch vorher schon vermutet und nachgeschaut, allerdings hat es nix bewirkt.
In der Systemsteuerung unter welchem Reiter sind die Dezimaltrennzeichen und Tausendertrennzeichen zu finden?
Im Anhang habe ich Ihnen einmal eine Zeichnung, in dem es wie beschrieben passiert, mitgeschickt.
#####
Hallo Herr J.,
ich würde in der Systemsteuerung bei der Gruppe „Zeit, Sprache und Region“ nachsehen, ob alles okay ist: Ländereinstellung, Dezimaltrennzeichen, …
Und: ich habe gerade nachgesehen – auf verschiedenen Rechnern: Visio 2013 und Visio 2016 – klappt alles. Die zirka 60 Zeichnungen von Ihnen die ich in der Hand hatte waren ja auch alle problemlos.
Noch eine Frage: auf dem korrupten Rechner, was wird denn angezeigt, wenn Sie die Bemaßungslinie markieren, den Text mit [F2] editieren und über Einfügen / Feld sich das Datenformat anzeigen lassen?
Und: blöde Frage: hilft vielleicht Visio schließen und wieder öffnen?
Und schließlich: wenn Sie nach VBA wechseln; dort ein Modul einfügen (Einfügen / Modul) und folgenden Code einfügen:
Sub LängeZeigen()
MsgBox ActivePage.Shapes(„Kühlregal H“).Cells(„Width“).Result(„m“)
End Sub
Den Cursor in den Code setzen und starten mit [F5] – bei mir zeigt er korrekt: 26,3501… an. Bei Ihnen?
#####
Guten Morgen Herr Martin,
in der Systemsteuerung und bei dem Datenformat richtig anzeigen, ist alles in Ordnung.
Wenn ich vorher den Fehler nicht habe, bevor ich auf Drucken/Drucker klicke, bekomme ich bei VBA eine Zahl beim Code raus von 26,3501 und mehr Nachkommastellen nicht.
Allerdings wenn der Fehler da ist und ich das mit VBA mache, bekomme ich eine Zahl raus mit sehr vielen Nachkommastellen.
Irgendwie hat das was mit dem Button bei Datei – Drucken zutun bzw. die Auswahl dann vom Drucker.
#####
hm, Herr J.,
jetzt bin ich mit meinem Latein am Ende. Wenn der Fehler nur bei bestimmten Situationen (drucken, zoomen) auftritt, dann weiß ich auch nicht, woran es liegen kann.
sorry!
#####
Hallo Herr Martin,
nur zur Info, der Fehler ist ohne irgendwelche anderen Einstellungen zu machen verschwunden.
Vielen Dank nochmal für Ihre Zusammenarbeit und Mithilfe.
Schöne Grüße
Das Legendenshape
Ich gebe zu – das Legendenshape in der Schablone „Netzwerk- und Peripheriegerät“ ist mir bislang entgangen. Dabei sehr interessant! Es sammelt nicht nur Netzwerkshapes ein, sondern auch beliebige andere. Diese müssen zuvor auf die Legende gezogen werden, damit dieses Shape sie „erkennt“. Außerdem kann das Shape über das Kontextmenü konfiguriert werden.