Supportnet / Forum / Tabellenkalkulation
Erzeugung von Diagrammen automatisieren
Frage
Hall Zusammen,
ich hab da ein Kleines Problem bei dem erstellen von Diagrammen:
Und zwar habe ich in Spalte A meine Y Werte. In Spalte B meine X Werte..
Nun ist es kein Problem daraus ein normales Linien- Diagram zu erzeugen, aber für das nächste Diagramm stehen wiederum die Y Werte in Spalte A und die X Werte in Spalte C.
Beim nächsten in Spalte D usw.
Gibt es nun eine Möglichkeit Excel zu sagen das er mir automatisch die entsprechenden Diagramme erzeugt?
Vielen Dank für Eure Hilfe
Trudi
Antwort 1 von Beverly
Hi Trudi,
da ich nicht weiß, wie viele Spalten Daten enthalten und wie viele Werte es je Spalte sind, hier mal nur ein Prinzip-Code
Daten liegen im Bereich A1:D6, Diagramm ist ein in die Tabelle eingebettetes Diagrammobjekt, Tabellenname ist Tabelle1.
Bis später,
Karin
da ich nicht weiß, wie viele Spalten Daten enthalten und wie viele Werte es je Spalte sind, hier mal nur ein Prinzip-Code
Sub diagramme_erstellen()
Dim inAnzahl As Integer
Application.ScreenUpdating = False
For inAnzahl = 1 To 3
Charts.Add
With ActiveChart
.ChartType = xlLineMarkers
.SetSourceData Source:=Sheets("Tabelle1").Range("IV1")
.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = "=Tabelle1!R1C" & inAnzahl + 1 & ":R6C" & inAnzahl + 1
.SeriesCollection(1).Values = "=Tabelle1!R1C1:R6C1"
.Location Where:=xlLocationAsObject, Name:="Tabelle1"
End With
Next inAnzahl
Application.ScreenUpdating = True
End Sub
Daten liegen im Bereich A1:D6, Diagramm ist ein in die Tabelle eingebettetes Diagrammobjekt, Tabellenname ist Tabelle1.
Bis später,
Karin
Antwort 2 von Trudi
Hallo Karin
Das Makro ist klasse und im prinziep genau das was ich suche.
nun hab ich nur das Problem das ich von VBA so gut wie keine Ahnung habe und vondaher das Makro auch nicht verstehe.
Kannst du mir sagen wie ich die angeben zum Range verstehen muss?
und was muss ich tun um noch drei weitere Kurven und eine Trenntlinie einzufügen?
Vielen Dank
Trudi
Das Makro ist klasse und im prinziep genau das was ich suche.
nun hab ich nur das Problem das ich von VBA so gut wie keine Ahnung habe und vondaher das Makro auch nicht verstehe.
Kannst du mir sagen wie ich die angeben zum Range verstehen muss?
und was muss ich tun um noch drei weitere Kurven und eine Trenntlinie einzufügen?
Vielen Dank
Trudi
Antwort 3 von Beverly
Hi Trudi,
ich weiß jetzt nicht, wie ich das richtig verstehen soll: in deinem 1. Betrag schreibst du, dass du mehrere Diagramm erstellen möchtest, jetzt sind es mehrere Datenreihen und eine Trendlinie. Das sind dann völlig unterschiedliche Codes. Da müsstest du dich noch einmal genauer äußern.
Was die Range-Schreibweise betrifft, so ist das die R1C1 (sprich Reihe1Spalte1)-Schreibweise, welche im Diagramm verwendet wird, wenn man einer Datenreihe den Wertebereich direkt zuweist. Bei den Values (also Y-Werten) ist das deiner Beschreibung nach immer derselbe Bereich (Spalte A ab Zeile1 = R1C1 bis Spalte A Zeile 6 = R1C6), deshalb .Values = "=Tabelle1!R1C1:R6C1". Für die X-Werte sind es ja unterschiedliche Spalten, welche durch inAnzahl + 1 variabel gehalten werden - es wird also in der Schleife 1 to 3 mit Spalte 2 (B) begonnen und bei 4 (Spalte D) aufgehört.
Bis später,
Karin
ich weiß jetzt nicht, wie ich das richtig verstehen soll: in deinem 1. Betrag schreibst du, dass du mehrere Diagramm erstellen möchtest, jetzt sind es mehrere Datenreihen und eine Trendlinie. Das sind dann völlig unterschiedliche Codes. Da müsstest du dich noch einmal genauer äußern.
Was die Range-Schreibweise betrifft, so ist das die R1C1 (sprich Reihe1Spalte1)-Schreibweise, welche im Diagramm verwendet wird, wenn man einer Datenreihe den Wertebereich direkt zuweist. Bei den Values (also Y-Werten) ist das deiner Beschreibung nach immer derselbe Bereich (Spalte A ab Zeile1 = R1C1 bis Spalte A Zeile 6 = R1C6), deshalb .Values = "=Tabelle1!R1C1:R6C1". Für die X-Werte sind es ja unterschiedliche Spalten, welche durch inAnzahl + 1 variabel gehalten werden - es wird also in der Schleife 1 to 3 mit Spalte 2 (B) begonnen und bei 4 (Spalte D) aufgehört.
Bis später,
Karin
Antwort 4 von Trudi
Hallo Karin
es ist wohl doch komplizierter mit VBA als ich dachte:
Also noch mal alles zusammen fassen:
Ja in Spatte A stehen immer meine Y Werte
und die sind auch bei jeder Messreihen die Selben (frag mich nicht warum das dann nicht die X-werte sind...der Kunde wünscht es so)
Insgesammt sind es jedoch 3 Messungen von bis zu 200 Proben
Nun stehen die Ersten messungen der Porben in den Zeilen 95 bis 105
die 2. Messungen in Zeile 109 bis 119
die 3. in 123 bis 133
hinzu kommt dan noch die Kurven der Mittelwerte in 179 bis 189
Zu der letzten Kurve wäre dann auch die Trentlinie mit Formel, Bestimmtheitsmass und durch den Nullpunkt.
So ich hoffe du ahnst nun ungefähr was ich benötige.
Und danke wenn du da nch weiter machen möchtest...
Ansonsten hast du mir mit deiner Erklärung schon riesig geholfen.
Ich denke das ich damit auch schon ein ganzes stück weit alleine klar komme.
Ich werd es morgen noch mal versuchen
Vilen Dank noch mal
Gruß
Trudi
es ist wohl doch komplizierter mit VBA als ich dachte:
Also noch mal alles zusammen fassen:
Ja in Spatte A stehen immer meine Y Werte
und die sind auch bei jeder Messreihen die Selben (frag mich nicht warum das dann nicht die X-werte sind...der Kunde wünscht es so)
Insgesammt sind es jedoch 3 Messungen von bis zu 200 Proben
Nun stehen die Ersten messungen der Porben in den Zeilen 95 bis 105
die 2. Messungen in Zeile 109 bis 119
die 3. in 123 bis 133
hinzu kommt dan noch die Kurven der Mittelwerte in 179 bis 189
Zu der letzten Kurve wäre dann auch die Trentlinie mit Formel, Bestimmtheitsmass und durch den Nullpunkt.
So ich hoffe du ahnst nun ungefähr was ich benötige.
Und danke wenn du da nch weiter machen möchtest...
Ansonsten hast du mir mit deiner Erklärung schon riesig geholfen.
Ich denke das ich damit auch schon ein ganzes stück weit alleine klar komme.
Ich werd es morgen noch mal versuchen
Vilen Dank noch mal
Gruß
Trudi
Antwort 5 von Beverly
Hi Trudi,
so ganz ist mir der Aufbau deiner Arbeitsmappe nicht klar. Lade doch deine Mappe mal hoch. Unter diesem Link zum Upload kannst du das kostenlos für 100 Tage. Die Linkadresse, die du dort erhältst, musst du hier im Forum in einen Beitrag kopieren.
Bis später,
karin
so ganz ist mir der Aufbau deiner Arbeitsmappe nicht klar. Lade doch deine Mappe mal hoch. Unter diesem Link zum Upload kannst du das kostenlos für 100 Tage. Die Linkadresse, die du dort erhältst, musst du hier im Forum in einen Beitrag kopieren.
Bis später,
karin
Antwort 6 von Trudi
Hallo Karin,
nun hab ich sie die seite doch noch überreden können.
Hier der Link
http://www.uploadagent.de/files/1182236410/Mappe2.xls
und danke nochmal
Trudi
nun hab ich sie die seite doch noch überreden können.
Hier der Link
http://www.uploadagent.de/files/1182236410/Mappe2.xls
und danke nochmal
Trudi
Antwort 7 von Trudi
Hallo Zusammen,
Ich habs geschaft:
für alle die die Lösung interesiert:
Sub Diagramm2()
'
' Diagramm2 Makro
' Makro am 19.06.2007 von nilson aufgezeichnet
'
Dim inAnzahl As Integer
Application.ScreenUpdating = False
For inAnzahl = 1 To 3
Charts.Add
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=Sheets("Tabelle 1").Range( _
"A95:A105"), PlotBy:=xlColumns
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = "=Tabelle 1!R95C" & inAnzahl + 1 & ":R105C" & inAnzahl + 1
ActiveChart.SeriesCollection(1).Name = "=Tabelle 1!R93C" & inAnzahl + 1
ActiveChart.SeriesCollection(2).XValues = "=Tabelle 1!R109C" & inAnzahl + 1 & ":R119C" & inAnzahl + 1
ActiveChart.SeriesCollection(2).Values = "=Tabelle 1!R109C1:R119C1"
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).Name = "=Tabelle 1!R107C" & inAnzahl + 1
ActiveChart.SeriesCollection(3).XValues = "=Tabelle 1!R123C" & inAnzahl + 1 & ":R133C" & inAnzahl + 1
ActiveChart.SeriesCollection(3).Values = "=Tabelle 1!R123C1:R133C1"
ActiveChart.SeriesCollection(3).Name = "=Tabelle 1!R121C" & inAnzahl + 1
ActiveChart.SeriesCollection(4).XValues = "=Tabelle 1!R179C" & inAnzahl + 1 & ":R189C" & inAnzahl + 1
ActiveChart.SeriesCollection(4).Values = "=Tabelle 1!R179C1:R189C1"
ActiveChart.SeriesCollection(4).Name = "=Tabelle 1!R177C"
ActiveChart.Location Where:=xlLocationAsObject, Name:="Tabelle 1"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Material Modulus"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Strain [ ]"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Force [N]"
End With
ActiveChart.SeriesCollection(4).Select
ActiveChart.SeriesCollection(4).Trendlines.Add(Type:=xlLinear, Forward:=0, _
Backward:=0, Intercept:=0, DisplayEquation:=True, DisplayRSquared:=True _
).Select
ActiveChart.SeriesCollection(4).Trendlines(1).DataLabel.Select
Selection.Left = 214
Selection.Top = 207
ActiveChart.Legend.Select
Selection.Left = 71
Selection.Top = 69
ActiveChart.PlotArea.Select
Selection.Width = 412
ActiveChart.ChartArea.Select
ActiveWindow.Visible = False
Windows("Mappe2.xls").Activate
Next inAnzahl
Application.ScreenUpdating = True
End Sub
Und vielen Dank für euer Hilfe
Gruß Trudi
Ich habs geschaft:
für alle die die Lösung interesiert:
Sub Diagramm2()
'
' Diagramm2 Makro
' Makro am 19.06.2007 von nilson aufgezeichnet
'
Dim inAnzahl As Integer
Application.ScreenUpdating = False
For inAnzahl = 1 To 3
Charts.Add
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=Sheets("Tabelle 1").Range( _
"A95:A105"), PlotBy:=xlColumns
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).XValues = "=Tabelle 1!R95C" & inAnzahl + 1 & ":R105C" & inAnzahl + 1
ActiveChart.SeriesCollection(1).Name = "=Tabelle 1!R93C" & inAnzahl + 1
ActiveChart.SeriesCollection(2).XValues = "=Tabelle 1!R109C" & inAnzahl + 1 & ":R119C" & inAnzahl + 1
ActiveChart.SeriesCollection(2).Values = "=Tabelle 1!R109C1:R119C1"
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).Name = "=Tabelle 1!R107C" & inAnzahl + 1
ActiveChart.SeriesCollection(3).XValues = "=Tabelle 1!R123C" & inAnzahl + 1 & ":R133C" & inAnzahl + 1
ActiveChart.SeriesCollection(3).Values = "=Tabelle 1!R123C1:R133C1"
ActiveChart.SeriesCollection(3).Name = "=Tabelle 1!R121C" & inAnzahl + 1
ActiveChart.SeriesCollection(4).XValues = "=Tabelle 1!R179C" & inAnzahl + 1 & ":R189C" & inAnzahl + 1
ActiveChart.SeriesCollection(4).Values = "=Tabelle 1!R179C1:R189C1"
ActiveChart.SeriesCollection(4).Name = "=Tabelle 1!R177C"
ActiveChart.Location Where:=xlLocationAsObject, Name:="Tabelle 1"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "Material Modulus"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Strain [ ]"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Force [N]"
End With
ActiveChart.SeriesCollection(4).Select
ActiveChart.SeriesCollection(4).Trendlines.Add(Type:=xlLinear, Forward:=0, _
Backward:=0, Intercept:=0, DisplayEquation:=True, DisplayRSquared:=True _
).Select
ActiveChart.SeriesCollection(4).Trendlines(1).DataLabel.Select
Selection.Left = 214
Selection.Top = 207
ActiveChart.Legend.Select
Selection.Left = 71
Selection.Top = 69
ActiveChart.PlotArea.Select
Selection.Width = 412
ActiveChart.ChartArea.Select
ActiveWindow.Visible = False
Windows("Mappe2.xls").Activate
Next inAnzahl
Application.ScreenUpdating = True
End Sub
Und vielen Dank für euer Hilfe
Gruß Trudi
Antwort 8 von Beverly
Hi Trudi,
schön, dass du eine Lösung gefunden und gepostet hast. Auch wenn ich nicht verstehe, weshalb du 3 identische Diagramme erstellen musst mit dem einzigen Unterschied, dass die Dateneihen verschieden heißen, hier noch ein Hinweis: in VBA kann zu 99% auf Select verzichtet werden. Ich habe deinen Code mal dahingehend angepasst. Vielleicht kannst du das ja verwenden
Die Diagrammgröße musst du vielleicht anpassen (Zahlen 450 und 300 in Zeile 9 des Codes)
Bis später,
Karin
schön, dass du eine Lösung gefunden und gepostet hast. Auch wenn ich nicht verstehe, weshalb du 3 identische Diagramme erstellen musst mit dem einzigen Unterschied, dass die Dateneihen verschieden heißen, hier noch ein Hinweis: in VBA kann zu 99% auf Select verzichtet werden. Ich habe deinen Code mal dahingehend angepasst. Vielleicht kannst du das ja verwenden
Sub Diagramm_neu()
Dim inAnzahl As Integer
Dim chDiagramm As ChartObject
Dim trLinie As Trendline
Dim leLegende As Legend
Dim paZeichnungsflaeche As PlotArea
Application.ScreenUpdating = False
For inAnzahl = 1 To 3
Set chDiagramm = ActiveSheet.ChartObjects.Add(150, 150, 450, 300)
With chDiagramm.Chart
.ChartType = xlXYScatterSmooth
.SetSourceData Source:=Sheets("Tabelle 1").Range("A95:A105"), PlotBy:=xlColumns
.SeriesCollection.NewSeries
.SeriesCollection(1).XValues = "='Tabelle 1'!R95C" & inAnzahl + 1 & ":R105C" & inAnzahl + 1
.SeriesCollection(1).Name = "='Tabelle 1'!R93C" & inAnzahl + 1
.SeriesCollection(2).XValues = "='Tabelle 1'!R109C" & inAnzahl + 1 & ":R119C" & inAnzahl + 1
.SeriesCollection(2).Values = "='Tabelle 1'!R109C1:R119C1"
.SeriesCollection.NewSeries
.SeriesCollection.NewSeries
.SeriesCollection(2).Name = "='Tabelle 1'!R107C" & inAnzahl + 1
.SeriesCollection(3).XValues = "='Tabelle 1'!R123C" & inAnzahl + 1 & ":R133C" & inAnzahl + 1
.SeriesCollection(3).Values = "='Tabelle 1'!R123C1:R133C1"
.SeriesCollection(3).Name = "='Tabelle 1'!R121C" & inAnzahl + 1
.SeriesCollection(4).XValues = "='Tabelle 1'!R179C" & inAnzahl + 1 & ":R189C" & inAnzahl + 1
.SeriesCollection(4).Values = "='Tabelle 1'!R179C1:R189C1"
.SeriesCollection(4).Name = "='Tabelle 1'!R177C"
.HasTitle = True
.ChartTitle.Characters.Text = "Material Modulus"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Strain [ ]"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Force [N]"
With .SeriesCollection(4)
Set trLinie = .Trendlines.Add(Type:=xlLinear, Forward:=0, Backward:=0, Intercept:=0, DisplayEquation:=True, DisplayRSquared:=True)
trLinie.DataLabel.Top = 214
trLinie.DataLabel.Left = 207
End With
Set leLegende = .Legend
leLegende.Top = 71
leLegende.Left = 69
Set paZeichnungsflaeche = .PlotArea
paZeichnungsflaeche.Width = 412
End With
Next inAnzahl
Application.ScreenUpdating = True
Worksheets("Tabelle 1").Activate
End Sub
Die Diagrammgröße musst du vielleicht anpassen (Zahlen 450 und 300 in Zeile 9 des Codes)
Bis später,
Karin
Antwort 9 von Trudi
Hallo Karin,
die Werte die derzeit in der Tabelle sind dienen nur als Hilfe für mich. Die werde ich nun wieder heraus löschen. Die Tabelle dient als Vorlage für die Auswertung einer unserer Laborversuche und dann werden die Ergebnisse abhängig von den Porben hoffentlich untersdchiedlich sein.
Vielen Dank noch mal. Ich hab viel gelernt und fang gerade an mich mit VBA auseinanderzusetzen.
Gruß
Trudi
die Werte die derzeit in der Tabelle sind dienen nur als Hilfe für mich. Die werde ich nun wieder heraus löschen. Die Tabelle dient als Vorlage für die Auswertung einer unserer Laborversuche und dann werden die Ergebnisse abhängig von den Porben hoffentlich untersdchiedlich sein.
Vielen Dank noch mal. Ich hab viel gelernt und fang gerade an mich mit VBA auseinanderzusetzen.
Gruß
Trudi