Thema Datum  Von Nutzer Rating
Antwort
03.03.2009 15:20:49 Nelly
NotSolved
03.03.2009 17:40:37 Holger
NotSolved
03.03.2009 17:57:23 Nelly
NotSolved
04.03.2009 11:25:39 Holger
NotSolved
04.03.2009 11:50:10 Nelly
NotSolved
04.03.2009 15:50:50 Nelly
NotSolved
Rot Aw:Aw:Aw:Aw:Aw:Aw:Array mittles variable abteilen
05.03.2009 11:17:47 Holger
NotSolved
04.03.2009 14:29:42 Nelly
NotSolved

Ansicht des Beitrags:
Von:
Holger
Datum:
05.03.2009 11:17:47
Views:
898
Rating: Antwort:
  Ja
Thema:
Aw:Aw:Aw:Aw:Aw:Aw:Array mittles variable abteilen
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

Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
03.03.2009 15:20:49 Nelly
NotSolved
03.03.2009 17:40:37 Holger
NotSolved
03.03.2009 17:57:23 Nelly
NotSolved
04.03.2009 11:25:39 Holger
NotSolved
04.03.2009 11:50:10 Nelly
NotSolved
04.03.2009 15:50:50 Nelly
NotSolved
Rot Aw:Aw:Aw:Aw:Aw:Aw:Array mittles variable abteilen
05.03.2009 11:17:47 Holger
NotSolved
04.03.2009 14:29:42 Nelly
NotSolved