Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
796to800
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
796to800
796to800
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA Problem mit Diagramm (DataLabel)

VBA Problem mit Diagramm (DataLabel)
06.09.2006 19:16:19
Peter
Hallo,
ich habe ein XY-Punktdiagramm ("Pflanzungs-Karte") auf dem mit Hilfe des folgenden Codes bei Maus-Klick auf einen Punkt, Punktspezifische Informationen aus dem Tabellenblatt "Hilfe", Spalte A, ab A4, angezeigt werden. Ich weiss leider nicht wie ich es schaffe, dass das Datenfenster, egal welchen Punkte ich angeklickt habe, immer an einer bestimmten Position erscheint.
Die Sache mit den Konstanten Positionen, z.B.:
.DataLabel.Position = xlLabelPositionOutsideEnd
funktioniert nicht und reicht auch nicht aus. Was kann man da machen?
mein Code:

Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal y As Long)
Dim ElementID As Long, Arg1 As Long, Arg2 As Long
Dim myX As Variant, myY As Double
' kurzzeitig die Aktualisierung der Darstellung unterbrechen
Application.ScreenUpdating = False
With ActiveChart
' Pass x & y, return ElementID and Args
.GetChartElement X, y, ElementID, Arg1, Arg2
'If ElementID = xlShape Then
'MsgBox ("Elemetid: " & ElementID & "...Arg1:" & Arg1 & "...Arg2:" & agr2)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").ControlFormat.Value)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").Type)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").FormControlType)
'If Charts("Pflanzungs-Karte").Shapes("Drop Down 5").FormControlType = xlDropDown Then
'If Charts("Pflanzungs-Karte").Shapes("Drop Down 5").Type = msoFormControl Then
'MsgBox ("Drop down")
'End If
'End If
' Did we click over a point or data label?
If ElementID = xlSeries Or ElementID = xlDataLabel Then
If Arg2 > 0 Then
' Extract x value from array of x values
myX = WorksheetFunction.index _
(.SeriesCollection(Arg1).XValues, Arg2)
' Extract y value from array of y values
myY = WorksheetFunction.index _
(.SeriesCollection(Arg1).Values, Arg2)
' Display message box with point information
'  MsgBox "Series " & Arg1 & vbCrLf _
'    & """" & .SeriesCollection(Arg1).Name & """" & vbCrLf _
'    & "Point " & Arg2 & vbCrLf _
'    & "X = " & myX & vbCrLf _
'    & "Y = " & myY
' Informationen des letzten angeklickten Punktes nicht mehr anzeigen
If altx <> 0 And alty <> 0 Then
With Charts("Pflanzungs-Karte").SeriesCollection(altx).Points(alty)
.HasDataLabel = False
End With
End If
' Informationen des aktuell angeklickten Punktes anzeigen
With Charts("Pflanzungs-Karte").SeriesCollection(Arg1).Points(Arg2)
.HasDataLabel = True
'die Beschriftung des Datensatzes als Text ausgeben
'.ApplyDataLabels Type:=xlDataLabelsShowLabel
' Text des Labels frei definieren:
' Text aus der Spalte J (in entsprechender Zeile) holen
.DataLabel.Text = Worksheets("Hilfe").Range("A" & Arg2 + 3)
'Position des DataLabels
.DataLabel.Position = xlLabelPositionOutsideEnd
' Schriftgrösse fest auf 8 einstellen
.DataLabel.Font.Size = 8
' Farbe des Textes setzen (1=schwarz)
.DataLabel.Font.ColorIndex = 1
End With
' aktuelle Werte für den nächsten klick merken
altx = Arg1
alty = Arg2
' Select auf das gesamte Diagramm setzen, damit die Punkte nicht Lila sind
ActiveChart.ChartArea.Select
End If
End If
End With
' Aktualisierung der Darstellung wieder anschalten
Application.ScreenUpdating = True
End Sub

Grüße aus Berlin

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Problem mit Diagramm (DataLabel)
06.09.2006 20:17:04
Rudi
Hi,
das Datalabel hat die Eigenschaften Top und Left, darüber kannst du es positionieren.
mfg Rudi
AW: VBA Problem mit Diagramm (DataLabel)
07.09.2006 11:16:23
Peter
Hallo,
ich habs mit folgenden Codes probiert, funktioniert leider nicht. Wie ist es richtig und an welcher Stelle im ganzen Code muss das stehen?
1.
For Each chtLabel In chtSeries.DataLabels
chtLabel.Top = chtLabel.Top - 10
chtLabel.Left = chtLabel.Left + 10
2.
For Each xlColPoint In _
xlChartObj.SeriesCollection(1).Points
xlColPoint.DataLabel.Top = _
xlColPoint.DataLabel.Top - 10
xlColPoint.DataLabel.Left = _
xlColPoint.DataLabel.Left + 10
Next xlColPoint
gesamter Code:

Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal y As Long)
Dim ElementID As Long, Arg1 As Long, Arg2 As Long
Dim myX As Variant, myY As Double
' kurzzeitig die Aktualisierung der Darstellung unterbrechen
Application.ScreenUpdating = False
With ActiveChart
' Pass x & y, return ElementID and Args
.GetChartElement X, y, ElementID, Arg1, Arg2
'If ElementID = xlShape Then
'MsgBox ("Elemetid: " & ElementID & "...Arg1:" & Arg1 & "...Arg2:" & agr2)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").ControlFormat.Value)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").Type)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").FormControlType)
'If Charts("Pflanzungs-Karte").Shapes("Drop Down 5").FormControlType = xlDropDown Then
'If Charts("Pflanzungs-Karte").Shapes("Drop Down 5").Type = msoFormControl Then
'MsgBox ("Drop down")
'End If
'End If
' Did we click over a point or data label?
If ElementID = xlSeries Or ElementID = xlDataLabel Then
If Arg2 > 0 Then
' Extract x value from array of x values
myX = WorksheetFunction.index _
(.SeriesCollection(Arg1).XValues, Arg2)
' Extract y value from array of y values
myY = WorksheetFunction.index _
(.SeriesCollection(Arg1).Values, Arg2)
' Display message box with point information
'  MsgBox "Series " & Arg1 & vbCrLf _
'    & """" & .SeriesCollection(Arg1).Name & """" & vbCrLf _
'    & "Point " & Arg2 & vbCrLf _
'    & "X = " & myX & vbCrLf _
'    & "Y = " & myY
' Informationen des letzten angeklickten Punktes nicht mehr anzeigen
If altx <> 0 And alty <> 0 Then
With Charts("Pflanzungs-Karte").SeriesCollection(altx).Points(alty)
.HasDataLabel = False
End With
End If
' Informationen des aktuell angeklickten Punktes anzeigen
With Charts("Pflanzungs-Karte").SeriesCollection(Arg1).Points(Arg2)
.HasDataLabel = True
'die Beschriftung des Datensatzes als Text ausgeben
'.ApplyDataLabels Type:=xlDataLabelsShowLabel
' Text des Labels frei definieren:
' Text aus der Spalte J (in entsprechender Zeile) holen
.DataLabel.Text = Worksheets("Hilfe").Range("A" & Arg2 + 3)
' Schriftgrösse fest auf 8 einstellen
.DataLabel.Font.Size = 8
' Farbe des Textes setzen (1=schwarz)
.DataLabel.Font.ColorIndex = 1
' Positionieren der Punkte
For Each xlColPoint In _
xlChartObj.SeriesCollection(1).Points
xlColPoint.DataLabel.Top = _
xlColPoint.DataLabel.Top - 11
xlColPoint.DataLabel.Left = _
xlColPoint.DataLabel.Left - 11
Next xlColPoint
End With
' aktuelle Werte für den nächsten klick merken
altx = Arg1
alty = Arg2
' Select auf das gesamte Diagramm setzen, damit die Punkte nicht Lila sind
ActiveChart.ChartArea.Select
End If
End If
End With
' Aktualisierung der Darstellung wieder anschalten
Application.ScreenUpdating = True
End Sub

Anzeige
AW: VBA Problem mit Diagramm (DataLabel)
10.09.2006 15:07:27
K.Rola
Hallo,
mal ein Beispiel, wie es prinzipiell geht:
Option Explicit
Sub Ausrichten()
Dim ch As Chart, pts As Byte, p As Byte, T As Single, L As Single
L = 20 'Die Left-Position
T = 20 'Die Top-Position
Set ch = ActiveSheet.ChartObjects(1).Chart
pts = ch.SeriesCollection(1).Points.Count
For p = 1 To pts
With ch.SeriesCollection(1).Points(p).DataLabel
.Top = T
.Left = L
End With
'Wenn nicht alle an derselben Left-Position sein sollen
L = L + 20
Next
End Sub
Gruß K.Rola

Problem anders gelöst
10.09.2006 16:33:41
Peter
Hallo,
ich könnte das Problem anders lösen. Ich habe einfach eine Text Box an die Stelle positioniert die ich möchte. Dann lasse ich über den Umweg Select die Daten in der Text Box erscheinen.
Code:
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Visible = True
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Select
Selection.Characters.Text = Worksheets("Hilfe").Range("A" & Arg2 + 3)
gesamter Code:

Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal y As Long)
Dim ElementID As Long, Arg1 As Long, Arg2 As Long
Dim myX As Variant, myY As Double
' kurzzeitig die Aktualisierung der Darstellung unterbrechen
Application.ScreenUpdating = False
With ActiveChart
' Pass x & y, return ElementID and Args
.GetChartElement X, y, ElementID, Arg1, Arg2
'If ElementID = xlShape Then
'MsgBox ("Elemetid: " & ElementID & "...Arg1:" & Arg1 & "...Arg2:" & agr2)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").ControlFormat.Value)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").Type)
'MsgBox (Charts("Pflanzungs-Karte").Shapes("Drop Down 5").FormControlType)
'If Charts("Pflanzungs-Karte").Shapes("Drop Down 5").FormControlType = xlDropDown Then
'If Charts("Pflanzungs-Karte").Shapes("Drop Down 5").Type = msoFormControl Then
'MsgBox ("Drop down")
'End If
'End If
' Did we click over a point or data label?
If ElementID = xlSeries Or ElementID = xlDataLabel Then
If Arg2 > 0 Then
' Extract x value from array of x values
myX = WorksheetFunction.index _
(.SeriesCollection(Arg1).XValues, Arg2)
' Extract y value from array of y values
myY = WorksheetFunction.index _
(.SeriesCollection(Arg1).Values, Arg2)
' Display message box with point information
'  MsgBox "Series " & Arg1 & vbCrLf _
'    & """" & .SeriesCollection(Arg1).Name & """" & vbCrLf _
'    & "Point " & Arg2 & vbCrLf _
'    & "X = " & myX & vbCrLf _
'    & "Y = " & myY
' Informationen des letzten angeklickten Punktes nicht mehr anzeigen
'If altx <> 0 And alty <> 0 Then
'    With Charts("Pflanzungs-Karte").SeriesCollection(altx).Points(alty)
'    .HasDataLabel = False
'    End With
'End If
' Informationen des aktuell angeklickten Punktes anzeigen
'With Charts("Pflanzungs-Karte").SeriesCollection(Arg1).Points(Arg2)
'.HasDataLabel = True
'die Beschriftung des Datensatzes als Text ausgeben
'.ApplyDataLabels Type:=xlDataLabelsShowLabel
' Text des Labels frei definieren:
' Text aus der Spalte J (in entsprechender Zeile) holen
'.DataLabel.Text = Worksheets("Hilfe").Range("A" & Arg2 + 3)
' Schriftgrösse fest auf 8 einstellen
'.DataLabel.Font.Size = 8
' Farbe des Textes setzen (1=schwarz)
'.DataLabel.Font.ColorIndex = 1
'End With
' aktuelle Werte für den nächsten klick merken
altx = Arg1
alty = Arg2
' NEU NEU NEU NEU NEU
' In die Textbox den Text eintragen
If .Shapes("Check Box 21").ControlFormat.Value = 1 Then
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Visible = True
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Select
Selection.Characters.Text = Worksheets("Hilfe").Range("A" & Arg2 + 3)
Else
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Visible = False
End If
Else
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Visible = False
End If
' Select auf das gesamte Diagramm setzen, damit die Punkte nicht Lila sind
ActiveChart.ChartArea.Select
Else
Charts("Pflanzungs-Karte").Shapes("Text Box 87").Visible = False
End If
End With
' Aktualisierung der Darstellung wieder anschalten
Application.ScreenUpdating = True
End Sub

Grüße aus Berlin
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige