Gruppe in der Gruppe in der Gruppe …

Hallo Herr H.
ist das gemein oder einfach nur böse?
####
So begann meine Mail. Warum mein Erstaunen?
Es begann so:
Sehr geehrter Herr Martin,
 
ich stehe vor einem mittelschweren VBA- Problem und hoffe sehr, dass Sie mir hier wieder weiterhelfen können.
 
Folgendes Problem:
 
Ich habe tagtäglich mit unzähligen gruppiertes Shapes zu tun die ich per Excel Tabelle mit Adressdaten und Daten befülle.
 
Ab Spalte L2:L in der Excel Tabelle soll sich in Abhängigkeit des Textinhaltes (Ventil, Pumpe, Speicher) die Linien -Farbe des
Shapes ändern („Linecolor“) von Ventil = Grau, Pumpe = Blau und Speicher = grün. (siehe beiliegende Excel Mappe)
 
For Each shpInneresShape In shp.Shapes
If shpInneresShape.Name = „V“ Then
shpInneresShape.Text = blatt.Cells(i, 6).Value ‚Anzahl V
ElseIf shpInneresShape.Name = „P“ Then
shpInneresShape.Text = blatt.Cells(i, 7).Value ‚ ID
[…]
Ich hoffe sehr, dass Sie mir in diesem Problem weiterhelfen können.
###
Ich schaue mir das Problem an und schreibe:
Hallo Herr H.,
 
so wie Sie die Dateninformation Prop.P_ID überprüfen, können Sie auch die Linienfarbe LineColor setzen:
 
If blatt.Cells(i, 12).Value = “Ventil” then
shpInneresShape.Cells(„LineColor“).FormulaU = „=17“
ElseIf blatt.Cells(i, 12).Value = “Pumpe” then
shpInneresShape.Cells(„LineColor“).FormulaU = „=4“
ElseIf blatt.Cells(i, 12).Value = “Speicher” then
shpInneresShape.Cells(„LineColor“).FormulaU = „=3“
End If
 
Für Grau stehen Ihnen die Zahlen zwischen 14 und 20 zur Verfügung. Ich verwende gerne diese „alten“ Zahlen (sie stammen aus einer sehr alten Visio-Version) – Alternativ können Sie auch die Funktion RGB verwenden (ist aber umständlicher).
####
Hallo Herr Martin,
Vielen herzlichen Dank für Ihre schnelle Antwort 😊!!
Leider funktioniert die Farbänderung noch nicht wirklich – ich habe anbei eine Beispiel Visio Datei angefügt.
####
Hallo Herr H.,
ist das gemein oder einfach nur böse?
Im Ernst:
1.) in der Zelle L3 steht nicht „Ventil“, sondern „Ventil “ (ein Leerzeichen am Ende). Deshalb habe ich die Zeile
 
ElseIf blatt.Cells(i, 12).Value = „Ventil“ Then
 
geändert in:
 
ElseIf blatt.Cells(i, 12).Value Like „Ventil*“ Then
 
2.) Sie habe eine Gruppe in der Gruppe in der Gruppe in der Gruppe! Eine Gruppe hat keine Linie. Also habe ich alle Kinder und Enkel und Urenkel … formatiert.
Dann klappt es!
 
Liebe Grüße
 
Rene Martin
 
PS: ich habe auch noch ein Option Compared Text eingefügt, damit nicht zwischen Groß- und Kleinschreibung unterschieden wird.
 
Der Code:
[…]
If blatt.Cells(i, 12).Value Like „Ventil*“ Then
shpInneresShape.Cells(„LineColor“).FormulaU = „=17“ ‚ — grau
Call MacheInnenBunt(shpInneresShape, 17)
ElseIf blatt.Cells(i, 12).Value Like „Pumpe*“ Then
shpInneresShape.Cells(„LineColor“).FormulaU = „=4“ ‚ — blau
Call MacheInnenBunt(shpInneresShape, 4)
ElseIf blatt.Cells(i, 12).Value Like „Speicher*“ Then
shpInneresShape.Cells(„LineColor“).FormulaU = „=3“ ‚ — grün
Call MacheInnenBunt(shpInneresShape, 3)
End If
 
[…]
Sub MacheInnenBunt(vsShape As Shape, Farbe As Integer)
Dim i As Integer
For i = 1 To vsShape.Shapes.Count
vsShape.Shapes(i).Cells(„LineColor“).FormulaU = „=“ & CStr(Farbe)
If vsShape.Shapes(i).Shapes.Count > 0 Then
Call MacheInnenBunt(vsShape.Shapes(i), Farbe)
End If
Next
End Sub
 
 
 

