Makro zum Erstellen vieler Graphen auf verschiedenen Sheets

  • Excel

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Makro zum Erstellen vieler Graphen auf verschiedenen Sheets

    Tag Leute,

    Ich würde gerne die Auswertung meiner Messergebnisse Vereinfachen und stoße bei VB immer wieder auf Probleme, da ich auch kein Crack darin bin; bei mir ist das mehr learning-by-doing. Benutzt wird Excel 2010.

    Ich habe 12 Sheets mit jeweils 3 Tabellen, aus jeder Tabelle müssen 2 Spalten separat gegen die Spalte A geplottet werden (alles aus der gleichen vertikalen Range) mittels einer Diagrammvorlage. Danach müssen die Achsen beschriftet werden und dann ist das Diagramm auch schon fertig. Mit dem Makro-Aufzeichner von Ecxel bin ich jetzt mittlerweile so weit, dass ich Diagramme für die Spalten K und L zeichnen kann. Es müssen aber noch welche für Y und Z sowie AM und AN gezeichnet werden. Die Tabellen haben auf allen 12 Sheets die gleiche Form!

    Probleme bis hierhin:

    - ich weiß nicht wie ich VB sagen kann, dass er nicht einen bestimmten Sheet auswählen soll, sondern den Nächsten in der Reihe. Das ist deswegen wichtig, weil ich dann nicht immer manuell eintippen muss

    Visual Basic-Quellcode

    1. Sheets("SG29_II_AN_L1").Select
    . Außerdem wäre eine Übertragung auf andere Sheetnamen dann ebenfalls viel einfacher (Das ist dann mein Probenname). Ließe sich Umgehen, wenn ich die Probennamen in den Sheet selber schreibe und dann mit #1,#2 usw. durchnummeriere. Ich mag aber weniger Workarounds, wenn ich auch verstehen könnte wies wirklich geht ;)

    - Viel wichtiger ist, dass ich es nicht hinkriege Excel zu sagen, dass es sich die Daten gefälligst von der aktuellen Folie zu nehmen hat statt von einer Bestimmten. Das ist etwas gravierender als der vorige Punkt, weil ich zu jedem Tabellenzeichnen 2x Angeben muss woher die x-Daten stammen (ich schätze es liegt an einem Fehler in der Vorlage, aber die muss ich leider benutzen!):

    Visual Basic-Quellcode

    1. ActiveChart.SetSourceData Source:=Range("SG29_II_AN_L2!$K$4:$K$61")
    2. ActiveChart.SeriesCollection(1).Select
    3. ActiveChart.SeriesCollection(1).Name = "Kristallinität (Fläche)"
    4. ActiveChart.SeriesCollection(1).XValues = "=SG29_II_AN_L2!$A$4:$A$61"


    das heißt bei meinem copy&paste verfahren für alle 12 Sheets muss ich 120x eingeben woher die Daten kommen, was ziemlich nervig ist!

    Also wenn jemand eine Idee hat wie ich diese Probleme lösen oder umgehen kann, wäre ich sehr dankbar! :thumbsup:

    PS: Suchfunktion hab ich natürlich benutzt, aber nichts gefunden was mir genau hierzu weiterhilft

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „alterfalter“ ()

    Loope durch die Arbeitsblätter und deren Charts

    Visual Basic-Quellcode

    1. For Each Sht in Worksheets
    2. For Each ChartObj in Sht.ChartObjects
    3. Set Cht = ChartObj.Chart
    4. ' jetzt kannst du mit Cht machen was du willst. z.B.
    5. Cht.SeriesCollection(1).Name = Sht.Cells(1,1).Value
    6. Next
    7. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das ist ne ziemlich geile Funktion, danke! Hat mich schon ein Stück weitergebracht

    Allerdings gibts zwei Probleme:
    - Es hilft mir nicht, die graphen zu erstellen
    - Ich weiß nich, wie ich Graphen unterscheiden kann, Ich brauche nämlich für 2 der 6 Graphen pro Sheet eine andere Achsenbeschriftung (Ja, ich weiß jetzt stell ich auch noch Ansprüche :D )!

    alterfalter schrieb:

    Ich weiß nich, wie ich Graphen unterscheiden kann
    Ich weiß auch nicht, wie du deine Graphen unterscheiden kannst, wenn du's schon nicht weisst. ;)

    Vielleicht aus den Quelldaten?
    Vielleicht habe ich auch dein Problem nicht verstanden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ah.

    Ja mein Problem war, dass ich deinen Quelltext nur so verstanden hab, dass man damit bereits vorhandene Graphen bearbeiten kann. Und dein Beispiel erlaubt es ja nur, alle Graphen auf einmal zu verändern.

    Habe nicht berücksichtigt, dass ich damit theoretisch auch die Graphen erstellen kann, womit ich ja sehr viel mehr Möglichkeiten hätte, wo ich dann alles vorschreiben kann wie ich es brauche. Ich glaube ich habs jetzt, vielen Dank!

    edit: Ah, noch eins!
    Wenn ich die Quelldaten des Diagramms für jeden Sheet gleich haben will, wie mach ich das? ich meine:

    Visual Basic-Quellcode

    1. ActiveChart.SetSourceData Source:=Range("SG29_II_AN_L2!$Z$4:$Z$61")
    2. ActiveChart.SeriesCollection(1).Select
    3. ActiveChart.SeriesCollection(1).XValues = "=SG29_II_AN_L2!$A$4:$A$61"


    Das heißt mit deiner Schleife würde ich in jeden Sheet den gleichen Graphen reinschreiben, weil ich die Quelldaten mit einer spezifischen Ortsangabe versehen habe, oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „alterfalter“ ()

    Richtig.
    Das Beispiel sollte eigentlich nur aufzeigen, dass sowohl Sheets als auch ChartObjects automatisch alle Arbeitsblätter bzw. Diagramme beinhalten.

    Das sind Listobjekte, die du z.B. mit ChartObjects.Add erweitern kannst.

    Wenn ich die Quelldaten des Diagramms für jeden Sheet gleich haben will, wie mach ich das?
    Du nimmst die Schleife von oben und modifizierst die entsprechende Eigenschaften des Chart-Objekts.

    Visual Basic-Quellcode

    1. Cht.SeriesCollection(1).XValues = "=SG29_II_AN_L2!$A$4:$A$61"
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    wie krieg ich denn die spezifische Ortsangabe weg?
    Die Zeilen/Spaltenposition ist ja auf jedem Sheet gleich, das heißt ich müsste nur reinschreiben *nimm's vom aktuellen Sheet*, salopp gesagt.

    Hab aber keine Ahnung wie der Befehl dafür geht, mit ActiveSheet oder einfach weglassen z.B. gehts nicht.

    Neu formuliert: Ich hab natürlich mist gelabert. Ich will das gar nicht vom gleichen Sheet haben, ich will das von dem, auf dem das Makro gerade Arbeitet. Die Position der Daten auf den Sheets ist identisch, das einzige was das Makro daran hindert ist die Sheetangabe, die ich nicht wegkriege.
    muss es leider noch mal aufgreifen:

    Ich kriege eigentlich alles soweit automatisiert, bis auf diese Zeile:

    Visual Basic-Quellcode

    1. ActiveChart.SetSourceData Source:=Range("SG29_II_AN_L2!$K$4:$K$61")

    Mit dem ActiveSheet.Range Befehl hab ich schon ziemlich viel experimentiert aber bin nicht so weit damit gekommen...

    einer ne Idee? :)
    Wenn ich eine For-Schleife erstellen will, die mir auf jedem Sheet aus ein paar Daten ein Diagramm erstellt, soll er sich die Daten ja vom jeweiligen Sheet holen. Das Problem ist, dass ich die Sourcedata nicht so eingestellt kriege, dass sie sich nur auf den aktuellen Sheet bezieht. Beispiel:

    Visual Basic-Quellcode

    1. For Each Sht In Worksheets
    2. Range("AQ3:AQ70").Select
    3. ActiveSheet.Shapes.AddChart.Select
    4. ActiveChart.ApplyChartTemplate ( _
    5. "[name vom template]" _
    6. )
    7. ActiveChart.SetSourceData Source:=(ActiveSheet.Range("AQ3:AQ70"))
    8. ActiveChart.SeriesCollection(1).Select
    9. ActiveChart.SeriesCollection(1).Name = "Peak 01 Height"
    10. ActiveChart.SeriesCollection(1).XValues = "=" & ActiveSheet.Range("A3:A70").Address(External:=True)
    11. ...


    Das ist das, wie ich es im Moment benutze. Das Funktioniert auch; ich will aber nicht nur einen Graphen, sondern 6 erstellen.
    Und den ersten Graphen erstellt er mir ohne Mucken, beim zweiten (alle 8 ersten Zeilen sind identisch mit dem obigen, nur dass Q durch R ersetzt wird weils halt andere Werte sind) kommt dann aber:
    Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt
    schonmal Danke für die schnelle Antwort :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „alterfalter“ ()

    Hör auf, den Code des Macro-Recorders blind zu übernehmen. :)
    Adressiere die Objekte direkt und arbeite nicht mit .Select, Selection und Active...

    Visual Basic-Quellcode

    1. For Each Sht In Worksheets
    2. Set Cht = Sht.Shapes.AddChart.Chart
    3. Cht.ApplyChartTemplate ("xxxx")
    4. Cht.SetSourceData Source:=(ActiveSheet.Range("AQ3:AQ70"))
    5. ...
    6. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --