Daten in Visio

Hallo Herr Dr. Martin,
ich hätte nochmal ein paar spezielle Fragen zu Visio.
Ich kann über VBA auf die Shape-Daten meiner Shapes auf dem Zeichenblatt zugreifen … ABER … Wie kann ich auf Shape-Daten von Schablonen über VBA zugreifen?
Und: Gibt es eine Möglichkeit die Shape-Daten eines Shapes auf einen Schlag komplett zu löschen?
Z.Zt. kann ich immer nur die einzelnen Elemente löschen aber nicht alle auf einmal.
###
Hallo Herr S.,
* Sie müssen auf alle offenen Dokumente in Visio zugreifen, überprüfen, ob es sich dabei um eine Schablone handelt, die Mastershapes auslesen und von ihnen die Daten auslesen.
 
*ich würde nicht auf die Shape-Datensätze zugreifen. Erstes weiß ich nicht, wo Visio diese abspeichert, zweites ist es mir zu unsicher und drittens vermute ich einen Bug darin (das an anderer Stelle). Ich würde auf Abschnitt und Zeilen der Shapes per Schleife zugreifen.
 
* Sie können den Abschnitt visSectionProp löschen – aber dann zickt er manchmal – oder besser: jede Zeile dieses Abschnittes.
Spitzer20151123
Beispielsweise so:
Public Sub cmdDaten1(ByRef control As IRibbonControl)
Dim strDateien As String
Dim strSchablonen As String
Dim vsSchablone() As Document
Dim strMaster() As String
Dim vsMastershape As Master
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
Dim strSpapeDatenzeile As String
ReDim vsSchablone(0)
For i = 1 To Application.Documents.Count
‚ — durchlaufe alle offenen Dokumente
strDateien = strDateien & Application.Documents(i).Name & vbCr
If Application.Documents(i).Type = visTypeStencil Then
‚ — wenn du eine Schablone bist
ReDim Preserve vsSchablone(UBound(vsSchablone) + 1)
strSchablonen = strSchablonen & Application.Documents(i).Name & vbCr
Set vsSchablone(UBound(vsSchablone)) = Application.Documents(i)
End If
Next i
MsgBox „Liste der offenen Dateien:“ & vbCr & strDateien
MsgBox „Liste der offenen Schablonen:“ & vbCr & strSchablonen
For j = 1 To UBound(vsSchablone)
vsSchablone(j).Masters.GetNames strMaster
‚ — alle Mastershapes der Schablone
MsgBox „Liste der Mastershapes der Schablone “ & vsSchablone(j) & vbCr & Join(strMaster, vbCr)
For k = 0 To UBound(strMaster)
Set vsMastershape = Application.Documents(vsSchablone(j).Name).Masters(strMaster(k))
strSpapeDatenzeile = „“
If vsMastershape.Shapes(1).SectionExists(visSectionProp, False) = True Then
‚ — wenn Shapedaten im Mastershape vorhanden sind.
For m = 0 To vsMastershape.Shapes(1).Section(visSectionProp).Count – 1
strSpapeDatenzeile = strSpapeDatenzeile & vsMastershape.Shapes(1).Section(visSectionProp).Row(m).Cell(0).Name & vbCr
‚###############
‚ Cell(0): Value
‚ Cell(1): Prompt
‚ Cell(2): Label
‚ Cell(3): Format
‚ Cell(4): SortKey
‚ Cell(5): Type
‚ Cell(6): Invisible
‚ Cell(7): Verify
‚ Cell(8): DateLinked
‚###############
Next
MsgBox „Mastershape „““ & vsMastershape.Name & „““ hat folgende Daten:“ & vbCr & strSpapeDatenzeile
End If
Next
Next
End Sub
 
 
 
 
Public Sub cmdDaten3(ByRef control As IRibbonControl)
Dim i As Integer
If ActiveWindow.Selection.Count = 0 Then
MsgBox „Sie haben kein Shape ausgewählt!“
ElseIf ActiveWindow.Selection.Count > 1 Then
MsgBox „Bitte markieren Sie nur ein Shape!“
Else
For i = ActiveWindow.Selection(1).Section(visSectionProp).Count – 1 To 0 Step -1
ActiveWindow.Selection(1).DeleteRow visSectionProp, i
Next
MsgBox „Alle Zeilen der Shape-Daten wurden gelöscht!“
 
End If
 
End Sub
 
Public Sub cmdDaten2(ByRef control As IRibbonControl)
If ActiveWindow.Selection.Count = 0 Then
MsgBox „Sie haben kein Shape ausgewählt!“
ElseIf ActiveWindow.Selection.Count > 1 Then
MsgBox „Bitte markieren Sie nur ein Shape!“
Else
If ActiveWindow.Selection(1).SectionExists(visSectionProp, False) = True Then
ActiveWindow.Selection(1).DeleteSection visSectionProp
MsgBox „Abschnitt „“Shape-Daten““ wurde gelöscht!“
End If
End If
End Sub
 
 
 
 
 

Neuer Tab in der Multifunktionsleiste

Hallo Herr Dr. Martin,
ich hätte nochmal ein paar spezielle Fragen zu Visio.
ich möchte gerne unter Visio eine eigene Registerkarte erstellen mit Untergruppen. In diesen Untergruppen möchte ich gerne Buttons haben die (vorhandene) Makros ausführen. ABER …

Spitzer20151122_2

Excel und Visio
Excel und Visio

gibt es eine Möglichkeit die Makros auch unter Visio entsprechend im Menüband aufzurufen?
Vielen Dank
Mit freundlichen Grüssen
GS.
#####
Hallo Herr S.,
zu Ihren Fragen:
* Sie haben recht: in Excel kann man ein Makro direkt an ein Symbol hängen. In Visio nicht. Ich erstelle im XML-Archiv der Visio-Datei eine neue XML-Datei und füge dort die Buttons ein.

Die XML-Datei
Die XML-Datei

Dann weise ich ihnen den Befehl zu:

Public Sub cmdDaten3(ByRef control As IRibbonControl)

Das Ergebnis
Das Ergebnis

Schablonen

Hallo Rene,
Mit den Shapes habe ich ein Problem. Ich habe jetzt einige vorhandene Shapes dupliziert und diese dann geändert. Allerdings kann ich dann doppelte nicht löschen. Diese verschieben sich dann einfach nur.

geht nicht.
geht nicht.

Wie mache ich das genau? Ich klicke auf quick shapes hinzufügen. Dann springt das shape hoch (Bereich über Strich)
Aber ich krieg halt die ganzen doppelten gar nicht mehr raus. Generell lege ich ein shape so an (siehe nächster screenshot)
Ich hoffe, Du kannst mir hier helfen. Danke Dir!

Viele Grüße
Johannes
####
Hallo Johannes,

wenn DU eine Schablone neu erstellst und in diese Schablone Shapes reinziehst, dann findest Du in der Titelzeile ein Disketten (Speichern)-Symbol. Wird die Schablone gespeichert, verschwindet das Symbol – die Schablone ist offen – erkennbar an dem roten Sternchen. Wird die Schablone geschlossen und geöffnet, ist das Sternchen weg. Man muss die Schablone bearbeiten (Kontextmenü der Titelzeile) – dann erst kann man die Shapes in der Schablone (Mastershapes) wieder bearbeiten (erkennbar an dem roten Sternchen).

Liebe Grüße
Rene

Schablone20151110_1 Schablone20151110_2 Schablone20151110_3 Schablone20151110_4 Schablone20151110_5 Schablone20151110_6 Schablone20151110_7 Schablone20151110_8

Einfache Formen

Ich bin immer wieder verblüfft, wie man mit ein paar Linien, Kreisen und Rechtecken Aussagen schaffen kann. Beispielsweise dieses Cocktailglas.

Ein Cocktailglas
Ein Cocktailglas

Wenn Sie die Zitrusfrucht erstellen möchten – oder genauer: den 3/4-Kreis, können Sie mit den Vorgängen aus der Registerkarte „Entwicklertools“ dieses Shape erzeugen. Es besteht aus einem Kreis, über das ein Rechteck gelegt wurde.

Vorgänge / Zuschneiden
Vorgänge / Zuschneiden

Mit der Option „Zuschneiden“ erhält man die Einzelteile. Die nicht benötigten kann man ja löschen.

Das Ergebnis
Das Ergebnis

Daten verknüpfen

Hallo Rene,
wie geht es dir? Hoffe alles gut und ihr hattet wie wir hier heute schon den ersten Schneefall?

Ich bekomm es leider immer noch nicht hin, dass ich das Feld „Zeichnungs-Nr.:“ mit den passend Feld in den Shape-Daten verknüpfe, so dass ich nichts mehr ins Schriftfeld schreiben muss.  Wie Funktioniert das richtig und möglichst einfach? Weiter ist mir noch eingefallen, dass das Feld „Datum“ mit „Datum Rev.A“ immer übereinstimmen muss. Das kann man doch bestimmt auch zusammenfassen oder?

Viele liebe Grüße
Nils
#####
Hallo Nils,

zu Deinen Fragen:

1. nö – zum Glück noch kein Schnee. Zum Glück, weil ich Fahrrad fahre und keinen Schnee in der Stadt mag!

2. Layer-Schutz raus vom Block. Markiere das Feld „Zeichnungs-Nr.:“ (es sind mehrere Klicks nötig, weil wahrscheinlich Gruppe in der Gruppe in der Gruppe) Dort wird ein Datenfeld „Zeichnungsnummer“ angelegt. Im ShapeSheet holst Du Dir die Info des Zeichenblattes:
=ThePage!Prop.Zeichnungsnummer
Schriftfeld20151014_1
Shape auf der Zeichnung markieren; mit [F2] editieren, an das Ende des Textes klicken (sonst wird der Text überschrieben). Und dort wird mit Einfügen / Feld das Datenfeld eingefügt.

Schriftfeld20151014_2

3. Klar – Du kannst einen Bezug von einem Shape auf ein anderes machen. Schau nach, wie es heißt (hier: Sheet.439). Und dann verweist Du mit =Sheet.439!Prop.Datum auf die andere Zelle.
Übrigens würde ich die 0 im Feld Datum ausblenden mit:
=GUARD(IF(ThePage!Prop.Datum=0,““,ThePage!Prop.Datum))

Kommst Du damit klar?

Wenn nicht – frag mich einfach

lg

Rene

 

Intelligenter Block

Hübsche Frage heute in der Visio-Schulung.
Wir hätten gerne einen Block, der beim Herausziehen Informationen abfragt. Diese Informationen sollen an bestimmte Stellen des Blocks geschrieben werden. Außerdem soll der Block in der rechten unteren Ecke stehen.
Das letzte ist schnell realisiert: Im ShapeSheet wird in der Zelle PinX eingetragen:
=GUARD(ThePage!PageWidth-10 mm)
Bei PinY:
=GUARD(10mm)
Für das erste Problem wird auf der Gruppe Daten definiert (hier: Prozess, Version, Verfasser).
In drei Mitgliedsshapes wird jeweils eines der Datenfelder angelegt, also: Prozess, Version und Verfasser.
Ein Verweis vom inneren zum äußeren Shape, beispielsweise:
=Sheet.52!Prop.Verfasser
zieht sich die Dateninformation. Diese wird nun über ein Feld eingefügt.
Über „Verhalten“ kann man verhindern, dass der Anwender aus Versehen in die Gruppe hineingelangt.
Über „Schutz“ kann man verhindern, dass der Anwender aus Versehen das Gruppenshape beschriftet.

Der Block wird herausgezogen
Der Block wird herausgezogen

Das Fenster „Shapedaten“

Es ist einfach und effektiv.
Ein Kunde hat an ein Zeichenblatt Datenfelder gebunden, die in einem Anmerkungsfeld rechts unten angezeigt werden. Da einige Benutzer dieses Fenster schließen, ist ein Mechanismus vonnöten, mit dem man wieder schnell öffnen kann. Na – eine Zeile „Action“ im ShapeShape. Der Befehl DoCmd(1312) öffnet jedoch das allgemeine, über dem Blatt schwebende Datenfenster. Schöner wäre das Andockfenster. Da ich den Befehl dafür nicht weiß, bemühe ich den Makrorekorder. Er zeichnet auf:
[…]
Application.ActiveWindow.Windows.ItemFromID(visWinIDCustProp).Visible = True
[…]
Im Objektkatalog finde ich die Zahl 1658 für die Konstante visWinIDCustProp. Und mit DoCmd(1658) wird das Andockfenster geöffnet.

Das Andockfenster wird geöffnet.
Das Andockfenster wird geöffnet.

Zufallskunst

Ein paar Zeilen Code und schon entsteht ein „Zufallskunstwerk“.
Auf die Idee hat mich François Morellet gebracht – mit seiner Ausstellung in Caen.
Und hier der Code:
Dim i As Integer

ActiveWindow.SelectAll
ActiveWindow.Selection.Delete

Randomize

For i = 1 To 100
ActivePage.DrawLine 8.2 * Rnd, 8.2 * Rnd, 8.2 * Rnd, 11.8 * Rnd
Next

ActiveWindow.DeselectAll

Zufallskunst
Zufallskunst

Steuerelemente / Controls

Eine Firma möchte für Ihre technischen Zeichnungen einen Funktionsrahmen haben. Er soll jedoch nicht nur als Rechteck dargestellt werden, sondern möglicherweise Ausbuchtungen besitzen.
Nun – ein paar Zeilen Code im ShapeSheet und einige Steuerelemente ermöglichen dies.

Der Rahmen kann durchaus ein paar "Dellen" haben.
Der Rahmen kann durchaus ein paar „Dellen“ haben.

Funktionsrahmen20150904_1

Animation mit Visio

Ein bisschen Spielerei, ein paar Zeilen Code.
Ja, ja, ich weiß: Visio ist sicherlich nicht das beste Programm, um solche „Zeichnungen“ zu animieren. Dennoch: wer den Code einsehen möchte: (in der Routine „Verzögern“ ist eine Schleife und der Befehl DoEvents eingebaut – sonst wäre das Glas zu schnell fertig).


Set vsShape = ActivePage.DrawRectangle(2, 2, 6, 8)
With vsShape
.Cells(„Geometry1.Y3“).FormulaU = „=Width*0“
.Cells(„Geometry1.Y4“).FormulaU = „=Width*0“
.Cells(„Geometry1.X5“).FormulaU = „=Width*0“
.Cells(„Geometry1.Y5“).FormulaU = „=Height*0“

ActiveWindow.DeselectAll: Verzögere

.Cells(„Geometry1.NoFill“).FormulaU = „=True“
.Cells(„Geometry1.X1“).FormulaU = „=Width*0.6“
.Cells(„Geometry1.Y1“).FormulaU = „=Height*0.1“: Verzögere
.Cells(„Geometry1.X2“).FormulaU = „=Width*1“
.Cells(„Geometry1.Y2“).FormulaU = „=Height*0“
.Cells(„Geometry1.X3“).FormulaU = „=Width*0“
.Cells(„Geometry1.Y3“).FormulaU = „=Height*0“
.Cells(„Geometry1.X4“).FormulaU = „=Width*0.5“
.Cells(„Geometry1.Y4“).FormulaU = „=Height*0.15“: Verzögere
.Cells(„Geometry1.X5“).FormulaU = „=Width*0.5“
.Cells(„Geometry1.Y5“).FormulaU = „=Height*0.6“: Verzögere
.AddRow visSectionFirstComponent, 6, visTagLineTo
.Cells(„Geometry1.X6“).FormulaU = „=Width*0“
.Cells(„Geometry1.Y6“).FormulaU = „=Height*1“
.AddRow visSectionFirstComponent, 7, visTagLineTo
.Cells(„Geometry1.X7“).FormulaU = „=Width*0.5“
.Cells(„Geometry1.Y7“).FormulaU = „=Height*0.6“: Verzögere
.AddRow visSectionFirstComponent, 8, visTagLineTo
.Cells(„Geometry1.X8“).FormulaU = „=Width*1“
.Cells(„Geometry1.Y8“).FormulaU = „=Height*1“
.AddRow visSectionFirstComponent, 9, visTagLineTo
.Cells(„Geometry1.X9“).FormulaU = „=Width*0.75“
.Cells(„Geometry1.Y9“).FormulaU = „=Height*0.8“: Verzögere
.AddRow visSectionFirstComponent, 10, visTagLineTo
.Cells(„Geometry1.X10“).FormulaU = „=Width*0.25“
.Cells(„Geometry1.Y10“).FormulaU = „=Height*0.8“: Verzögere

intAbschnitt = .AddSection(visSectionLast)

.AddRow intAbschnitt, visRowComponent, visTagComponent
.AddRow intAbschnitt, 1, visTagRelMoveTo
.AddRow intAbschnitt, 2, visTagEllipticalArcTo
.Cells(„Geometry2.X1“).FormulaU = „=0.5“
.Cells(„Geometry2.Y1“).FormulaU = „=1“
.Cells(„Geometry2.X2“).FormulaU = „=Width*0.125“
.Cells(„Geometry2.Y2“).FormulaU = „=Height*0.65“
.Cells(„Geometry2.A2“).FormulaU = „=-Width*0.25“
.Cells(„Geometry2.B2“).FormulaU = „=Height*1“
.Cells(„Geometry2.NoFill“).FormulaU = „=True“: Verzögere

.Cells(„LineWeight“).FormulaU = „=30 pt“

End With