Dokument durchrechnen

Hallo!
 
Ich möchte in Visio Abläufe darstellen und diese Abläufe zeitlich bewerten. Dazu wäre es sehr hilfreich, wenn die Shapes einen benutzerdefinierten Wert besitzen welche durch die Verbindungslinien immer wieder aufsummiert werden. Als Beispiel habe ich ein Bild angehängt. Geht das in Visio bzw. gibt es hier schon Lösungen?
 
Wäre schön wenn Sie mir kurz Antworten können.
 
Wünsche noch ein schönes Wochenende!
 
mfg
Hallo Herr E.,
 
kennen Sie das ShapeSheet? Man müsste dort auf der Linie zwischen 5 und 6 den Wert 5 „holen“:
In einer benutzerdefinierten Zelle oder einem Datenfeld kann man mit
=FORMAT(EVALCELL(BeginX),“@“)
den Namen des Shapes herauslösen. Okay – ein paar Funktionen fehlen noch. Dann müssten Sie den mit dem Namen einen Bezug auf seinen Text (5) herstellen:
=SHAPETEXT(AnderesShape!TheText)
Damit ist der Text, also die Nummer 5, in der Linie bekannt. Sie müsste weitergereicht werden an das Shape mit dem Wert 6. Das heißt: sie benötigen zwei verschiedene Shapes: für die Werte und die Summe und müssten Sie zwei unterschiedliche Shapes bereit stellen. Für den Verbinder ein drittes.
Abgesehen davon, dass es sehr mühsam ist, bin ich nicht sicher, ob es wirklich funktioniert.
 
Visio selbst hat an einigen Stellen Assistenten zur Verfügung gestellt, die auf Ereignisse reagieren.
 
Ich habe schon mehrmals Vorlagen für Firmen erstellt, in denen ich das „durchrechne“: in den Linien ist bekannt, an wem sie kleben (siehe oben). Und so können dann die Texte „weitergereicht“ werden.
 
Ich würde es programmieren.
 
Zu Ihrer Frage: m.W. gibt es DAFÜR noch keine Lösung.
 
Hilft Ihnen das?
 
Liebe Grüße
 
Rene Martin

Shape ersetzen

Hallo Herr Martin,
ich versuche mich die ganze Zeit an VBA und habe schon viele erfolge durch Ihre Lektüre.
Ein Problem habe ich noch welches ich weder Online noch in den Büchern finden kann.
Und zwar : will ich das „Shape ändern“ unterbinden am liebsten mit einer Message, zur Frage wie kann ich das Catchen ??
Wäre für jeden Tipp dankbar.
Liebe Grüße
Hallo M.,
Du benötigst eine Klasse mit einem Event-Handler
Private WithEvents m_shp_Seite As Visio.Page
Dann hast du das Ereignis
Private Sub m_shp_Seite_ShapeChanged(ByVal Shape As IVShape)
 
End Sub
Liebe Grüße
Rene

Menüband anpassen

Hallo Herr Martin
Es kommt wieder mal eine Frage aus der Schweiz.
Für den damaligen Kunden hatte ich mit Ihren Angaben und Ihrem Buch eine eigene Registerkarte für die Vorlage erstellt. Das hat super funktioniert. Nun gibt es noch Ergänzungen einiger zusätzlicher Schaltflächen. Nur bockt diesmal etwas.
Mein Vorgehen:
– Entpacken der vstx.
– Ich ergänze die customui.xml
– Zippen aller Daten, umbenennen zu vstx.
Ergebnis: Datei kann nicht mehr geöffnet werden. Ich habe gefühlt alles genau gleich gemacht wie beim ersten Mal. Haben Sie dazu eine Idee?
Besten Dank für einen Tipp dazu 😊
 
Freundliche Grüsse – Kind regards
Hallo Herr S.,
Achten Sie darauf, dass Sie „auf der richtigen Ebene“ sind und ALLE Ordner und die XML-Datei markiert haben, also HIER:
es könnte möglicherweise am Zippen liegen.
(wahrscheinlich haben Sie mehr Ordner)
Versuchen Sie es noch einmal, bitte!
 
schöne Grüße aus München
 
Rene Martin

Laufrichtung II

Es kam noch schlimmer. Der Auftraggeber wollte nicht nur bei waagrechten und senkrechten Pfeilen wissen, ob der Anwender in Laufrichtung nach links oder rechts schaut.
Sondern auch bei schrägen Pfeilen.
Uff: Der Winke ist schnell ermittelt: vier Quadranten: links oben, links unten, rechts oben, rechts unten. Allerdings: wende ich die x- oder die y-Position? Nun je nachdem in welcher Hälfte sich der Pfeil befindet. Also, beispielsweise: zwischen 0° und 45° ist der Pfeil „flach“ – dann verwende ich die y-Position. Von 45 bis 90°, also bei einem steilen Anstieg, die x-Position. Um zu erkennen, ob nach links oder rechts geschaut wird. Einige Fälle; ein Entscheidungsbaum wird abgearbeitet … fertig!

Laufrichtung

Für einen Auftraggeber soll ich berechnen, ob der Kunde oder die Kundin auf bestimmte Regale nach links oder nach rechts schaut. Von der Laufrichtung aus gesehen.
Gar nicht trivial – ich benötige eine Menge Fallunterscheidungen:
Wenn das Möbelstück und der zugehörige Pfeil gefunden wurde, muss geprüft werden:
* waagrecht oder senkrecht?
* ist das Ende des Pfeils oben (oder unten); linkes (oder rechts)?
* wurde der Pfeil gekippt (damit wird Anfang und Ende vertauscht)?
* wenn senkrecht, wenn Pfeil nach oben: steht das Möbelstück links oder rechts von Pfeil. Ebenso: Pfeil nach unten. Ebenso: waagrecht, Pfeil nach links oder rechts.
Erschwerend kommt hinzu, dass waagrecht heißen kann: Winkel: 0°, 180°, -180°, 360° oder -360°. Analog: 90°, -90°, 270° oder -270°
Uff – ich glaube, ich habe alle Fälle erfasst. Mal sehen, was der Kunde sagt.

Langsames Visio?

Dear guys from Microsoft,
 
may I disturb you? maybe you could help me (a better: a friend and colleague – Wolfgang) with a Visio problem. Better: with two problems.
 
1st problem: Visio 2010. Wolfgang bought a Visio license in 2018 and used that program from that time on. He created VBA-routines, which were becoming slower and slower from day to day. Well – the code needs a lot of performance, but – becoming slower? … Unfortunately – his experience – also Visio 2013, 2016 and Visio in Microsoft 365 is not better.
 
If you want to have a closer look what he is doing – you find the ideas on:
 
https://www.transport-simulation.de/
 
We suppose, that the last Windows update, which took place on June, 8th 2020 – number of the version: 14.0.7015.1000, on the main computer produced that problem, because on a laptop (without this update), Visio works much more faster. Unfortunately this version on the main computer is irreversible …
 
Do you have idea how to deactivate this version, how to reset …?
 
2nd problem: On another computer Visio 2010 cannot be started – same key, same build, completely locked with the alert: “Invalid product key – please activate Office” (of course: in German)
 
Do you have any idea? Could you please help Wolfgang.
 
And certainly – you can address directly to
 
thanks
 
regards from Munich
 
René

Daten nach Excel mit VBA exportieren

Schritt X
Die Hauptschwierigkeit ist sicherlich das Einsammeln der Daten. Man kann sie in Excel in Shapes auflisten (als Text, wie beschrieben). Oder nach Excel oder eine Datenbank schreiben. Der Kunde wollte Excel:
Set xlApp = CreateObject(„Excel.Application“)
xlApp.Visible = False
Set xlDatei = xlApp.Workbooks.Add
Set xlBlatt = xlDatei.WorkSheets(1)
[…]
For i = 0 To intAnzahlDaten
xlBlatt.Cells(1, i + 1).Value = Split(strUeberschrift, „|“)(i)
Next
‚ — Überschrift
For i = 0 To intGruppe1 – 1
xlBlatt.Cells(1, intAnzahlDaten + i + 1).Value = ActivePage.PageSheet.Cells(„User.TextBox“ & (28 + i)).ResultStrU(„“)
Next i
For i = 0 To intGruppe2 – 1
xlBlatt.Cells(1, intAnzahlDaten + intGruppe1 + i + 1).Value = ActivePage.PageSheet.Cells(„User.TextBox“ & (32 + i)).ResultStrU(„“)
Next i
For i = 0 To intGruppe3 – 1
xlBlatt.Cells(1, intAnzahlDaten + intGruppe1 + intGruppe2 + i + 1).Value = ActivePage.PageSheet.Cells(„User.TextBox“ & (36 + i)).ResultStrU(„“)
Next i
Klappt!

Keine Fotobeschreibung verfügbar.