Auf Daten einer externen Datenquelle zugreifen

Schritt III
An eine Visio-Zeichnung werden Daten einer Exceltabelle gebunden. Diese sollen dem Anwender zur Auswahl stehen. Über eine Userform kann der Anwender auswählen.
Beim Öffnen wird auf die Datenquelle zugegriffen und alle Spalten angezeigt:
Me.Controls(„ComboBox“ & i).AddItem „Keine Auswahl“
Me.Controls(„ComboBox“ & (i + 12)).AddItem „Keine Auswahl“
For j = 1 To ActiveDocument.DataRecordsets(1).DataColumns.Count
Me.Controls(„ComboBox“ & i).AddItem ActiveDocument.DataRecordsets(1).DataColumns(j).Name
Me.Controls(„ComboBox“ & (i + 12)).AddItem ActiveDocument.DataRecordsets(1).DataColumns(j).Name
Next j
Ich gehe davon aus, dass es nur eine Datenquelle gibt.

Racks zusammenfassen – Schritt 2

Schritt II
Die Racks sollen Namen haben. Diese Namen sollen im Report aufgelistet werden. Und der Name soll als Beschriftung angezeigt werden. Dafür gibt es zwei Lösungen:
* Man kann die Namen über die Daten eingeben.
* Man kann die Namen über Entwicklertools / Shape-Name festlegen.
Ich habe mich für letztere Variante entschieden.
Da das Shape eine Gruppe ist, gibt nun auch wieder zwei Varianten, wie man den Namen anzeigen lassen kann:
* In einem Mitgliedsshape mit einer Verknüpfung auf das Gruppenshape, also:
= Sheet.4711!Prop.Rackname
oder:
= Sheet.4711!NAME()
Und diese Information – gespeichert in einer benutzerdefinierten Zelle oder in einem Daten Feld kann über Einfügen / Feld als Text eingefügt werden.
Auch hier habe ich mich für die zweite Variante entschieden:
* direkt auf der Gruppe habe ich den Text editiert ([F2]) und dann über Einfügen / Feld / Objektinfo / Name eingefügt. Mit dem Werkzeug „Textblock“ kann man ihn verschieben.
Und über Entwicklertools / Schutz habe ich den Text der Gruppe geschützt. Alternativ: im ShapeSheet.

Rackdaten zusammenfassen – Schritt 1

Die Aufgabe: An eine Visio-Zeichnung sind Daten gebunden. Von diesen Daten werden einige Datensätze verwendet und sollen in der Zeichnung gruppiert und summiert angezeigt werden. Ebenso sollen diese Informationen nach Excel exportiert werden.
Und so habe ich es gemacht: Schritt I: Die Shapes vorbereiten.
Damit die Shapes (hier: die Schränke, die Racks) „eingesammelt“ werden können, müssen sie gekennzeichnet werden. Da ihnen kein Master zugrunde liegt, werden sie auf Layer gelegt. So können sie später am leichtesten „identifiziet“ werden:
For i = 1 To ActivePage.Shapes.Count
If ActivePage.Shapes(i).LayerCount > 0 Then
If ActivePage.Shapes(i).Layer(1).Name = „Rack“ Then

Daten und Datengrafik

Eine hübsche Frage zu Visio:
An eine Zeichnung wird eine Exceltabelle gebunden mit technischen Informationen. Einige davon werden über eine Datengrafik angezeigt. Die Frage: Ich möchte die Texte ein klein wenig verschieben.
Leider sind die Datengrafiken etwas sperrig in Bezug auf die Anpassung, beispielsweise von Textpositionen.
Ich schlage vor ein eigenes Shape zu erstellen. Eine Gruppe, die mehrere Mitgliesdselemente beinhaltet. Ein Datensatz wird auf die Gruppe gezogen. Die „inneren“ Shapes holen sich mit einem Verweis auf das äußere Gruppenshape die Information, beispielsweise
=Sheet.4711!Prop._vis_Power
Diese Information wird angezeigt, kann bequem formatiert und verschoben werden. Die Datengrafik muss entfernt werden.
Und dann kam die Frage: Aber ich möchte möglicherweise noch eine Farbe verwenden – je nach Wert. Natürlich kann man so etwas im ShapeSheet einrichten. Datengrafik wäre einfacher.
Mein Vorschlag – warum nicht beides: ein selbst gebautes Shape, dass die Daten anzeigt unter Verwendung der Datengrafik. Der Vorschlag kam gut an.

Externe Daten

Wenn man in Visio externe Daten an eine Datei bindet, kann man leicht per Programmierung darauf zugreifen.
MsgBox ActiveDocument.DataRecordsets(1).CommandString
zeigt, dass ein SQL-Befehl dahinter liegt.


Mit einer Schleife kann man beispielsweise alle Namen auslesen:
ActiveDocument.DataRecordsets(1).DataColumns(j).Name

DrawOval

In Visio kann man mit dem Befehl DrawRectangle und DrawOval ein Rechteck, beziehungsweise eine Ellipse zeichnen. Wer braucht denn so etwas?
Sie können diese Funktion verwenden, um in einer »durchgerechneten« Zeichnung Shapes kennzeichnen, die richtig positioniert, geklebt, beschriftet, … wurden. In folgendem Code wurden sämtliche Shapes in einem Datenfeld »eingesammelt« und dann ausgewertet. Die Shapes, die nicht verbunden sind, werden durch einen roten Punkt gekennzeichnet:
If InStr(1, ActivePage.Shapes(strVerbindername).Cells(„EndX“). _
FormulaU, „_WALKGLUE“) > 0 Then ‚ — falls V. dynamisch klebt
blnKlebtNicht = True: blnMindestensEinerKlebtNicht = True
Set vsShape = ActivePage.DrawOval(ActivePage.Shapes( _
strVerbindername).Cells(„PinX“).Result(„in“) – 0.5, _
ActivePage.Shapes(strVerbindername).Cells(„PinY“).Result(„in“) _
– 0.5, ActivePage.Shapes(strVerbindername).Cells(„PinX“). _
Result(„in“) + 0.5, ActivePage.Shapes(strVerbindername). _
Cells(„PinY“).Result(„in“) + 0.5)
vsShape.Cells(„FillForegnd“).FormulaU = „=2“ ‚ — rot
vsShape.Text = „Verbindungsfehler“
vsShape.AddSection visSectionProp
vsShape.AddRow visSectionProp, 1, 0
vsShape.Section(visSectionProp).Row(0).Name = _
„Verbindungsfehler“
[…]

Größe der Festplatte visualisieren

Ein paar Zeilen Code und man kann sich die Größe der Festplatte visualisieren lassen:
Sub Festplatte()
Dim lngFestplattengröße As Double
Dim lngFreierPlatz As Double
Dim i As Integer
lngFestplattengröße = GetDriveSpace(Left(Application.Path, 2), DRIVE_TOTALSIZE) / 1000000
For i = 1 To 6
ActivePage.Shapes(„Text“ & i).Text = Format(Int(lngFestplattengröße / 7) * i / 1000, „#,##0“)
Next i
 
ActivePage.Shapes(„Gesamt“).Text = „Gesamtgröße der Festplatte: “ & Format(lngFestplattengröße, „#,##0″) & “ GByte“
 
lngFreierPlatz = GetDriveSpace(Left(Application.Path, 2)) / 1000000
ActivePage.Shapes(„Zeiger“).Cells(„Angle“).ResultFromInt(81) = 90 – (lngFreierPlatz / lngFestplattengröße) * 270
ActivePage.Shapes(„Zeiger“).Cells(„Angle“).Formula = „=“ & (90 – (lngFreierPlatz / lngFestplattengröße) * 270) & “ grad“
End Sub
Okay – man benötigt noch eine FUnktion, die die Größe der Festplatte und den belegten Speicher anzeigt. Beispielsweise folgende:
Public Enum eSpaceType
DRIVE_FREESPACE = 1
DRIVE_TOTALSIZE = 2
End Enum
 
‚ Freien Speicherplatz/Gesamtgröße eines Laufwerks ermitteln
Public Function GetDriveSpace(ByVal sDrive As String, _
Optional ByVal nSpaceType As eSpaceType = DRIVE_FREESPACE) As Currency
Dim oWMI As Object
Dim oDrives As Object
Dim sSQL As String
Dim oDrive As Object
sSQL = „SELECT * FROM Win32_LogicalDisk WHERE DeviceID = ‚“ & sDrive & „‚“
Set oWMI = GetObject(„winmgmts:“)
Set oDrives = oWMI.ExecQuery(sSQL)
If Not oDrives Is Nothing Then
If oDrives.Count > 0 Then
For Each oDrive In oDrives
If nSpaceType = DRIVE_FREESPACE Then
‚ freien Speicherplatz zurückgeben
GetDriveSpace = oDrive.FreeSpace
Else
‚ Gesamtgröße des Datenträgers zurückgeben
GetDriveSpace = oDrive.Size
End If
Exit For
Next
End If
End If
Set oDrives = Nothing
Set oWMI = Nothing
End Function

Schriftgröße

Erstaunlich!

Die Aufgabe lautet: Wir haben in CorelDraw technische Geräte erstellt – diese sollen in Visio nachbearbeitet werden, so dass man sie verwenden kann. Ich schaue sie mir an. Das Rack ist zu groß für den Schrank:

Also verkleinern. Das Dumme ist: Durch das Verkleinern des Objektes wird die Schriftgröße (und Linienstärke) nicht verkleinert, weil diese Formatierungsattribute unabhängig von der Größe sind. Das heißt: die Schrift ist zu groß:

Also zurück auf Originalgröße. Einige der Texte sind in 3 pt formatiert:

Wenn ich sie auf 10% verkleinere, also auf 0,3 pt – weigert sich Visio:

Setzt die Schriftgröße ungefragt auf 1 pt zurück.

Was würde Excel machen? Eine Fehlermeldung! DAS ist vernünftig:

Lob an Excel! Schelte an Visio!

Zugegeben: ich musste in Excel noch nie eine Schriftgröße < 1 pt wählen …

Nachtrag: ich habe die Originalzeichnung in CorelDraw bearbeitet: Dort die Schrift in Kurven konvertiert und anschließend erneut nach Visio exportiert. Dann wird die Schrift beim Verkleinern des Objekts auch verkleinert.

Dynamische Breite und Höhe

Hallo Herr Martin,
in einer excel Tabelle habe ich flächen mit den jeweiligen abmaßen beschrieben. Ist es möglich diese Tabelle mit visio derart zu verknüpfen, dass die shapes (ähnlich wie in der netzwerkverknüpfung die sie beschrieben haben und die Formatierung der shapes beeinflusst haben) direkt in der beschriebenen Größe erzeugt werden? Wenn ja, ist das ohne großen programmieraufwand möglich und wo könnte ich mir das Vorgehen anlesen/zeigen lassen?
Ziel ist es lediglich in der Tabelle zu arbeiten und die shapes dann „automatisch“ anzupassen
 
Vielen Dank und ein schönes Wochenende
 
####
 
Hallo Herr G,
kennen Sie das ShapeSheet?
Erzeugen Sie eine Zeichnung und verknüpfen diese mit einer Exceltabelle.
Erzeugen Sie ein Rechteck.
Verknüpfen Sie einen Datensatz mit diesem Rechteck.
Verweisen Sie im ShapeSheet des Rechtecks bei der Breite auf die Spalte der Breite; bei der Höhe auf die Spalte mit der Höhe. Fläche wird nicht funktionieren!
Duplizieren Sie dieses Rechteck und weisen den anderen Rechtecken die anderen Datensätze zu.
Klappt!

Verzeichnisse visualisieren

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