Blätter per VBA erzeugen?!

Hallo Herr Martin,
Ich habe mal „auf die Schnelle“ versucht Seiten per VBA von einem Quelldokument in das Zieldokument an die gewünschte Position zu kopieren. Bisher ohne Erfolg.
Gibt es da ein Script als Vorlage? Ich habe auch das Problem, das der „Fokus“ dann auch dem falschen Dokument liegt.
Kann man ein Dokument öffnen, so dass es für den Bediener nicht sichtbar ist.? Oder soll man für jede Seite, die man einfügt ein eigenes Dokument, bestehend aus nur dieser Seite erzeugen?
####
Hallo Herr H.,
 
in Excel ist das ein einfacher Befehl: Kopiere ein Tabellenblatt aus einer Datei in eine andere Datei. Das mache ich häufig.
In Visio geht das (wohl) nicht.
Sie finden im Kontextmenü der Zeichenblätter keinen Befehl „kopieren“.
Das Page-Objekt kennt zwar die Methode „Duplicacte“ (in die gleiche Datei), aber nicht „Copy“ (in eine andere Datei).
Es ist auch nicht möglich, einzelne Zeichnungsblätter auf verschiedenen Vorlagen basieren zu lassen – ich vermute, das ist der Grund, warum man keine Blätter kopieren kann.
Sie könnten alle Shapes kopieren – aber Achtung: ich fürchte Sie werden Schwierigkeiten bekommen. Ich habe (in einem älteren Projekt) mal versucht die Shapes zu gruppieren, das Gruppenshape zu kopieren und auf einem anderen Blatt zu entgruppieren – bin aber gescheitert, weil dann Verbinderereignisse eintreten, die mir die Verbinder anderes kleben wie ich es gerne hätte.
 
Meine Empfehlung: Finger weg vom „Blatt kopieren“!
 
Erzeugen Sie neue Blätter durch:
* Ein- und Ausblenden
* Herausziehen von bestimmten Master-Shapes aus Schablonen
 

SpatialRelation

Sehr interessant und wichtig ist der Befehl
SpatialRelation
in VBA für Visio. Damit kann man ermitteln, ob sich zwei Shapes überlappen, das eine Shape vom anderen verdeckt liegt, ob die beiden Shapes nebeneinander liegen oder nichts miteinander zu tun haben. Die Syntax lautet:
Visio.Shape.SpatialRelation(OtherShape As Shape, Tolerance As Double, Flags As Integer) As Integer
Die Rückgabeparameter lauten:
visSpatialContain
visSpatialContaindIn
visSpatialOverlap
visSpatialTouching
Ich habe es verwendet, weil ich in Raumplänen herausfinden möchte, ob zwei Möbelstücke nebeneinander stehen.

Kommentare in Visio

Wenn Sie per Programmierung einen Kommentar mit Zeilenumbruch in ein Shape in Visio einfügen wollen, müssen Sie lf (also vbLf) oder Chr(10) verwenden:
 
ActivePage.Shapes(1).Cells(„Comment“).FormulaU = „=““Bitte lächeln!“ & Chr(10) & „Gruss“ & vbLf & „Leo“““

QuickInfo programmieren

Hallo Rene,
Und jetzt hoffe ich auch noch auf Hinweise von Dir, weil ich wieder einmal Nichts finde…
Ich habe schon mehrfach die „Quick-Info“ für die Buttons benutzt. Gern würde ich auch die „Shape-QuickInfo“ benutzen.
Allerdings nicht nur, wie hier gezeigt, auf der Oberfläche, sondern als Variable im Programm, so dass ich einem Shape eine spezielle vom Programmablauf abhängige Info zuordnen kann.
In der Hilfe gibt es nicht einmal den Begriff Shape-QuickInfo….
Kannst Du mir helfen, wie das funktioniert?
####
Hallo Wolfgang,
Und: der Text des QuickInfos ist in der Zelle „Comment“ in der Gruppe „Miscellaneous“ gespeichert. Dort kannst du ihn eintragen:
Dim strText As String
strText = InputBox(„welcher Text?“)
ActivePage.Shapes(„CommandButton1“).Cells(„Comment“).FormulaU = „=“““ & strText & „“““
 
Ein Umbruch wird mit vbCr erzeugt.

Formula und FormulaForce

Hallo Herr Martin,

Nun habe ich doch eine Frage.
Ich experimentiere gerade mit der GUARD – Funktion. Ziel ist es die Shapes auf dem Hintergrund zu sichern.
Die Funktion „Schutz“ über das Entwicklermenü ist nicht mehr wirklich eine Hürde für meine Kollegen. Daher soll nun GUARD ins Spiel kommen.

Mein Problem ist nun wie folgt:
Ich habe zwei kleine Scripte, welches den Schutz setzt und wieder aufheben soll. Siehe Anhang
Das Setzen des Schutze geht wunderbar.
Das Rücksetzen wird immer mit dieser Fehlermeldung quittiert:

Hallo Herr H.,

das ist eine leichte Frage – Sie müssen die Eigenschaft FormulaForceU statt FormulaU verwenden.

Werfen Sie mal einen Blick in mein Buch – dort liste ich dir Unterschiede zwischen
Formula, FormulaU, FormulaForceU, Result, … auf .

Mastershapes in einer Schablone

Sehr geehrter Herr Dr. René Martin,
[…] Ziel ist es die Visio Diagramme mit unserem SAP System zu verbinden.
Dazu müssen jedem Shape entsprechende Shape-Daten mitgeben werden.
Dabei haben mir Ihre Bücher
(Microsoft Visio 2010 Programmierung Microsoft Visio effizient anpassen und erweitern) und
(Visio 2013/2016 anpassen Das Handbuch für Entwickler),
wie auch Ihr Video-Training
(Visio 2010 Umfassend praxisorientiert, leicht verständlich) schon erheblich geholfen.
Da es das Ziel der Automatisierung ist dem Benutzer die Erstellung der Diagramme möglichst einfach zu machen,
soll er auch beim Anlegen neuer Shapes bestmöglich unterstützt werden.
Jetzt bin ich jedoch auf ein Problem gestoßen an welchem ich nicht weiter komme.
Ich benötige eine Möglichkeit einem neuerzeugten Shape die benötigten Shape-Daten mitzugeben, wenn es zu einer Schablone hinzugefügt und somit zum Mastershape wird.
Es gibt jedoch kein Event, welches auf dieses Ereignis anspricht.
Haben Sie vielleicht eine Idee wie sich dies umsetzen lässt?
 
Im Voraus schon mal vielen Dank für Ihre Hilfe
 
Mit freundlichen Grüßen
Hallo Herr B.,
 
ich verstehe den Workflow nicht ganz: der Anwender soll neue Shapes erstellen. Beim Abspeichern in einer Schablone sollen (automatisiert) Daten an diese Shapes angefügt werden.
* Warum erstellt der Anwender nicht selbst diese Daten?
* Oder: wenn es sich um immer die gleichen Daten handelt (und auch viele Daten) dann würde ich es nicht über ein Ereignis lösen, sondern über eine Schaltfläche, die der Anwender anklickt: entweder dem markierten Shape werden neue Daten hinzugefügt oder: alle Mastershapes einer Schablone werden mit diesen Daten versehen.
 
Der Grund: meines Wissens gibt es kein Ereignis: „ziehe ein Shape vom Zeichenblatt in die Schablone“. Und: nach meiner Erfahrung werden Shapes in die Schablone gezogen; dort manchmal bearbeitet. Manchmal werden sie auch wieder auf das Zeichenblatt gezogen, bearbeitet und wieder zurück in die Schablone gezogen; manchmal auch in der Schablone direkt bearbeitet (auf dem Zeichenblatt geht das manchmal besser).
 
Hilft Ihnen diese Antwort?

Dynamische Schaltflächen auf einem Zeichenblatt

Amüsant. Wenn man in Visio eine Befehlsschaltfläche auf ein Zeichenblatt legt, liegt das nächste Shape ÜBER der Befehlsschaltfläche. Schaltet man jedoch den Entwurfsmodus aus, liegt das Shape dahinter. Es gibt keine Möglichkeit, das Shape vor die Befehlsschaltfläche zu legen.
Auch die Zellen „NoShow“ oder „Transparency“ bewirken nicht, dass die Schaltfläche ausgeblendet wird. Man könnte sie per Programmierung auf Width = 0 und Height = 0 (vielleicht noch PinX und PinY auf 0) setzen – dann ist die Schaltfläche fast verschwunden. Natürlich kann man sie auch programmieren:
Dim shp As Shape
 
Dim DiagramServices As Integer
DiagramServices = ActiveDocument.DiagramServicesEnabled
ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150
 
Set shp = Application.ActiveWindow.Page.InsertObject(„forms.Commandbutton.1“, visInsertAsControl + visInsertNoDesignModeTransition)
shp.Cells(„PinX“).FormulaU = „=100mm“
shp.Cells(„PinY“).FormulaU = „=150mm“
shp.Name = „Testbutton“
 
 
‚Restore diagram services
ActiveDocument.DiagramServicesEnabled = DiagramServices
 
Jedoch – es bleibt mühsam dynamische Schaltfläche auf dem Zeichenblatt zu erzeugen.

Die API-Hölle

Ich versuche API-Funktionen zu vermeiden. Das Problem sind die 32- und 64-Bit-Systeme.

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.

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.