Supportnet Computer
Planet of Tech

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

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

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

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

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

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

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

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

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

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: