Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1492to1496
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
DIagramm per VBA erstellen mitversch. Vorgaben
11.05.2016 16:24:47
Willi
Hallo,
ich bin am verzweifeln. Der dynamische aufbau der Graphen funktioniert nicht so wie ich mir das gedacht habe.
Folgende Tabelle soll in mehreren Graphen dargestellt werden, 1. Total, 2 letzten 5 Jahreund drittens die letzten 2 Jahre
'P-date' ;200501;200502;200503;....;201603;201604
'05 Prior';0,00% ;0,001%;0,004%;....;0,006%;0,004%
'200501' ; ;0,001%;0,007%;....;0,004%;0,003%
'200502' ; ; ;0,000%;....;0,000%;0,001%
'200503' ; ; ; ; ; ;
.
.
'201603' ; ; ; ; ;0,000%;0,003%
'201604' ; ; ; ; ; ;0,001%
hierzu noch etwas, was sich ändern kann in den Tabellen, ist, das der Wert in Spalte z.B. 201604 und Reihe 201604 leer sein kann, weil es keine werte gibt, oder ist 0
Dannn fliegt das Makro unten auf die Nase.
Hier ist es dargestellt für alle Werte in der Tabelle
' Diagramm creation
StartRow = 2
-- Diagramm fängt erst mit den Werten der 2.ten Reihe an
' SDR PrepayRate Static
Set wksData = Worksheets(orgname)
-- Arbeitsblatt defienieren
'
' Freeze Panes, first row, first column
'
Cells.EntireColumn.AutoFit
Sheets(orgname).Select
ActiveWindow.FreezePanes = False
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollColumn = 1
ActiveWindow.SplitRow = 1
ActiveWindow.SplitColumn = 1
ActiveWindow.FreezePanes = True
With wksData
nRowsCnt = .Cells(.Rows.Count, 1).End(xlUp).Row
-- feststellen der maximalen Anzahl der darzustellenden Reihen
nColsCnt = .Cells(1, .Columns.Count).End(xlToLeft).Column
-- feststellen der maximalen Anzahl der darzustellenden Spalten
Set Bereich = .Range(.Cells(StartRow, 2), .Cells(nRowsCnt, nColsCnt))
-- Datenbereich zur Darstellung definieren
-- hier wird dann der Bereich entsprechend auf das gewünschte diagram angepasst nRowsCnt/nColsCnt -59 und nRowsCnt/nColsCnt-24
Bereich.Activate
-- nur Temporär
End With
Worksheets(graphsheet).Activate
-- aktivieren des Graphiksheets auf dem die Diagramme dargestellt werden
Worksheets(graphsheet).ChartObjects(graphname).Act ivate
-- aktivieren des Chartobjectes mit dem Namen graphname
With ActiveChart
.ChartType = xlLineMarkers
.SetSourceData Source:=Bereich
.PlotBy = xlRows
.HasLegend = True
.HasTitle = True
.ChartTitle.Text = graphname & " Static"
.ChartArea.Select
.Axes(xlCategory).Select
.Axes(xlCategory).TickLabelSpacing = 3
-- bis hier ist alle gut denke ich
-- ab hier fangen die Probleme an Beschreibung siehe unten
1) .SeriesCollection(1).XValues = wksData.Range(wksData.Cells(2, 1), wksData.Cells(nRowsCnt, 1))
For RowCount = 2 To nRowsCnt
.SeriesCollection(RowCount - 1).Name = wksData.Cells(RowCount, 1).Value
Next RowCount
.Legend.Select
Selection.Width = 179
End With
Set Bereich = Nothing
Probleme:
zu 1) wksData.Range(wksData.Cells(2, 1), wksData.Cells(nRowsCnt, 1))
liefert in den Values2 ein Array mit 137 Werten von 05 Prior bis 201604 das ist auch korrekt
die Zuweisung
.SeriesCollection(1).XValues = ...
liefert jedoch nur ein Array von 135 Werten von 05 Prior bis 201602 das ist nicht korrekt
Warum?
Dadurch kommt es dann inder nächsten For schelife natürlich zu einem Laufzeitfehler 1004 = ungultiger Parameter
denn das Array ist ja nur 135 groß und nicht 137.
Das ganze ist dynamisch und mit jedem Lauf unterschiedlich.
Wo ist mein gedanklicher Fehler?
Wäre für Hilfe echt super dankbar
Gruß
Willi

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

Betreff
Datum
Anwender
Anzeige
AW: DIagramm per VBA erstellen mitversch. Vorgaben
12.05.2016 09:57:58
Beverly
Hi Willi,
lade deine Mappe mit den Daten und dem Diagramm hoch.


AW: DIagramm per VBA erstellen mitversch. Vorgaben
12.05.2016 10:26:43
Willi
Hallo Karin,
105524 ist das Excel erlches funktioniert
105525 ist das was mit gleichem Makro nicht läuft
Danke Willi

Anzeige
AW: DIagramm per VBA erstellen mitversch. Vorgaben
12.05.2016 13:55:03
Beverly
Hi Willi,
das Problem in deiner Mappe 105525 liegt darin begründet, dass es anscheinend 1 Zeile gibt, in der Daten vorhanden sind, die Excel aber nicht als Zahl erkennt - deshalb haben die beiden Diagramme 1 Datenreihe zu wenig und der Code läuft auf den Fehler. Da das letzte Diagramm ab Zeile 138-23 dieses Problem nicht hat, muss der Fehler oberhalb dieser Zeile liegen


AW: DIagramm per VBA erstellen mitversch. Vorgaben
12.05.2016 15:39:13
Willi
Hi Karin,
das ist ein Hinweis, da werde ich mich mal auf die Suche machen. den ich kann ja den Bereich der dargestellt werden soll ja per .Activate markiern und im Debug modus mal anschauen.
werde mich mal glecih auf die Suche machen.
Erst einmal danke, werde mi ch dann wieder melden.
Gruß
Willi

Anzeige
AW: DIagramm per VBA erstellen mitversch. Vorgaben
12.05.2016 16:20:43
Willi
Hi Karin,
dieser Hinweis war genial. Es hängt mit dem ersten punkt des jeweiligen Diagramms zusammen.
Wenn dies keine Ziffer ist, hier in meinem Fall NULL, dann wird es nicht mit gezählt, was dahingehend Schwachsinn ist, weil auch folgende Zeilen und Spalten Werte NULL sind aber richtig gezählt werden. Jetzt stellt sich die Frage.
Wie kann ich diesen Abruch verhindern. das geht wahrscheinlich nur indem ich schaue ob der 1 Werte der Range (1,1) NULL ist und ihn dann mit 0 vorbesetze.
Nur wie bekomme ich den ersten Wert der Range raus.
Wenn du mir da noch einen Tipp geben könntest wäre mir sehr geholfen.
Gruß
Willi

