Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
980to984
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
980to984
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Oberflächendiagramm VBA

Oberflächendiagramm VBA
24.05.2008 11:44:00
Olli
Hi,
stecke in den ersten VBA-Versuchen und habe mir einen Code zusammengeschustert.....aber leider funzt er nicht. :-/
und zwar möchte ich ein Oberflächendiagramm mittels VBA erstellen. Problematisch ist, dass die Reihen nicht nebeneinander, sondern untereinander stehen. Es sind Jahreswerte über 50 Reiehn. Diese des öfteren in ein Diagramm zu klöppeln ist sehr umständlich... habe bisher folgendes verzapft :-P

Function RangeToAddress(Ra As Range) As String
RangeToAddress = "='" & Ra.Parent.Name & "'!" & _
"R" & CStr(Ra.Row) & "C" & CStr(Ra.Column) & ":" & _
"R" & CStr(Ra.Rows.Count + Ra.Row - 1) & "C" & CStr(Ra.Column)
End Function



Sub Schaltfläche2_BeiKlick()
Dim vrng As Range
Dim xrng As Range
Charts.Add
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.ChartType = xlSurface
For m = 1 To 50
Set vrng = Range(Cells(9 + (m - 1 * 365), 4), Cells(378 + (m - 1 * 365), 4))
ActiveChart.SeriesCollection(m).Values = RangeToAddress(vrng)
Set xrng = Range("E" & 9 + (m - 1 * 365), "E" & 365 + (m - 1 * 365))
ActiveChart.SeriesCollection(m).XValues = RangeToAddress(xrng)
Next
With ActiveChart
.HasAxis(xlCategory) = True
.HasAxis(xlSeries) = True
.HasAxis(xlValue) = True
End With
ActiveChart.Axes(xlCategory).CategoryType = xlAutomatic
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlBottom
End Sub


Leider funzt das mit der Schleife nicht... falls mir jemand helfen kann, würde ich mich sehr freuen ....
Mfg
Olli

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

Betreff
Datum
Anwender
Anzeige
AW: Oberflächendiagramm VBA
24.05.2008 12:24:00
Daniel
Hi
in meiner Excelversion (2002) ist die Funktion RangeToAddress() unbekannt.
kann sich in 2003 ja gändert haben.
wie sieht denn das Ergebnis dieser Funktion aus und entspricht es dem, was man bei "ActiveChart.SeriesCollection(m).XValues =" als Addresse eingeben muss?
wie die korrekte Eingabe hier aussieht, kannst du mit dem Macrorekorder rausfinden.
vermutlich muss die Zuweisung so aussehen (in meiner Exclversion zumindest):

ActiveChart.SeriesCollection(m).XValues = "='" & vrng.Parent.Name & "'!" & vrng.Address(ReferenceStyle:=xlR1C1)


Gruß, Daniel

Anzeige
AW: Oberflächendiagramm VBA
24.05.2008 12:37:00
Olli
Hi Daniel,
Die Funktion RangeToAddress habe ich mit aus diesem thread gemoppst ;-) https://www.herber.de/forum/archiv/932to936/t935939.htm
Sie funktioniert bei mir jedenfalls.
Der code bleibt aber schon vorher bei
Set vrng = Range(Cells(9 + (m - 1 * 365), 4), Cells(378 + (m - 1 * 365), 4))
hängen... Die Methode 'cells' für das Objekt '_Global' ist fehlgeschlagen
hm....

AW: Oberflächendiagramm VBA
24.05.2008 13:09:06
Daniel
Hi
dann überprüfen sie doch mal die Werte, die in der Berechung der Zeilen rauskommen.
ich tippe mal auf ein einfaches nichtbeachten der Punkt-vor-Strich-Regel in Termen.
Gruß, Daniel

Anzeige
AW: Oberflächendiagramm VBA
24.05.2008 13:09:36
Daniel
Hi
dann überprüfen sie doch mal die Werte, die in der Berechung der Zeilen rauskommen.
ich tippe mal auf ein einfaches nichtbeachten der Punkt-vor-Strich-Regel in Termen.
Gruß, Daniel

AW: Oberflächendiagramm VBA
24.05.2008 13:27:48
Olli
da war tatsächlich nen Pkt vor Strichfehler....aber der hat den code nicht unterbrochen :-/
so...der momentane Code lautet nun wie folgt:

Sub Schaltfläche2_BeiKlick()
Dim vrng As Range
Dim xrng As Range
Dim cht As Chart
Charts.Add
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection.NewSeries
ActiveChart.ChartType = xlSurface
Sheets("Ausgabe").Select
For m = 1 To 50
Set vrng = Range(Cells(9 + (m - 1) * 365, 7), Cells(378 + (m - 1) * 365, 7))
ActiveChart.SeriesCollection(m).Values = "='" & vrng.Parent.Name & "'!" & vrng.Address( _
ReferenceStyle:=xlR1C1)
Set xrng = Range(Cells(9 + (m - 1) * 365, 4), Cells(378 + (m - 1) * 365, 4))
ActiveChart.SeriesCollection(m).Values = "='" & vrng.Parent.Name & "'!" & xrng.Address( _
ReferenceStyle:=xlR1C1)
Next
With ActiveChart
.HasAxis(xlCategory) = True
.HasAxis(xlSeries) = True
.HasAxis(xlValue) = True
End With
ActiveChart.Axes(xlCategory).CategoryType = xlAutomatic
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlBottom
End Sub


Aber er funzt nicht...immer die selbe meldung für
Set vrng = Range(Cells(9 + (m - 1) * 365, 7), Cells(378 + (m - 1) * 365, 7))
"Die Methode 'cells' für .....fehlgeschlagen" :-(

Anzeige
AW: Oberflächendiagramm VBA
24.05.2008 14:01:00
Olli
Habe mal ein Beispiel hochgeladen....
https://www.herber.de/bbs/user/52597.zip
habe ein paar spalten und zeilen gelöscht, so dass die schleife nur noch bis 9 geht. es soll für jedes Jahr eine datenreihe angelegt werden. das Datum( ohne Jahr) soll auf die andere Achse. die werte aus spalte E sollen vertikal abgetragen werden.
mfg
olli

AW: Oberflächendiagramm VBA
24.05.2008 14:57:00
Daniel
Hi
deine Beispieldatei stoppt schon beim in der ersten Zeile, vor abschicken der Beispieldatei bitte testen, ob diese auch richtig funktionert bzw nicht funktioniert (wenn ein Fehler gefunden werden soll)
außerdem arbeitest du nicht mit OPTION EXPLICIT, was immer das Risiko von Tippfehlern in Variablennamen zur Folge hat.
Dazu bitte mal das Lesen und in deine Dateien einarbeiten: http://www.online-excel.de/excel/singsel_vba.php?f=4
zum Fehler:
solltest, wenn du Zellbezüge angibst, immer vollständig referenzieren, also mit Sheet-Angabe.
das macht dich unabhänig davon, welches Sheet gerad aktiv ist.
das gilt auch für Cells innerhalb von Range, auch hier muss der Code lauten "Range(Sheets(1).Cells(..), Sheets(1).Cells(..))"
um sich Schreibarbeit zu sparen, arbeitet man auch hier mit der With-Klammer.
Gruß, Daniel

Anzeige
AW: Oberflächendiagramm VBA
24.05.2008 17:18:41
fcs
Hallo Olli,
eine der wesentlichen Empfehlungen bei Programmierungen mit VBA: verwende möglichst keine Select- und Activate-Anweisungen. Diese sind zu 99.99 % aller Fälle nicht erforderlich. Eigentlich nur zu Beginn oder am Ende eines Makros, um ggf. die Startsituation herzustellen oder am Ende, um einen bestimmten Anzeigezustand zu erreichen.
Es ist immer besser mit Objekt-Variablen zu arbeiten, um Eigenschaften Abzufragen/Zuzuweisen oder Methoden anzuwenden.
In deinem Code hast du versucht in den Set-Anweisungen auf Range-Objekte im aktiven Blatt zuzugreifen, obwohl das neu erstellte Diagramm schon das aktive Blatt ist. Da spielt Excel nicht mit.
Num zum Diagramm:
Ein Flächen-Diagramm muss bei allen Datenreihen die gleiche X-Achse haben.
Ein Flächendiagramm erforderdert mindestens 2 Datenreihen. Deshalb hab ich die Typ-Zuweisung hinter die Next-Anweisung verschoben.
Wenn das Diagramm mit der Add-Methode angelegt wird, dann hat es noch keine 50 Datenreihen, deshalb müssen diese in der Schleife angelegt werden, wenn noch welche fehlen.
Die benutzerdefinierte Funktion zum Erzeugen der Bereichsadresse in RC-Schreibweise kann man noch ein wenig vereinfachen. Siehe mein Code.
Nachfolgend der modifizierte Code, der zumindest formal funktioniert.
Du schreibst du willst Daten aus 50 Jahren verarbeiten. Schaltjahre haben aber einen Tag mehr. Gibt es da nicht Probleme mit der Zeilenzahl Pro Jahr, wenn die Datenreihen eingelesen werden?
Alternativ-Vorschlag zur Auswertung:
Erstelle von deinen Daten einen Pivot-Tabellenbericht mit Diagramm
Zeilenfeld: Tag oder eine neue Spalte die das Datum als MM-TT ohne Jahr enthält
Spaltenfeld: Jahr
Datenfeld: Summe Y-Wert
Dann muss du nur noch den Diagramm-Typ ändern.
Die Spalte mit MM-TT kannst du Performel aus den X-Werten berechnen =TEXT(E9;"MM-TT").
Die Schreibweise MM-TT ist erforderlich, damit der Pivotbericht korrekt sortiert wird/werden kann.
Gruß
Franz

Sub Schaltfläche3_BeiKlick()
Dim vrng As Range
Dim xrng As Range
Dim m As Long
Dim objChart As Chart, objWks As Worksheet, objReihe As Series
Set objWks = ActiveSheet
Application.ScreenUpdating = False
Application.Charts.Add
Set objChart = ActiveChart
'Bereich X-Achse kann nur ein Bereich sein
With objWks
Set xrng = .Range(.Cells(9 + (1 - 1) * 365, 4), .Cells(373 + (1 - 1) * 365, 4))
End With
With objChart
For m = 1 To 8
With objWks
Set vrng = .Range(.Cells(9 + (m - 1) * 365, 5), .Cells(373 + (m - 1) * 365, 5))
End With
'Pürfen, ob Reihe m schon vorhanden
If objChart.SeriesCollection.Count 


Anzeige
AW: Oberflächendiagramm VBA
24.05.2008 21:44:17
Olli
Super....funzt :-)
Vielen Dank!!!
Gruß
Olli

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige