Herbers Excel-Forum - das Archiv

in Diagramm Pfeile einfügen per VBA

Bild

Betrifft: in Diagramm Pfeile einfügen per VBA
von: Herby

Geschrieben am: 17.12.2006 16:52:09
Hallo Freaks und Spezialisten,
für folgendes Excel-Problem/Mathematik-Problem finde ich keine Lösung.
Ich habe eine Tabelle mit 2 Zahlenreihen. Aus diesen erstelle ich einen XY-Chart. Der Chart ist im gleichen Tabellenblatt wie die Quelldaten. Soweit kein Problem. Nun möchte ich, dass per VBA vom 1. Punkt zum 2. Punkt ein "Pfeil (Shape - Linie) gezogen wird. Vom 2. Punkt zum 3. Punkt ein weiterer Pfeil. usw. bis zum letzten Punkt. Die Erstellung von Pfeilen ist auch noch nicht das Problem. Das funktioniert noch.
Mein Problem liegt darin, dass ich die Koordinaten der Pfeile nicht ermitteln kann, um sie im Chart richtig zu platzieren. Dazu muß ich die Werte für den Chart umrechnen in Werte, die ich als Koordinaten für die Pfeile verwenden kann.
Wie funktioniert so eine Umrechnung ?
Ich hab mal ein Beispiel gemacht und beigefügt. Vielleicht hat einer von Euch eine Idee, wie so was geht (für mich ist es zu viel Mathematik).
https://www.herber.de/bbs/user/39071.xls
Danke für Euer Interesse an meinem Problem
Herby
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: fcs

Geschrieben am: 17.12.2006 17:50:28
Hallo Herby,
die Rechenarbeit kann ich dir auch nicht abnehmen (ist für mich massen mäßig auch zuviel Mathematik).
Um die X-Y-Koordinaten der Punkte innerhalb des Diagramms zu ermitteln kannst du etwa wie folgt rechen:
X-Koordinate = X-Pos(Zeichnungsfläche_im_Diagramm) + Breite_der_Zeichnungsfläche * (X_Wert_Punkt - Xmin)/ (Xmax - Xmin)
Xmin und Xmax sind die obere und untere Grenze der X-Achse
Der Y-wert ist etwas kompliierter, da die 0-0-Koordinate des Diagramms in der linken oberen Ecke ist.
Y-Koordinate = Y_Pos(Zeichnungsfläche_im_Diagramm) + Höhe_der_Zeichnungsfläche * (1-(Y_Wert_Punkt - Ymin)/ (Ymax - Ymin))
Ymin und Ymax sind die obere und untere Grenze der Y-Achse
Die erforderlichen Werte der Diagrammelemente müssten jeweils aus den Eigenschaften Top, Left, Width und Height ermittelt werden können. Die Bezeichnungen für die Min/Max-Were der Achsen kenne ich nicht, die müsstes du ggf. durch Aufzeichnen eines MAkros ermitteln, in dem du diese Eigenschaften festlegst bzw. änderst.
Evtl. helfen dir meine Überlegungen/Vorschläge ja weiter.
Gruss
Franz
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: Herby

Geschrieben am: 17.12.2006 20:32:07
Hallo Franz,
vorab Danke dass Du Dich mit meinem Problem beschäftigt hast und mir die Lösung zur Verfügung stellst. Leider habe ich dabei noch Verständnisprobleme. Vielleicht kannst Du mir nochmals helfen.
X-Koordinate -> ist das der Wert lt. der Excel-Tabelle dh. der Quellwert von X oder ???????
X-Pos(Zeichnungsfläche_im_Diagramm) -> ist der X-Wert im Diagramm (in Pkten) , also der Wert, den ich suche ?????????????????
Breite_der_Zeichnungsfläche ->
ActiveChart.PlotArea.InsideWidth - ActiveChart.PlotArea.Left
X_Wert_Punkt -> welchen Wert muss ich hier berücksichtigen ????
Xmin -> Minimumwert der X-Achse:
ActiveChart.Axes(xlCategory).MinimumScale
Xmax -> Maximumwert der X-Achse:
ActiveChart.Axes(xlCategory).MaximumScale
Viele Grüße
Herby
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: fcs

Geschrieben am: 17.12.2006 22:24:46
Hallo Herby,
X-Koordinate = X-Pos(Zeichnungsfläche_im_Diagramm) + Breite_der_Zeichnungsfläche * (X_Wert_Punkt - Xmin)/ (Xmax - Xmin)
X-Koordinate: Ist die horizontale Position des Punktes im Diagramm gemessen vom Linken Rand des Diagramms
X-Pos(Zeichnungsfläche_im_Diagramm): Ist der Abstand des Linken Rands der Zeichnungsfläche (PlotArea) vom linen Rand des Diagramms (ChartArea)
X_Wert_Punkt: Ist der X-Wert gemäß Tabelle in Spalte A
Kleines Problem: Auf die Skalierungs-Information der Achsen kann per VBA nur zugegriffen werden wenn die Achsen angezeigt werden
Für die PlotArea werden InsideWidth bzw. InsideHeight identisch mit Width und Height wenn die Achsenbeschriftung ausgeblendet wird. Bei eingebledeter Beschriftun läßt sich die Position der inneren Zeichnungsfläche praktisch nicht bestimmen, da sie von der Größe der beschriftung abhängt.
Gruss
Franz
Sub DiagrammInformationen()
Dim Diag As ChartObject, text As String
DiagrammName = "Diagramm 5"
Set Diag = ActiveSheet.ChartObjects(DiagrammName)
text = "Diagramm-Position im Tabellenblatt"
text = text & vbLf & "Linkerrand Diagramm = " & ActiveSheet.Shapes(DiagrammName).Left
text = text & vbLf & "oberer Rand Diagramm = " & ActiveSheet.Shapes(DiagrammName).Top
text = text & vbLf & "Beite Diagramm = " & ActiveSheet.Shapes(DiagrammName).Width
text = text & vbLf & "Höhe Diagramm = " & ActiveSheet.Shapes(DiagrammName).Height
text = text & vbLf & "Daten der Diagrammfläche, Positon relativ zum linken/oberen Rand des Diagrammobjektes"
text = text & vbLf & "Linkerrand Diagrammfläche = " & Diag.Chart.ChartArea.Left
text = text & vbLf & "oberer Rand Diagrammfläche = " & Diag.Chart.ChartArea.Top
text = text & vbLf & "Beite Diagrammfläche = " & Diag.Chart.ChartArea.Width
text = text & vbLf & "Höhe Diagrammfläche = " & Diag.Chart.ChartArea.Height
text = text & vbLf & "Daten der Zeichenungsfläche, Positon relativ zum linken/oberen Rand der Diagrammfläche"
text = text & vbLf & "Linkerrand Zeichenungsfläche = " & Diag.Chart.PlotArea.Left
text = text & vbLf & "oberer Rand Zeichenungsfläche = " & Diag.Chart.PlotArea.Top
text = text & vbLf & "Beite Zeichenungsfläche = " & Diag.Chart.PlotArea.Width
text = text & vbLf & "Höhe Zeichenungsfläche = " & Diag.Chart.PlotArea.Height
text = text & vbLf & "Daten der X- und Y-Achse, Anzeige nur möglich, wenn Achsen eingeblendet sind"
Diag.Chart.HasAxis(xlCategory, xlPrimary) = True
Diag.Chart.HasAxis(xlValue, xlPrimary) = True
text = text & vbLf & "X-Minwert = " & Diag.Chart.Axes(xlCategory).MinimumScale
text = text & vbLf & "X-Maxwert =  = " & Diag.Chart.Axes(xlCategory).MaximumScale
text = text & vbLf & "Y-Minwert =  = " & Diag.Chart.Axes(xlValue).MinimumScale
text = text & vbLf & "Y-Maxwert = " & Diag.Chart.Axes(xlValue).MaximumScale
Diag.Chart.HasAxis(xlCategory, xlPrimary) = False
Diag.Chart.HasAxis(xlValue, xlPrimary) = False
MsgBox text
End Sub

Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: Herby

Geschrieben am: 17.12.2006 23:42:03
Hallo Franz,
D A N K E
für die umfangreiche Info. Jetzt weiss ich auch warum PlotArea.Width größer ist als PlotArea.InsideWidth und vorallem dass es von der Beschriftung der Achsen abhängt.
Jetzt muss ich "nur noch" probieren, ob ich die Pfeile so hinbringe wie ich mir das vorstelle. Falls nicht, melde ich mich wieder.
Viele Grüße
Herby
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: ingUR

Geschrieben am: 17.12.2006 20:37:09
Hallo, Herby,
neben der von Franz vorgestellten Möglichkeit, kannst Du auch in Deinem Fall den Excel4Marco-Aufruf
ExecuteExcel4Macro(xy, 2, DatenPunktSerie)
benutzen, um die Koordiniaten eines Datenpunktes zu ermitteln.
xy = 1 oder 2 ist dabei danach zu setzen, ob die x Ordinate (xy=1) oder die y Ordinate (xy=2) ermittelt werden soll.
Der Wert 2 steht in diesem Fall gleichberechtig neben den Werten 1 bis 8, wo es um einen Punkt geht. Für Säulen sind hier die entsprechenden Marken (Ecken/Mittelpunkte der Seiten von 1 bis 8 numeriert) anzugeben, die als Bezugspunkt für den zu ermitteden Koordinaten gelten sollen.
Die Angabe des Datenpunktes aus einer Serie ist als Textwert in der Form SjPi mit j für die Seriennummer in Chart und i der Punktnummer. Der Text 1,2,"S1P3" als Parameter in der Funktion GET.CHAT.ITEM, fordert also die x-Koordinate des dritten Datenpunktes in der Datenreihe 1 an (bei Säulendiagramme wäre es die Mitte der oberen Säulenrechteckseite).
Hier ein Grundgerüst, da mir momentan die Zeit fehlt, die ungereimtheiten im Code auszumerzen. Es wäre schön, wenn Du, so der Weg Deinen Vorstellungen entspricht, die erforderlichen Richtigstellungen und Erweiterungen vornehmen könntest und das Ergebnis veröffentlichst.
Option Explicit
Sub DrawArrows()
Dim ws As Worksheet, chtChart As Chart
Dim rngAllPXY As Range, rngPXY As Range
Dim dX0 As Double, dY0 As Double, dX1 As Double, dY1 As Double
Dim p As Integer, strP As String, strPX As String, strPY As String
Set rngAllPXY = Range("A2:A16")
Set ws = Worksheets("Tabelle1")
ws.ChartObjects(1).Activate
Set chtChart = ws.ChartObjects(1).Chart
With chtChart
For Each rngPXY In rngAllPXY
dX0 = dX1
dY0 = dY1
p = p + 1
strPX = "GET.CHART.ITEM(1,1," & Chr(34) & "S1P" & p & Chr(34) & ")"
strPY = "GET.CHART.ITEM(2,1," & Chr(34) & "S1P" & p & Chr(34) & ")"
dX1 = ExecuteExcel4Macro(strPX)
dY1 = ExecuteExcel4Macro(strPY)
'Kontrollausgabe der gelesenen X1/Y1-Werte (XLM-Koordinaten)
'Startpunkt des Peiles
ws.Cells(20 + p, 1) = dX1
ws.Cells(20 + p, 2) = (.ChartArea.Height) - dY1
If p > 1 Then
'Kontrollausgabe der Differenzen (Pfeil.H.Weite und Pfeil.V.Höhe)
ws.Cells(20 + p, 3) = dX1 - dX0
ws.Cells(20 + p, 4) = dY0 - dY1
.Shapes.AddShape msoShapeRightArrow, dX0, (.ChartArea.Height) - dY0, dX1 - dX0, dY0 - dY1
'"Formatierungs"-Anweisungen für den Pfeil
End If
Next
End With
Range("A1").Select
Set rngAllPXY = Nothing
Set ws = Nothing
End Sub
Ich hoffe dass Du eine vollständige Lösung findest, denn das Ergebnis interessiert mich für eigene Anwendungen.
Gruß,
Uwe
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: ingUR

Geschrieben am: 17.12.2006 22:21:22
Hallo, Herby,
Nicht das msoShapeRightArrow-Objekt ist zu verwenden, sondern es ist mit Linien zu arbeiten (mein Fehler, als ich in der Auswahlliste Arrow sah, hab' ich nicht weiter überlegt)
Ergänze und ändere also bitte ab:
    Dim shpL As Shape
Set shpL = .Shapes.AddLine(dX0, (.ChartArea.Height) - dY0, dX1, (.ChartArea.Height) - dY1)
With shpL.Line
.EndArrowheadStyle = msoArrowheadTriangle
.EndArrowheadLength = msoArrowheadLengthMedium
.EndArrowheadWidth = msoArrowheadWidthMedium
End With
Diese ausführbaren Anweisungen stehen für die zu löschende Zeile
.Shapes.AddShape msoShapeRightArrow, dX0, (.ChartArea.Height) - dY0, dX1 - dX0, dY0 - dY1
Gruß,
Uwe
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: Herby

Geschrieben am: 17.12.2006 23:49:48
Hallo Uwe,
auch Dir einen Herzlichen Dank für die Infos. Ich habe das rawArrows Makro mal laufen lassen. Die Pfeile werden waagrecht dargestellt. Deine weitere Info habe ich noch nicht verarbeiten können. Ich muss mich mit dem gesamten Thema (insbes. mit dem Excel4Makro) noch intensiver beschäftigen. Falls ich eine funktionierende Lösung hinbringe, melde ich mich bei Dir.
Viele Grüße und nochmals Danke !!
Herby
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: ingUR

Geschrieben am: 18.12.2006 00:21:25
Hallo, Herby,
hier die verbesserte Gesamtprozedur, die die aufeinanderfolgenden Punkte eines Graphen durch einen gerichteten Pfeil verbinden.
Option Explicit
Sub DrawArrows()
Dim ws As Worksheet, chtChart As Chart, shpL As Shape
Dim rngAllPXY As Range, rngPXY As Range
Dim dX0 As Double, dY0 As Double, dX1 As Double, dY1 As Double
Dim p As Integer, strP As String, strPX As String, strPY As String
Set rngAllPXY = Range("A2:A16")
Set ws = Worksheets("Tabelle1")
ws.ChartObjects(1).Activate
Set chtChart = ws.ChartObjects(1).Chart
With chtChart
For Each rngPXY In rngAllPXY
dX0 = dX1
dY0 = dY1
p = p + 1
strPX = "GET.CHART.ITEM(1,1," & Chr(34) & "S1P" & p & Chr(34) & ")"
strPY = "GET.CHART.ITEM(2,1," & Chr(34) & "S1P" & p & Chr(34) & ")"
dX1 = ExecuteExcel4Macro(strPX)
dY1 = ExecuteExcel4Macro(strPY)
'Kontrollausgabe der gelesenen X1/Y1-Werte (XLM-Koordinaten)
'Startpunkt des Peiles
ws.Cells(20 + p, 1) = dX1
ws.Cells(20 + p, 2) = (.ChartArea.Height) - dY1
If p > 1 Then
'Kontrollausgabe der Differenzen (Pfeil.H.Weite und Pfeil.V.Höhe)
ws.Cells(20 + p, 3) = dX1 - dX0
ws.Cells(20 + p, 4) = dY0 - dY1
Set shpL = .Shapes.AddLine(dX0, (.ChartArea.Height) - dY0, dX1, (.ChartArea.Height) - dY1)
With shpL.Line
.EndArrowheadStyle = msoArrowheadTriangle
.EndArrowheadLength = msoArrowheadLengthMedium
.EndArrowheadWidth = msoArrowheadWidthMedium
End With
Set shpL = Nothing
End If
Next
End With
Range("A1").Select
Set rngAllPXY = Nothing
Set ws = Nothing
End Sub

Das Makro zum Löschen dieser Shapes muß noch geschrieben werden.
Guß,
Uwe
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: Herby

Geschrieben am: 19.12.2006 22:58:17
Hallo Uwe,
vielen Dank für Deinen nochmals überarbeiteten Code. Ich habs probiert und es funktioniert soweit problemlos. Wenn ich allerdings den Datenbereich erweitere (z.B. A2:A18)gibts in der Zeile:
dX1 = ExecuteExcel4Macro(strPX)
den Laufzeitfehler 13 / Typen unverträglich.
Nun würde ich gerne wissen ob bei Dir auch dieser Fehler auftritt. In der Excel-Hilfe zu den Excel4Macros (XLMACR8.HLP) hab ich jedenfalls keine Einschränkung gefunden.
Viele Grüße
Herby
Bild

Betrifft: AW: in Diagramm Pfeile einfügen per VBA
von: ingUR

Geschrieben am: 20.12.2006 14:08:02
Hallo, Herby,
es hat den Anschein, als wenn ein unterschiedliches Erweitern der Diagrammdaten (via Ziehen, =(DATENREIHEN(...)-editieren, VBA mit Anzahl der Pfiele aus Zelleninhalt zum dynamischen Setzen der rngPXY) unterschiedlich intern verwaltet wird. Fakt scheint zu sein, nach dem manuellen Verändern der Punktanzahl, das letzte Element der Range nicht korrekt erfaßt wird, den erst bei diesem kommte es zum 13-Fehler (siehe p im Debbugmodus).
Auf jeden Fall ist wohl nicht von der Hand zu weisen, dass hier im Falle der manuellen Veränderung nicht "sauber" - wo auch immer - programmiert worden ist, denn die Sache funktioniert, je nachdem, welches Verfahren man benutzt.
Ein Erfolg kann erzielt werden, wenn die Datenreihe vor dem Aufruf der Punktabfrage, per VBA "aktuallisiert" wird.
Werde mich wohl noch ein wenig mit der Besonderheit beschäftigen müssen, wenn ich hier ein Resultat liefern sollte. Jedoch meine ich, dass Du vielleicht in Deinem Gesamtprojekt die bessere Möglichkeit hast, einen geeigneten Weg für die Veränderung der Datenmenge einzubauen.
Gruß,
UWe
 Bild
Excel-Beispiele zum Thema "in Diagramm Pfeile einfügen per VBA"
Diagramm in Userform Export von Diagrammen im Grafikformat
Diagramm aus Arbeitsblatt in Diagrammblatt übertragen Balkendiagramm simulieren
Diagramm aus Daten einer Bandbreite bilden Diagramm-Datenreihen blinken lassen und Linie langsam zeichnen
Diagramm exportieren und in Tabellenblatt importieren Eine Serie von Diagrammen erstellen und Druckansicht zeigen
Diagramm-Datenbereich über Schaltfläche festlegen Mit einer Diagramm-Bildlaufleiste durch Tabelle bewegen