173 Aufrufe
Gefragt in Tabellenkalkulation von

Guten Abend!
Mit folgendem Code füge ich Diagramme ein, wobei ich Probleme mit der Position des Diagramms habe.

Sub DiaEinfuegen()
    Sheets("Tabelle1").Shapes.AddChart2(201, xlColumnClustered, Left:=300, Width:=270, Top:=7, Height:=210).Select
    ActiveChart.SetSourceData Source:=Sheets("Tabelle1").Range("G1:G6")
End Sub

Die Position sollte nicht Left 300 lauten, sondern generell ab der 9. Spalte, also Spalte "I".

Welche Veränderung muss ich vornehmen.

liebe Grüße

6 Antworten

0 Punkte
Beantwortet von

Guten Abend nochmals,

bevor hier eine Antwort kommt, habe ich gleich noch eine Ergänzung, bin nämlich schon ein Stück weiter gekommen. Dafür tut sich die nächste Frage auf, aber die Position habe ich jetzt in einem Code-Geschnipsel eingebaut!

Sub DiagrammEinfuegen()
    Dim ws As Worksheet
    Dim rng As Range
    Dim objChrt As ChartObject
    Dim chrt As Chart
    Set ws = Sheets("Tabelle1")
    Set rng = ws.Range("G1:H6")
    With ws
        .Shapes.AddChart
        Set objChrt = .ChartObjects(.ChartObjects.Count)
        Set chrt = objChrt.Chart
        With chrt
            .ChartType = xlColumnClustered
            .SetSourceData Source:=rng
            .HasTitle = True
            .ChartTitle.Text = "Tage"
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Zeile"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Tage"
            .HasLegend = True
            objChrt.Left = Range("J1").Left
            objChrt.Top = Range("K2").Top
        End With
    End With
End Sub

Da die Range jetzt über zwei Spalten geht, habe ich natürlich völlig beabsichtigt zwei Säulen im Diagramm!

In der zweiten Säule stelle ich jedoch den Durchschnitt, also Mittelwert, dar. 

Diese zweite Säule hätte ich gerne als Linie dargestellt.
Immerhin bin ich schon viel weiter gekommen :-)

Welche Veränderung muss ich hier vornehmen

Danke für die Info schon im Voraus!

liebe Grüße

0 Punkte
Beantwortet von
Schau mal ob das es sein könnte

Sub DiagrammEinfuegen()
    Dim ws As Worksheet
    Dim rng As Range
    Dim objChrt As ChartObject
    Dim chrt As Chart
    Set ws = Sheets("Tabelle1")
    Set rng = ws.Range("G1:H6")
    With ws
        .Shapes.AddChart
        Set objChrt = .ChartObjects(.ChartObjects.Count)
        Set chrt = objChrt.Chart
        With chrt
            .FullSeriesCollection(1).ChartType = xlColumnClustered
            .FullSeriesCollection(1).AxisGroup = 1
            .FullSeriesCollection(2).ChartType = xlLine
            .FullSeriesCollection(2).AxisGroup = 1
            .SetSourceData Source:=rng
            .HasTitle = True
            .ChartTitle.Text = "Tage"
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Zeile"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Tage"
            .HasLegend = True
            objChrt.Left = Range("J1").Left
            objChrt.Top = Range("K2").Top
        End With
    End With
End Sub
0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi,

du kannst ganz einfach der 2. Datenreihe nachträglich den Typ Linie zuweisen:

Sub DiagrammEinfuegen()
    Dim ws As Worksheet
    Dim rng As Range
    Dim chrt As Chart
    Set ws = Worksheets("Tabelle1")
    With ws
        Set rng = .Range("G1:H6")
        Set chrt = .ChartObjects.Add(0, 0, 0, 0).Chart
        With chrt
            .ChartType = xlColumnClustered
            .SetSourceData Source:=rng
            .SeriesCollection(2).ChartType = xlLine '<== Datenreihe 2 Typ Linie zuweisen
            .HasTitle = True
            .ChartTitle.Text = "Tage"
            .Axes(xlCategory, xlPrimary).HasTitle = True
            .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Zeile"
            .Axes(xlValue, xlPrimary).HasTitle = True
            .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Tage"
            .HasLegend = True
            .Parent.Left = ws.Range("J1").Left
            .Parent.Top = ws.Range("K2").Top
            .Parent.Height = ws.Range("K2:K14").Height
            .Parent.Width = ws.Range("K2:O2").Width
        End With
    End With
End Sub

Bis später, Karin

0 Punkte
Beantwortet von

Hallo,

läuft wunderbar, ABER

ist das nur bei mir so, oder entwickelt sich ein Code bei euch auch immer weiter und weiter und weiter ,.......

Excel ist geil,
VBA ist geiler,
und ihr hier im Forum seit sowieso die Geilsten mit eurer immer wiederkehrenden Unterstützung!

Zur gefühlt 100. Zusatzfrage.

die Range Definierung ist ja recht einfach im Beispiel, aber ich habe in meinem weiterentwickelten Fall zwei variable Ranges.

also NICHT

Set rng = .Range("G1:H6")

sondern

dim rng1, rng2 as Range
Set rng1 = Range(Cells(1, 7), Cells(letztezeile, 7)).Address
Set rng2 =  Range(Cells(1, 9), Cells(letztezeile, 9)).Address  

wie füge ich das dann auf z.b. in dem Beispiel zusammen?

Set rng = ???

ohne Variable funktionierts ja

Set rng = .Range("G1:G6,I1:I6")

0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)
ausgewählt von mickey
 
Beste Antwort

Hi,

du kannst die beiden Ranges durch den Union-Befehl zu einem dritten Bereich zusammenfügen:

Dim rng1, rng2 As Range, rngGesamt As Range
Set rng1 = Range(Cells(1, 7), Cells(letztezeile, 7))
Set rng2 = Range(Cells(1, 9), Cells(letztezeile, 9))
Set rngGesamt = Union(rng1, rng2) '<== gemeinsamer Bereich

Oder, wenn du keine extra Variable verwenden willst, geht es auch so:

Dim rng1, rng2 As Range
Set rng1 = Range(Cells(1, 7), Cells(letztezeile, 7))
Set rng2 = Range(Cells(1, 9), Cells(letztezeile, 9))
Set rng1 = Union(rng1, rng2) '<== gemeinsmaer Bereich

Bis später, Karin

0 Punkte
Beantwortet von
Danke!

genau so funktioniert es jetzt perfekt!

Danke für deine Hilfe
...