Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1320to1324
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
Inhaltsverzeichnis

fortlaufende Diagrammerstellung VBA

fortlaufende Diagrammerstellung VBA
01.07.2013 23:31:10
Jens
Hallo,
ich habe bereits von Klaus M.vdT folgenden Makro für die automatische Erstellung eines Diagrammes mit einer Spalte erhalten, welches auch super funktioniert. Nun würde ich jedoch wissen wollen, was ich ändern müsste um jedem erstellten Diagramm noch Daten aus einer Spalte G und H zuzufügen. Als Ergebnis sollte jeweils ein Liniendiagramm mit 3 Linien dargestellt werden. Die Bezeichnung der Linien sollte entsprechend vom jeweiligen Begriff aus Zeile 1 gewählt werden.
Option Explicit
'ÄNDERUNG!
'die Diagrammbreite nicht mehr im Makro angeben, sondern
'das Diagramm nimmt die Breite der Spalte F an!
Public ScaleMax As Long
Public ScaleMin As Long
Sub MacheVieleDiagramme()
Const RowFirst As Long = 2 'Ab Zeile 2 stehen Daten
Const RowStep As Long = 72 'Diagramme in 72-Zeilen-Schritten erstellen
Const SpalteDaten = 6      'In Spalte F=6 stehen die Daten
Dim i As Long
'Bildschirmflackern verhindern
Application.ScreenUpdating = False
With ActiveSheet
'Diagramm scaliert von 0 bis Max-Wert
'Bei Bedarf ändern, auch fixe Werte möglich!
ScaleMax = WorksheetFunction.Max(.Cells(1, SpalteDaten).EntireColumn)
ScaleMin = 0
'gehe alle Zeilen in 72-er Steps durch
For i = RowFirst To Cells(.Rows.Count, SpalteDaten).End(xlUp).Row Step RowStep
'starte das Diagramm-Makro
MacheEinzelDiagramm .Cells(i, SpalteDaten).Resize(RowStep)
Next i
End With
End Sub
Sub MacheEinzelDiagramm(rngDaten As Range)
Dim myCht As Object
Set myCht = ActiveSheet.Shapes.AddChart       'neues Diagramm erstellen
With myCht                                    'mit dem gerade erstellten Diagramm
With .Chart
.ChartType = xlLine                       'Liniendiagramm
.SetSourceData Source:=rngDaten           'Datenquelle übergeben
.Legend.Delete                            'Legende entfernen
.Axes(xlValue).MaximumScale = ScaleMax    'auf 22000 (oder so) skalieren
.Axes(xlValue).MinimumScale = ScaleMin    'von 0 anfangend skalieren
End With
.Top = rngDaten.Top                         'ausrichten
.Left = rngDaten.Offset(, 1).Left           'ausrichten
.Height = rngDaten.Height                   'ausrichten
.Width = rngDaten.Offset(, 1).Width         'ausrichten
End With
End Sub
Grüße,
Jens

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: fortlaufende Diagrammerstellung VBA
02.07.2013 09:52:58
Beverly
Hi Jens,
ändere diesen Teil:

'gehe alle Zeilen in 72-er Steps durch
For i = RowFirst To .Cells(.Rows.Count, SpalteDaten).End(xlUp).Row Step RowStep
'starte das Diagramm-Makro
MacheEinzelDiagramm .Range(.Cells(i, SpalteDaten), .Cells(i + RowStep - 1, SpalteDaten + 2))
Next i


Ehre wem Ehre gebührt ...
02.07.2013 10:37:13
Klaus
Hallo Jens,
du schriebst:
von Klaus M.vdT
wenn ich mich recht erinnere (ich hab den Link jetzt nicht rausgesucht), war das o.g. Makro aber der Verdienst von Rudi M.! Ehre wem Ehre gebührt.
Beverly ist hier wohl die unbestrittene Diagramm-Expertin, ihre Lösung ist sicherlich richtig. Ich vermute aber, dass es hier:

.Left = rngDaten.Offset(, 1).Left 'ausrichten
.Width = rngDaten.Offset(, 1).Width 'ausrichten

ein Problem geben wird: Dein Diagramm wird zwei Spalten "verdecken". Bei drei Spalten müsstest du die Offsets von (, 1) auf (, 3) ändern - oder gleich variabel gestalten:

.Left = rngDaten.Offset(, rngDaten.Columns.Count).Left 'ausrichten
.Width = rngDaten.Offset(, rngDaten.Columns.Count).Width 'ausrichten

sollte mit jeglicher Spaltenanzahl zurecht kommen.
Dein altes Problem mit ScaleMax hast du gelöst bekommen?
Grüße,
Klaus M.vdT.

Anzeige
Alternative zu Range: Resize
02.07.2013 10:50:34
Klaus
Hallo nochmal,
statt des Range-Befehls aus Beverlys Vorschlag
MacheEinzelDiagramm .Range(.Cells(i, SpalteDaten), .Cells(i + RowStep - 1, SpalteDaten + 2))
Kann hier auch eine Variation des Resize-Befehls genutzt werden (72 Zeilen, 3 Spalten)
MacheEinzelDiagramm .Cells(i, SpalteDaten).Resize(RowStep, 3)
Damit dürfte das Makro eine tausendstel Sekunde performanter laufen.
Grüße,
Klaus M.vdT.

AW: Alternative zu Range: Resize
02.07.2013 11:17:24
Jens
Hallo Klaus,
vielen Dank an dich und Beverly. Es klappt wunderbar. Das Problem mit Scalemax war damals gar kein richtiges, da sich in meiner Wertereihe nur ein eine Leerzeile eingeschlichen hatte, die ich nicht erkannt hatte.
Nun würde mich nur noch interessieren, ob man allen Diagrammen die gleiche Legende zuteilen kann, also Spalte F=last, Spalte G=Wind, Spalte H=PV.
Ihr seit echt Spitze ;-)
Mfg
Jens

Anzeige
AW: Alternative zu Range: Resize
02.07.2013 11:30:09
Klaus
Hi Jens,
Nun würde mich nur noch interessieren, ob man allen Diagrammen die gleiche Legende zuteilen kann, also Spalte F=last, Spalte G=Wind, Spalte H=PV
Klar! Beverly schuttelt das bestimmt aus dem Ärmel, ich müsste mir das erst nochmal anschauen :-)
Falls Beverly nicht schneller ist, magst du mir eben eine aktuelle Musterdatei mit Makro nochmal hochladen?
da sich in meiner Wertereihe nur ein eine Leerzeile eingeschlichen hatte,
sowas hatte ich ja bereits vermutet. Schön, dass sich das aufgelöst hat.
Grüße,
Klaus M.vdT.

AW: Alternative zu Range: Resize
02.07.2013 11:41:21
Jens
Hallo Klaus,
hier der Link zum Muster https://www.herber.de/bbs/user/86164.xlsx
Die Daten sind noch nicht vollständig, aber die ersten 700 Zeilen reichen ja denk ich als Musterbeispiel.
Mfg
Jens

Anzeige
AW: Alternative zu Range: Resize
02.07.2013 12:01:28
Klaus
Hi Jens,
du hattest ruhig das Makro mit in die Musterdatei geben können! Aus purer Bosheit lade ich dir die Datei nicht zurück, sondern zeige nur das Makro (habe bei der Gelegenheit noch ein paar andere Kleinigkeiten verändert):
Option Explicit
Public ScaleMax As Long
Public ScaleMin As Long
Public SpalteDaten As Long
Public SpaltenRechts As Long
Public RowHeadline As Long
Sub MacheVieleDiagramme()
Dim i As Long
Const RowFirst As Long = 2 'Ab Zeile 2 stehen Daten
Const RowStep As Long = 72 'Diagramme in 72-Zeilen-Schritten erstellen
RowHeadline = 1      'Überschriften (für die Legende!) stehen in Zeile 1
SpalteDaten = 6      'In Spalte F=6 stehen die Daten
SpaltenRechts = 3    'ab inklusive F geht es um 3 Spalten
'Bildschirmflackern verhindern
Application.ScreenUpdating = False
With ActiveSheet
'Diagramm scaliert von 0 bis Max-Wert
'Bei Bedarf ändern, auch fixe Werte möglich!
ScaleMax = WorksheetFunction.Max(.Columns(SpalteDaten))
ScaleMin = 0
'gehe alle Zeilen in 72-er Steps durch
For i = RowFirst To Cells(.Rows.Count, SpalteDaten).End(xlUp).Row Step RowStep
'starte das Diagramm-Makro
MacheEinzelDiagramm .Cells(i, SpalteDaten).Resize(RowStep, SpaltenRechts)
Next i
End With
End Sub
Sub MacheEinzelDiagramm(rngDaten As Range)
Dim myCht As Object
Set myCht = ActiveSheet.Shapes.AddChart       'neues Diagramm erstellen
With myCht                                    'mit dem gerade erstellten Diagramm
With .Chart
.ChartType = xlLine                       'Liniendiagramm
'Datenquelle + Legende
.SetSourceData Source:= _
Union(rngDaten, Cells(RowHeadline, SpalteDaten).Resize(, SpaltenRechts))
'.Legend.Delete                            'Legende entfernen
.Axes(xlValue).MaximumScale = ScaleMax    'auf 22000 (oder so) skalieren
.Axes(xlValue).MinimumScale = ScaleMin    'von 0 anfangend skalieren
End With
.Top = rngDaten.Top                                            'ausrichten
.Left = rngDaten.Cells(1, 1).Offset(, SpaltenRechts).Left                 'ausrichten
.Height = rngDaten.Height                                      'ausrichten
.Width = rngDaten.Cells(1, 1).Offset(, SpaltenRechts).Width    'ausrichten
End With
End Sub
Der Legendendeintrag bezieht sich jetzt auf die Überschriften in Zeile 1. Wenn deine Mastertabelle die Überschriften in einer anderen Zeile hat, kannst du das gleich oben ändern.
Grüße,
Klaus M.vdT.

Anzeige
AW: Alternative zu Range: Resize
02.07.2013 12:07:34
Jens
Hallo Klaus,
Das ist genau das, wie ich es wollte.Klappt perfekt. Vielen Dank.
Mfg
Jens

Danke für die Rückmeldung! Wenn du ...
02.07.2013 12:11:36
Klaus
... noch Formatierungsänderungen haben möchtest, die Linienbreite verändert, ein Bild oder Farbverlauf im Hintergrund, geglättete Linien ... die Antwort ist: ja das geht!
Aber dann bestell bitte die ganze Salami auf einmal und nicht scheibenweise :-)
Wenns so schlicht wie es jetzt ist schon reicht oder du lieber selber weiterbasteln möchtest, dann freuts mich soweit geholfen zu haben.
Grüße,
Klaus M.vdT.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige