Avatar billede kim1a Ekspert
29. juli 2014 - 10:20 Der er 4 kommentarer og
1 løsning

Graf farve på søjler alt efter værdi (vba)

Kære Eksperter

Jeg har en graf hvor dataen via en række formler sorterer automatisk i størrelsesorden. Nu ønsker jeg at sætte farve (bare rød/gul/grøn) på søjlerne alt efter deres værdi.
Da jeg i forvejen har en anderledes struktur på dataen kan jeg ikke bruge denne løsning:
http://www.eksperten.dk/spm/259833

Jeg har derfor arbejdet med vba, men det driller. Kraftigt inspireret af Googling har jeg fået skrevet denne:
Sub Color_BarChart_Categories()
' Color Each Bar (Series) in a Bar Chart
' based on its percent value.
' Note: Instead of Series you can base on Categories.
'--
Dim oChart As Excel.Chart
Dim oChartObject As Excel.ChartObject
Dim oPoint As Excel.Point
Dim sngPercente As Single
'--
' Reference first chart on worksheet 'Sheet1'
Set oChartObject = ThisWorkbook.ActiveSheet.ChartObjects("Chart 11")
oChartObject.Activate
Set oChart = oChartObject.Chart
'--
' Loop Series and color based on its percent values
For Each oPoint In oChart.SeriesCollection(1).Points

With oPoint
.Format.Fill.Visible = msoTrue
.Format.Fill.Solid
'--
Select Case sngPercente
Case Is < 0.8: .Interior.Color = vbRed
Case Is < 0.9: .Interior.Color = vbYellow
Case Else: .Interior.Color = vbGreen
End Select
End With
Next oPoint

' Release object variables
Set oChartObject = Nothing
Set oChart = Nothing

End Sub

Desværre farver den alle søjler røde - hvilket får mig til at tro det er noget med min % løsning som ikke fungerer.
Samtidig er det en smule indviklet for en rookie som jeg. Det burde da være muligt at lave en simpel VBA a la dette:

Sub Color_BarChart_values()
' Color Each Bar (Series) in a Bar Chart
' based on its value.
Dim i As Integer
Dim sngValue As Single
' Reference first chart on worksheet 'Sheet1'
ThisWorkbook.ActiveSheet.ChartObjects("Chart 11").Activate

For i = 1 To 9
sngValue = Selection.SeriesCollection(1).Points(i)

With sngValue
.Format.Fill.Visible = msoTrue
.Format.Fill.Solid

Select Case sngValue
Case Is < 0.8: .Interior.Color = vbRed
Case Is < 0.9: .Interior.Color = vbYellow
Case Else: .Interior.Color = vbGreen
End Select
End With
Next i

End Sub
Avatar billede kim1a Ekspert
29. juli 2014 - 10:23 #1
Den nederste virker åbenlyst ikke - with forlanger object eller variant, men at sætte variablen til dette er ikke løsningen.

Det var mere for at illustrere hvad jeg ville opnå. Simplet at vælge chartet, så løbe værdi 1 til 9 igennem og farve efter case.
Avatar billede supertekst Ekspert
29. juli 2014 - 11:57 #2
Avatar billede kim1a Ekspert
29. juli 2014 - 13:11 #3
Haha - ja jeg sad også og kiggede på denne selv (da det også var mig der spurgte), men det forekom mig svært at skelne det fornuftigt ud. Og især synes jeg at detvar ret besværligt når jeg egentlig "bare" skal have en til at løbe værdierne igennem.
Avatar billede kim1a Ekspert
30. juli 2014 - 09:39 #4
Nu fik jeg luget lidt ud i det, men den farver stadig alle søjler grønne uanset, så nu er det blot et spørgsmål om værdien.

Grafen står i procent både i tabel og graf, så det må være forkert måde jeg skriver det i VBAen?

Sub Color_BarChart_values()
' Color Each Bar (Series) in a Bar Chart
' based on its value.
Dim i As Integer

ThisWorkbook.ActiveSheet.ChartObjects("Chart 11").Activate

For i = 1 To 9
ActiveChart.SeriesCollection(1).Points(i).Select

With Selection
.Format.Fill.Visible = msoTrue
.Format.Fill.Solid

Select Case i
Case Is < 0.8: .Interior.Color = vbRed
Case Is < 0.9: .Interior.Color = vbYellow
Case Else: .Interior.Color = vbGreen
End Select
End With
Next i

End Sub
Avatar billede kim1a Ekspert
30. juli 2014 - 10:49 #5
Her var den løsning jeg ledte efter:
Sub color_value_in_charts()
    Dim s As Series
    Dim i As Long
   
  ThisWorkbook.ActiveSheet.ChartObjects("chart 11").Select
  With ActiveChart
      For Each s In .SeriesCollection
          For i = 1 To s.Points.Count
              If s.Values(i) < 0.8 Then
                    s.Points(i).Interior.Color = vbRed
              ElseIf s.Values(i) < 0.9 Then
                    s.Points(i).Interior.Color = vbYellow
              Else:
                    s.Points(i).Interior.Color = vbGreen
              End If
          Next i
      Next s

  End With
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester