Autor: Rene_Martin
Mit ein bisschen VBA kann man in Visio leicht die Ordnerstruktur visualisieren lassen:
Dazu benötigen Sie einige globale Variablen für die Zeilen- und Spaltennummern, die Visio-Datei, das zuletzt erstellte Shape und den Namen des Verzeichnisses:
Dim dblEbene As Double
Dim dblZeile As Double
Dim blnNeueZeile As Boolean
Dim vsDatei As Document
Dim vsSeite As Page
Dim strVerzeichnis As String
Dim vsRechteck As Shape
Der Ordner wird ausgewählt, eine neue Datei erstellt und auf die erste Seite zugegriffen. Das rekursive Programm wird aufgerufen.
Sub ListeVerzeichnisAuf()
Dim fso As FileSystemObject
Dim fsoVerzeichnis1 As Folder
Set fso = New FileSystemObject
strVerzeichnis = VerzeichnisAuswählen(„Bitte Verzeichnis auswählen!“)
If strVerzeichnis = „“ Then
MsgBox „Es wurde kein Verzeichnis ausgewählt“
Else
Set fsoVerzeichnis1 = fso.GetFolder(strVerzeichnis)
Set vsDatei = Application.Documents.Add(„“)
Set vsSeite = vsDatei.Pages(1)
dblEbene = 0: dblZeile = 11
blnNeueZeile = False
ZeigeVerzeichnis fsoVerzeichnis1
Das eigentliche Programm generiert Rechtecke, die an die entsprechende Position gesetzt und mit dem Verzeichnisnamen beschriftet werden.
Sub ZeigeVerzeichnis(ByVal fsoVerzeichnis1 As Folder)
Dim fsoVerzeichnis2 As Folder
dblEbene = dblEbene + 1.5
For Each fsoVerzeichnis2 In fsoVerzeichnis1.SubFolders
Set vsRechteck = vsSeite.DrawRectangle( _
dblEbene, dblZeile, dblEbene + 1.5, dblZeile – 0.5)
vsRechteck.Text = „\“ & fsoVerzeichnis2.Name
blnNeueZeile = False
ZeigeVerzeichnis fsoVerzeichnis2
Next
dblEbene = dblEbene – 1.5
If dblEbene = 1.5 Then
dblZeile = dblZeile – 0.25
End If
‚ — trenne die Hauptverzeichnisse voneinander
If blnNeueZeile = False Then
dblZeile = dblZeile – 0.5
blnNeueZeile = True
End If
‚ — nur das erste Mal eine Zeile tiefer
End Sub
Nach Beendigung wird die Seite an die benötigte Größe angepasst und der Name des ausgewählten Verzeichnisses in ein Überschriften-Shape geschrieben.
vsSeite.AutoSizeDrawing
Set vsRechteck = vsSeite.DrawRectangle( _
vsSeite.PageSheet.Cells(„PageWidth“).Result(„in“) / 2 – 3, _
vsSeite.PageSheet.Cells(„PageHeight“).Result(„in“) – 1, _
vsSeite.PageSheet.Cells(„PageWidth“).Result(„in“) / 2 + 3, _
vsSeite.PageSheet.Cells(„PageHeight“).Result(„in“) + 0)
vsRechteck.Text = strVerzeichnis
strVerzeichnis = „“
ActiveWindow.DeselectAll
Application.Path
Das oberste oder erste Objekt in Visio – wie in allen Anwendungsprogrammen von Microsoft – ist Application. Damit wird das Programm, also Visio selbst, bezeichnet. Auf dieses Objekt kann zugegriffen werden. Dies ist interessant, wenn Sie nicht mit VBA innerhalb von Visio, sondern extern, das heißt mit VS.NET (VB.NET oder C#), mit Visual Basic, C++ oder einer anderen Programmiersprache auf Visio zugreifen. Oder auch, wenn Sie von einem anderen Programm, beispielsweise von Excel, Access oder Word auf Visio zugreifen.
Innerhalb von Visio bietet das Objekt Application auf den ersten Blick wenig interessante Informationen.
Dynamische Verbinderformate
Die Aufgabe klingt einfach – ist aber ein wenig knifflig: Wenn ein Verbinder »kor-rekt« klebet, das heißt, wenn Angang und Ende mit statisch an Verbindungspunkte eines anderen Shapes kleben, soll sich die Linie rot färben.
Klebt ein Verbinder, dann steht steht in den Zellen BeginX und BeginY eine Formel der Form:
=PAR(PNT(Process.4!Connections.X2,Process.4!Connections.Y2))
Wenn nicht, dann steht in den beiden Zellen nur die X- und Y-Angabe, beispiels-weise 110 mm und 220 mm.
Die Formel selbt kann – beispielsweise in einer userdefined Zelle mit der Funktion
=EVALCELL(BeginX)
ermittelt werden. Damit man auf den Text zugreifen kann, muss dieser in einen Text umgewandelt werden, also beispielsweise:
=FORMAT(EVALCELL(BeginX),“@“)
Dies liefert entweder
PKT(100,000 mm;8,360 mm)
oder
100,000 mm
Und davon kann man nun die ersten drei Zeichen herauslesen:
Nun kann in einer anderen Zelle Bezug auf diese beiden benutzerdefinierten Zellen benommen werden, beispielsweise so:
=GUARD(IF(AND(STRSAME(User.KlebeverhaltenLinks,“PKT“),
STRSAME(User.KlebeverhaltenRechts,“PKT“)),2,0))
2 steht für rote Linienfarbe, 0 für schwarze Linienfarbe. Man könnte auch die Linie dicker machen oder formatieren:
Die Formel für die Linienstärke wäre dann:
=GUARD(IF(AND(STRSAME(User.KlebeverhaltenLinks,“PKT“),
Führungslinien einfärben
Verbinder speichern
Verbinder in Visio sind auch nur Shapes. Man kann sie in Schablonen abspeichern. Manchmal ist das nötig, wenn sie bestimmte Formatierungseigenschaften besitzen sollen. Oder Text – wie hier der Haken und das „x“, das aus der Schriftart WingDings als Symbol geholt wurde und eingefärbt wurde. Und „ja“ beziehungsweise „nein“ symbolisiert.
Eigene Symbolbilder für Master-Shapes
Animationen in Visio?!?
Hallo Herr Martin,
ich hoffe, es geht Ihnen gut. Ich möchte mal wieder meine Visio Workflows verbessern. Würde mich mit einer besonderen Aufgabe in den nächsten Tagen bei Ihnen melden. Vorab eine Frage zu den Präsentationsmöglichkeiten mit Visio:
Angehängte Datei will ich wie eine Power Point Präsentation in einzelnen Stufen aufbauen lassen. Dafür habe ich alles Layern zugeordnet, die ich während der Präsentation nach und nach einblende. Ich lasse also immer das „Layer Properties“ Fenster auf und schalte nach und nach die Layer auf „Visible“ und bestätige mit „Apply“.
Ich würde das Ganze gerne im Vollbildmodus präsentieren, um so viel Bildschirmfläche wie möglich zu nutzen. Im Vollbildmodus kann ich aber nicht mehr das „Layer Properties“ Fenster öffnen. Haben Sie eine Idee, wie ich das lösen könnte? Makros bauen?
Ein Export zu Power Point ist mit meiner Visio 2010 Version nicht möglich, sondern nur mit Visio PLAN, wie ich gelesen habe?
Viele Grüße,
Hallo Herr W.,
lustige Frage! Die einzige Möglichkeit, um aus dem Präsentationsmodus ein Makro zu starten, ist eine Schaltfläche. Ich rufe nun das Makro „LayerAnzeigen“ auf, das einen Layer nach dem anderen anzeigt. Die Reihenfolge könnte man sicherlich noch ändern. Ebenso könnte man das zeitgesteuert aufrufen.
HIER unterbreche ich mit dem Meldungsfenster.
schöne Grüße
Rene Martin
PS: Der Code:
Dim i As Integer
For i = 1 To ActivePage.Layers.Count
ActivePage.Layers(i).CellsC(4).FormulaU = „=0“
Next
MsgBox „STOPP“
For i = 1 To ActivePage.Layers.Count
ActivePage.Layers(i).CellsC(4).FormulaU = „=1“
MsgBox „STOPP“
Next
Oder: Sie rufen den Layerdialog über eine Schaltfläche mit dem Befehl
Application.DoCmd 1448
auf
Bodenplatten – Kante an Kante
Hallo Herr Martin,
ich suche im Web ein VISIO Forum werde jedoch nicht fündig.
Vielleicht haben sie einen Tip für mich.
Wir müssen Bodenplatten belegen, die eine bestimmte Breite und Länge nicht überschreiten dürfen. MaxBreite 60 max 120 Höhe
Machbar mit der BOUND funktion.
Jetzt wollen wir die Platten jedoch andocken ohne einen Zwischenabstand. Also Kein Verbinderlinien dazwischen sondern direkt Verbinderstelle auf Verbinderstelle.
Nach dem Motto – Ähnlich wie ein Mosaik. Ich hoffe die Info reicht ihnen.
Ich würde mich freuen eine Info zu bekommen.
Grüße
####
Hallo Herr M.,
Sie bringen Visio an die Grenzen.
Lösung 1: Gibt es feste Maße für Ihre Platten? Also beispielsweise 10 x 10; 10 x 20; 10 x 30? Wenn ja, dann könnten Sie ein festes Raster einstellen.
Lösung 2: Wenn Sie die Registerkarte „Entwicklertools“ eingeschaltet haben, können Sie Verbindungspunkte setzen und diese nach „außen und innen“ kleben lassen:
Werfen Sie mal einen Blick auf die Vorlage „HKL-Plan“ und ziehen ein paar HKL-Rohre auf das Zeichenblatt. Sie kleben aneinander.
Theoretisch. Praktisch habe ich festgestellt, dass bei bestimmten Winkeln und Konstellationen die Rohre nicht kleben …
Lösung 3: Ich habe im Rahmen eines großen Programmierprojekts einen Assistenten gebastelt, der Shapes Kante an Kante aneinander setzt.
Hilft Ihnen das?
schöne Grüße
Rene Martin
Raumpläne und große Beschriftungen
Hallo Herr Martin,
ich arbeite mit Ihrem Buch und mit Visio 2016. Eine Sache bin ich leider noch nicht draufgekommen, auch in Ihrem Buch finde ich keine Information. Wie bekomme ich die großen Beschriftungen bei der Raumzeichnung oder Wänden oder auch Schiebetür weg?
Wäre sehr dankbar für eine Antwort, die Riesenbeschriftungen sind wirklich nervig.
Mit freundlichen Grüßen
####
Hallo Frau M.,
eigentlich werden die Beschriftungen nur angezeigt, wenn die Shapes markiert sind. Auf Ihrer Zeichnung ist zu erkennen, dass Sie alle Shapes markiert haben. Deshalb die großen Texte. Ich gebe Ihnen recht: ja – schön sind die nicht; aber gestört haben sie mich noch nicht. Sobald ich die Markierung aufhebe, verschwinden sie ja.
Ich habe gestern auch nachgeschaut: Kennen Sie das ShapeSheet, das unter den Shapes liegt? Dort kann man sehen, dass die Wände Gruppen sind, In einem Mitgliedselement liegt der Text, der angezeigt und ausgeblendet (Visible = True/False) wird – je nachdem, ob das Shape markiert ist. Wollte man es wirklich deaktivieren, müsste man diese Shapes manipulieren und in einer eigenen Schablone speichern.
Ein eigener Nummerierungsassistent
Der Nummerierungsassistent ist fertig. Ich habe den Assistenten, der einige Bugs aufweist, nachgebaut. Man kann die Startnummer festlegen und die Schriftgröße ändern. Hierzu trägt man eine Zahl in den Dialog ein – alle Nummer werden nun größer oder kleiner. Die Technik:
der Dialog schreibt die Nummer in eine Zelle des ShapeSheets des Zeichenblattes:
ActivePage.PageSheet.Cells(„User.garSchriftgroesse“).FormulaU = „=“ & Me.txtSchrift.Value
Jede Nummer „holt“ sich diese Schriftgröße: