PDA

Vollständige Version anzeigen : Quelle eines Diagramms auslesen


adison29
05.10.2016, 08:28
Guten Morgen,

ich habe ein kleines Problem. Ich habe mehrere Diagramme in einer Arbeitsmappe welche aus einer anderen Arbeitsmappe ihre Daten beziehen.

Da der Name der Arbeitsmappe, aus der die Daten bezogen werden sich häufig ändert, würde ich gerne per vba die Verknüpfung zu dieser Arbeitsmappe auslesen und diese öffnen, im falle eines Doppelklicks auf das jeweilige Diagramm.

Ich finde einfach keine Möglichkeit die Verknüpfung auszulesen.

danke im voraus

Gruß
Adrian

Beverly
05.10.2016, 10:19
Hi Adrian,

nach diesem Prinzip:

Sub MappeErmitteln()
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
If InStr(.Formula, "[") > 0 Then
MsgBox Mid(Split(.Formula, ",")(2), 2, InStr(Split(.Formula, ",")(2), "]") - 2)
Else
MsgBox "Diagramm befindet sich in aktiver Mappe"
End If
End With
End Sub



<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

adison29
05.10.2016, 10:30
Danke für die schnelle Antwort, bekomme leider einen Laufzeitfehler

Beverly
05.10.2016, 14:05
An welcher Stelle im Code und was sagt der Debugger genau?

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

adison29
06.10.2016, 12:24
habe das Problem gelöst

adison29
06.10.2016, 12:26
jetzt gibt es ein neues Problem und zwar gibt es die Möglichkeit Diagramme wieder zu löschen per vba. Die Diagramme haben zwar die gleich größe wie die Zelle und sind genau zentriert, jedoch sind sie ja nicht "in" der Zelle sondern eine Ebene darüber.
gibt es eine Möglichkeit die Diagramme über Range() zu erreichen ?

Beverly
06.10.2016, 12:53
Wo lag denn nun das Problem mit dem Laufzeitfehler?

Diagrammobjekte haben eine Eigenschaft, die nennt sich TopLeftCell - daran kannst du erkennen, auf welcher Zelle die linke obere Ecke liegt.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

adison29
06.10.2016, 13:02
War ein fehler bei mir hatte beim ChartObject() in der klammer was falsch eingegeben dein code war richtig ;)

adison29
06.10.2016, 13:10
TopLeftCell habe ich noch nie gehört.
Als Beispiel möchte ich alles in .Range(ActiveCell.Column & ActiveCell.Row : ActiveCell.Column & ActiveCell.Row+5) alle Diagramme löschen

Wie und wo kommt jetzt TopLeftCell zum Einsatz? kann ich darüber mit select die Diagramme in diesem Bereich erreichen wenn ja wie ? wäre super wenn du mir vllt ein Beispiel code geben könntest :)

adison29
06.10.2016, 13:17
Also das wäre mein erster lösungsansatz, welcher leider nicht funktioniert
Set rngChart = Range("J8:M8")

For Each aChart In ActiveSheet.Chart
Debug.Print aChart.Name; vbTab; aChart.TopLeftCell.Address
If Not Intersect(aChart.TopLeftCell, rngChart) Is Nothing Then
aChart.Delete
End If
Next aChart

adison29
06.10.2016, 13:31
So habe etwas abgeändert und die Diagramme werden gelöscht. doch nacht dem letzten Diagramm bekomme ich einen Laufzeitfehler '1004'

Application.ScreenUpdating = False
Dim objShape As Shape
For Each objShape In ActiveWorkbook.Worksheets("Q-Teileverfolgungsliste").Shapes
If Not Application.Intersect(objShape.TopLeftCell, ActiveWorkbook.Worksheets("Q-Teileverfolgungsliste").Range("J8:N8")) Is Nothing Then ' Hier bekomme ich einen Laufzeitfehler
objShape.Delete
End If
Next

Luschi
06.10.2016, 19:18
Hallo adison29,

in Excel gehören auch andere graphische Elemente (z.B. Steuerelemente) zur Gruppe der Shapes.
Deshalb sollte man prüfen, ob es sich um ein Diagramm (msoChart) handelt.Dim objShape As Shape

Application.ScreenUpdating = False
For Each objShape In ActiveWorkbook.Worksheets("Q-Teileverfolgungsliste").Shapes
'Debug.Print objShape.Type, objShape.TopLeftCell.Address
'Abfrage, ob es sich bei objShape um ein Diagramm handelt
If objShape.Type = msoChart Then
If Not (Application.Intersect(objShape.TopLeftCell, _
ActiveWorkbook.Worksheets("Q-Teileverfolgungsliste").Range("J8:N8")) _
Is Nothing) Then ' Hier bekomme ich einen Laufzeitfehler
objShape.Delete
End If
End If
Next
Application.ScreenUpdating = TrueGruß von Luschi
aus klein-Paris

Beverly
06.10.2016, 19:37
Hi,

hier hast du ja bereits eine Lösung bekommen: http://www.ms-office-forum.net/forum/showthread.php?t=336117

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Beverly
06.10.2016, 19:40
Deshalb sollte man prüfen, ob es sich um ein Diagramm (msoChart) handelt.


Bei Diagrammen ist das nicht erforderlich, da man Deagrammobjekte mittels ChartObject von anderen Shapes unterscheiden und somit zielgerichtet ansprechen kann.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>