Hallo Nelly,
ich hatte dein erstes Schreiben so verstanden, dass du dein Array sortiert und in diesem Zustand nach Excel für die Erzeugung der Grafik zurückgeschrieben hattest.
Sei Arr(n-1) dein Array mit n Einträgen und der Bereich, in das du es zurückschreiben willst, B1 bis Bn auf dem aktiven Tabellenblatt.
for i=1 to n
cells(i,2)=Arr(i-1)
next i
Du könnstest auch gleich in dem Bereich, in dem deine Ausgangsdaten stehen, sortieren, danach eine Grafik erzeugen und dein Farbmuster anwenden. In meinem Beispiel nehme ich wieder an, dass deine Ausgangsdaten ggf. unsortiert in Spalte B bedinned bei B1 stehen und dass sich keine weiteren Einträgen in der Spalte B befinden. Sonst kannst den code leicht anpassen. Die Sortierung erfolgt absteigend.
variable = 4
zahl = Cells(Rows.Count, 2).End(xlUp).Row
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("b1") _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.SetRange Range(Cells(1, 2), Cells(zahl + 1, 2))
.Header = xlNo
.Apply
End With
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("Tabelle1!$B$1:$B$13")
ActiveChart.ChartType = xlColumnClustered
For j = 1 To zahl Step variable
For k = 0 To 3
If j + k größer zahl Then Exit For 'durch das Größerzeichen ersetzen!
with ActiveChart.SeriesCollection(1).Points(j + k).Fill
.OneColorGradient Style:=msoGradientHorizontal, Variant:=2, Degree:=0.231372549019608
.Visible = True
.ForeColor.SchemeColor = Int((j - 1) / variable) + 3
End With
Next k
Next j
Nun zu deiner anderen Frage. Nicht die Chart ist "active", sondern das Tabellenblatt.
ActiveSheet.ChartObjects(2).Chart.SeriesCollection(1).Points.Count
bezieht sich also auf die 2. Chart in der Chartauflistung der gerade angezeigten Tabellenblattes,
ActiveSheet.ChartObjects(3).Chart.SeriesCollection(1).Points.Count
entsprechend auf die 3.
Die Charts brauchen dafür nicht markiert zu sein, wie du in meinem Code erkennen kannst.
Wenn du eine Chart auf einem Tabellenblatt benötigst, musst du
Worksheets("Tabellenblattname").ChartObjects(3).Chart.SeriesCollection(1).Points.Count
und in einer anderen Arbeitsmappe
workbooks("Arbeitsmappenname").sheets("Tabellenblattname").ChartObjects(3).Chart.SeriesCollection(1).Points.Count
verwenden.
Gruß
Holger
Nelly schrieb am 04.03.2009 15:50:50:
hallo,
habe nun mein problem anders gelöst, hab auf mein array verzichtet und es in excel einfach absteigend sortiert, funkt jetzt einwandfrei. nur habe ich noch eine andere frage, ich habe in einem datenblatt 3 charts, wenn ich nummer 1 anklicke gilt diese codezeile: ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points.Count
nr2. : ActiveSheet.ChartObjects(2).Chart.SeriesCollection(1).Points.Count
jedoch funktioniert diese zeile ja immer nur wenns "active" also angeklickt ist, wie mache ich denn das, dass ich keinen chart anklicken muss um ihn anzusprechen?? bzw. der sinn meiner codezeile trotz veränderung gleich bleibt?
nur zur info, es sind 3 unterschiedliche charts, balken, punkt, säule.
möchte nämlich bedingungen setzten, sprich: balkenanzahl ein sortiertes array(daten werden aber nicht aktualisiert in der tabelle), weil es den (bspweise) wert 1 hellgrün färbt oder den wert -2 rot färbt, da der im array an letzter stelle steht.
lg Nelly
Holger schrieb am 04.03.2009 11:25:39:
Hallo Nelly,
sieh dir mal in der VBA-Hilfe die Erläuterungen zur For...Next-Anweisung und Array-Funktion an!
Du hat dein Array sortiert und als Chart dargestellt. Die Unterteilung erfolgt nicht, indem du den Inhalt der Array-Variablen verwendest, sondern den Index. Du willst doch z.B. die ersten vier Zahlen in einer Frabgruppe darstellen. Das sind die Indizes 0, 1, 2, und 3. Die Werte von Arr(0), Arr(1), Arr(2) und Arr(3) sind doch bereits die Längen deiner Balken in der Chart.
Ich habe dir noch einzelne Indizes im Makro angepasst, damit es ohne weitere Änderungen lauffähig ist.
variable = 4
zahl = 20
ReDim Farbe(Int((zahl - 1) / variable))
Farbe(0) = 3
Farbe(1) = 43
Farbe(2) = 4 'in deinen Colorindex -Wunsch ändern
Farbe(3) = 5 'in deinen Colorindex -Wunsch ändern
Farbe(4) = 6 'in deinen Colorindex -Wunsch ändern
'... ergänzen, falls Zahl größer als 20
For j = 1 To zahl Step variable
For k = 0 To 3
If j + k größer zahl Then Exit For 'durch das Größerzeichen ersetzen
ActiveChart.SeriesCollection(1).Points(j + k).Select
Selection.Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=2, _
Degree:=0.231372549019608
With Selection
.Fill.Visible = True
.Fill.ForeColor.SchemeColor = Farbe(Int((j - 1) / variable))
'oder einfach .Fill.ForeColor.SchemeColor =Int((j - 1) / variable)+3
End With
Next k
Next j
Gruß
Holger
Nelly schrieb am 03.03.2009 17:57:23:
Hallo Holger!
Danke erstmal für deine Hilfe.
Hmm, ich bin draufgekommen, dass wenn ich das so mache, hat das ganze nichts mit meinem sortiertem Array zu tun. ich möchte ja das array als hilfe heranziehen. eben ein absteigend sortiertes array, und dann je nach eingabe der variable(in meinem fall =4), das array "abteilen". sprich in 4er schritten die einfärbung vornehmen.
Das heißt ich müsste auf mein array zugreifen. sprich rot wäre von arr(0) bis arr(3), orange arr(4)-(7), usw.
nur fori=arr(0) to arr(zahl) step variable
funktioniert nicht, geht gar nicht mal in die schleife rein...
weißt du vlt wie das funktionieren könnte??
lg Nelly
Holger schrieb am 03.03.2009 17:40:37:
Hallo Nelly,
wenn variable größer als 1 ist, nimmt J nie den Wert 2 an, da wegen For J = 1 To zahl Step variable die Zahlen 1, 1+variable, 1+variable+variable usw. durchlaufen werden. Also wird der Case 2 nicht angesprungen.
Versuche mal folgenden Ansatz:
redim Farbe(4)
Farbe(0)=3
Farbe(1)=43
...
For J = 1 To zahl Step variable
For k = 1 To 4
ActiveChart.SeriesCollection(1).Points(k).Select
Selection.Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=2, _
Degree:=0.231372549019608
With Selection
.Fill.Visible = True
.Fill.ForeColor.SchemeColor = farbe(j)
End With
Next k
next j
Ob dein Code zur Einfärbung funktioniert, habe ich nicht weiter geprüft.
Gruß
Holger
Nelly schrieb am 03.03.2009 15:20:49:
Halli Hallo, ich wäre auf eure Hilfe angewiesen und zwar:
hab die Daten aus meiner Tabelle in ein Array gespeichert, dieses dann soriert, und auch die Länge ausgegeben. Nun habe ich ein absteigend sortiertes Array, diese Werte befinden sich allerdings in einem Chart. Ich möchte nun mein Chart mit 5 Fraben einfärben, Grün(0-20%), hellgrün(20-40%), gelb(40-60%), orange(60-80%), rot(80-100%).
habe mir das so vorgestellt, dass man mit einer Variablen sagt, wann die nächste Farbe dran ist. zB. 20 Balken, variable=4 --> die ersten 4 sind grün, nächsten 4 hellgrün usw.
variable = 4
For J = 1 To zahl Step variable
Select Case (J)
Case 1
For k = 1 To 4
ActiveChart.SeriesCollection(1).Points(k).Select
Selection.Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=2, _
Degree:=0.231372549019608
With Selection
.Fill.Visible = True
.Fill.ForeColor.SchemeColor = 3
End With
Next k
Case 2
For u = 4 To 8
ActiveChart.SeriesCollection(1).Points(u).Select
Selection.Fill.OneColorGradient Style:=msoGradientHorizontal, Variant:=2, _
Degree:=0.231372549019608
With Selection
.Fill.Visible = True
.Fill.ForeColor.SchemeColor = 43
End With
Next u
End Select
Next
nur leider springt dieser nicht in die nächsten case, case 2, case 3, ... bzw. glaub ich auch dass dies nicht der richtige Ansatz ist, wäre echt dankbar, wenn mir jemand helfen könnte!!!!
Vielen Dank, lG Nelly |