Anzeige
AW: DIagramm per VBA erstellen mitversch. Vorgaben
12.05.2016 19:29:00
Beverly
Hi Willi,
du könntest zu Beginn alle leeren Zellen mit 0 füllen und am Ende wieder löschen:
Sub SDRPrepayRate2()
' Macro to create the SDR PrepayRate Graph
' Keyboard Shortcut: Ctrl+Shift+P
Dim wksData     As Worksheet
Dim nRowsCnt    As Long
Dim nColsCnt    As Long
Dim LegRowCount As lonh
Dim MaxColCount As Integer
Dim MaxRowCount As Long
Dim RowCount As Long
Dim StartRow As Long
Dim Bereich As Range
Dim graphsheet As String
Dim graphname As String
Dim DynaGraph As String
Dim Dyna2Graph As String
Dim rngLeere As Range
Dim orgname As String
StartRow = 2
orgname = "SDR Prepay Rate"
graphsheet = "SDR Prepay Rate Graph"
graphname = "SDR Prepay"
DynaGraph = "SDR Prepay Dyn"
Dyna2Graph = "SDR Prepay Dyn 2"
Application.StatusBar = "Creating Graph data: " + graphsheet
Application.ScreenUpdating = False
Set wksData = Worksheets(orgname)
With wksData
If ActiveSheet.Name  orgname Then .Select
.Cells.EntireColumn.AutoFit
ActiveWindow.FreezePanes = False
ActiveWindow.ScrollRow = 1
ActiveWindow.ScrollColumn = 1
ActiveWindow.SplitRow = 1
ActiveWindow.SplitColumn = 1
ActiveWindow.FreezePanes = True
MaxRowCount = IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, _
.Rows.Count)
MaxColCount = IIf(IsEmpty(Cells(1, .Columns.Count)), .Cells(1, .Columns.Count).End( _
xlToLeft).Column, .Columns.Count)
If InStr(1, .Cells(1, MaxColCount + 3).Value, "Total", vbTextCompare) > 0 Then
MaxColCount = MaxColCount - 1
End If
' ? weshalb die letzen belegten Zellen nocheinmal ermitteln ?
nRowsCnt = .Cells(.Rows.Count, 1).End(xlUp).Row
nColsCnt = .Cells(1, .Columns.Count).End(xlToLeft).Column
Set Bereich = .Range(.Cells(StartRow, 2), .Cells(nRowsCnt, nColsCnt))
' alle leeren Zellen mit 0 füllen falls leere vorhanden
On Error Resume Next
Set rngLeere = Bereich.SpecialCells(xlCellTypeBlanks)
On Error GoTo 0
If Not rngLeere Is Nothing Then rngLeere.Value = 0
End With
' Diagramm creation
' SDR PrepayRate Static
With Worksheets(graphsheet).ChartObjects(graphname).Chart
.ChartType = xlLineMarkers
.SetSourceData Source:=Bereich
.PlotBy = xlRows
.HasLegend = True
.HasTitle = True
.ChartTitle.Text = graphname & " Static"
.Axes(xlCategory).TickLabelSpacing = 3
.SeriesCollection(1).XValues = wksData.Range(wksData.Cells(2, 1), wksData.Cells( _
nRowsCnt, 1))
For RowCount = 2 To nRowsCnt
.SeriesCollection(RowCount - 1).Name = wksData.Cells(RowCount, 1).Value
Next RowCount
.Legend.Width = 179
End With
Set Bereich = Nothing
' SDR PrepayRate 5 years Dynamic
If MaxRowCount > 59 Then
With wksData
Set Bereich = .Range(.Cells(nRowsCnt - 59, nColsCnt - 59), .Cells(nRowsCnt,  _
nColsCnt))
End With
With Worksheets(graphsheet).ChartObjects(DynaGraph).Chart
.ChartType = xlLineMarkers
.SetSourceData Source:=Bereich
.PlotBy = xlRows
.HasLegend = True
.HasTitle = True
.ChartTitle.Text = DynaGraph & " 5 Yrs"
.Axes(xlCategory).TickLabelSpacing = 2
.SeriesCollection(1).XValues = wksData.Range(wksData.Cells(nRowsCnt - 59, 1),  _
wksData.Cells(nRowsCnt, 1))
LegRowCount = 0
For RowCount = nRowsCnt - 59 To nRowsCnt
LegRowCount = LegRowCount + 1
.SeriesCollection(LegRowCount).Name = wksData.Cells(RowCount, 1).Value
Next RowCount
.Legend.Width = 110.2
End With
End If
Set Bereich = Nothing
' SDR PrepayRate 2 years Dynamic
If MaxRowCount > 23 Then
With wksData
Set Bereich = .Range(.Cells(nRowsCnt - 23, nColsCnt - 23), .Cells(nRowsCnt,  _
nColsCnt))
End With
With Worksheets(graphsheet).ChartObjects(Dyna2Graph).Chart
.ChartType = xlLineMarkers
.SetSourceData Source:=Bereich
.PlotBy = xlRows
.HasLegend = True
.HasTitle = True
.ChartTitle.Text = Dyna2Graph & " Yrs"
.ChartArea.Select
.Axes(xlCategory).TickLabelSpacing = 1
.SeriesCollection(1).XValues = wksData.Range(wksData.Cells(nRowsCnt - 23, 1),  _
wksData.Cells(nRowsCnt, 1))
LegRowCount = 0
For RowCount = nRowsCnt - 23 To nRowsCnt
LegRowCount = LegRowCount + 1
.SeriesCollection(LegRowCount).Name = wksData.Cells(RowCount, 1).Value
Next RowCount
End With
End If
rngLeere.ClearContents
Set Bereich = Nothing
Set wksData = Nothing
Set rngLeere = Nothing
Application.ScreenUpdating = True
End Sub


Anzeige
AW: DIagramm per VBA erstellen mitversch. Vorgaben
13.05.2016 07:21:47
Willi
Hallo Karin,
danke für diese Lösung.
Ich habe selbst noch ein wenig probiert, dabei habe ich festgestellt, das das Problem durch die erste Zelle, des jeweiligen Berichs, verusacht wird. Ist dieses Leer läuft das Makro gegen die Wand.
Mein Lösung sieht jetzt vor, das eine Prüfung der ersten Zelle des aktuellen Bereichs, durchegführt wird. Ist diese Lee wird sie zu 0 gesetzt und nach der Erstellung des Diagramms wieder raus geworfen.
Funktioniert wie erwartet.
Für mich war der wichtigste Hinweis, der Hinweis auf die Daten.
Hier ist Excel, vielleicht auch wir in unserer Denke nicht korrekt, Leer ist für excel Leer und nicht Null.
Danke für die Lösung.
Achso das mit der doppelten ermittlung ist ein überbleibsel aus dem Vorgänger den ich jetzt eliminieren werde.
Danke Willi

Anzeige
AW: DIagramm per VBA erstellen mitversch. Vorgaben
13.05.2016 07:50:07
Willi
Hallo Karin,
Habe deine Lösung eingebaut, da ich damit die drei Prüfungen weg lassen kann.
Danke.
Gruß
Willi

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige