none
farbe eines einzelnen Chartbalken aus VB ändern RRS feed

  • Frage

  • Servus Experten

    ich erstelle aus der folgenden Tabelle :

    			
    Soll-Wert	100		
    Ist-Wert		85,71428571	85,71428571
    Deckungslücke		               	14,28571429
    

    das folgende Chart

    Das mit folgendem Code:

       	Dim xlApp As excel.Application
            Dim xlWorkBook As excel.Workbook
            Dim xlWorkSheet As excel.Worksheet
            Dim misValue As Object = System.Reflection.Missing.Value
            Dim xMychart As excel.Chart
    
            xlApp = New excel.Application
            xlWorkBook = xlApp.Workbooks.Add(misValue)
            xlWorkSheet = xlWorkBook.Sheets(1)
    
            Dim IstWert As Decimal = 120
            Dim SollWert As Decimal = 140
            Dim Deckung As Decimal = Math.Abs(IstWert - SollWert)
            
    'add data
            xlWorkSheet.Cells(1, 1) = ""
            xlWorkSheet.Cells(2, 1) = "Soll-Wert"
            xlWorkSheet.Cells(3, 1) = "Ist-Wert"
            xlWorkSheet.Cells(4, 1) = IIf(IstWert < SollWert, "Deckungslücke", "Überdeckung")
    
            xlWorkSheet.Cells(2, 2) = 100
            xlWorkSheet.Cells(3, 3) = IstWert / SollWert * 100
            xlWorkSheet.Cells(3, 4) = IIf(IstWert > SollWert, 100, IstWert / SollWert * 100)
            xlWorkSheet.Cells(4, 4) = Deckung / SollWert * 100
     
    
            'create chart
            Dim chartPage As excel.Chart
            Dim xlCharts As excel.ChartObjects
            Dim myChart As excel.ChartObject
            Dim chartRange As excel.Range
    
            xlCharts = xlWorkSheet.ChartObjects
            myChart = xlCharts.Add(10, 80, 300, 250)
    
            chartPage = myChart.Chart
            chartRange = xlWorkSheet.Range("A1", "D4")
            chartPage.SetSourceData(Source:=chartRange)
            chartPage.ChartType = excel.XlChartType.xlColumnClustered
    
            Dim myAxis As excel.Axis = CType(chartPage.Axes(excel.XlAxisType.xlValue, excel.XlAxisGroup.xlPrimary), excel.Axis)
            Dim Myseries As excel.Series = CType(chartPage.SeriesCollection(2), excel.Series)
            Debug.Print(Myseries.Points.count)
            With chartPage
                .ChartType = 52
                .PlotArea.Interior.ColorIndex = 2
                .ChartArea.Font.Size = 8
                .HasLegend = False
                .ApplyDataLabels()
                .HasTitle = False
                .HasLegend = True
                .SeriesCollection(1).interior.color = Color.Red
                .SeriesCollection(2).interior.color = Color.Brown
                .SeriesCollection(3).interior.color = Color.Blue
             End With
            'myAxis.
            With myAxis
                .HasTitle = False
                '.AxisTitle.Text = "Sales Figures"
                .MaximumScaleIsAuto = False
                .MinimumScaleIsAuto = False
                .MinimumScale = 0
                .MajorUnit = 100
            End With
    
    
            'exporting chart as picture file
            xMychart = CType(chartPage, excel.Chart)
            chartPage.Export("C:\test.jpg", "JPG")
            'xMychart.Export("C:\xy.jpg", "JPG")
            'myChart.Chart.Export("C:\excel_chart_export.bmp")
            'chartPage.ChartType.eSaveAs("C:\excel_chart_export.bmp", "BMP")
            'xlWorkSheet.ChartObjects(1).chart.Export("C:\excel_chart_export.bmp", "BMP")
    
            xlWorkSheet.SaveAs("C:\vbexcel.xls")
            xlWorkBook.Close()
            xlApp.Quit()
    
            releaseObject(xlApp)
            releaseObject(xlWorkBook)
            releaseObject(xlWorkSheet)
    
            MsgBox("Chart File Exported !")

    Mit der Codezeile [.SeriesCollection(2).interior.color = Color.Brown]  ändere ich die Farbe (siehe braune Balken im Bild) und zwar von beiden Balken auf einmal. Ich möchte aber von jedem Balken einzeln die Farbe ändern?!

    Idee ??? mfg eem monarch

    Donnerstag, 2. Juli 2015 14:11

Antworten

  • Hallo Monarch,

    zusätzlich zu Dimitars Antwort klebe ich Dir mal ein Beispiel an, das ich seinerzeit zum Flackern in einer PowerpointPräsentation machen sollte. Darin kannst Du m.E.n fast alles erkennen.

    Sub BlinkendeCharts()
            Dim i As Integer
            Dim n As Integer
            Dim Chart As Excel.Chart
            Set Chart = ActiveChart
            For n = 1 To Chart.SeriesCollection.Count
                For i = 1 To Chart.SeriesCollection(n).Points.Count
                    Chart.SeriesCollection(n).Points(n).Format.Fill.ForeColor.RGB = RGB(getRand, getRand, getRand)
                Next i
            Next n
    End Sub
    
    Function getRand() As Integer
    Randomize
    getRand = Rnd * 255
    End Function

    das ist jetzt natürlich direkt VBA.

    Du müsstest das halt auf die Fremdanwendung rüberziehen.

    Gruß bei noch 32°C aus Hannover

    Raimo

    Samstag, 4. Juli 2015 13:35

Alle Antworten

  • Hallo Monarch-Falter,

    Hoffentlich hilft Dir die Lösung aus dieser Diskussion, bei der alle Punkte in der gewünschten Reihe gefärbt werden:
    Changing Bar colors using VBA based on category label

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 3. Juli 2015 13:52
    Administrator
  • Hallo Monarch,

    zusätzlich zu Dimitars Antwort klebe ich Dir mal ein Beispiel an, das ich seinerzeit zum Flackern in einer PowerpointPräsentation machen sollte. Darin kannst Du m.E.n fast alles erkennen.

    Sub BlinkendeCharts()
            Dim i As Integer
            Dim n As Integer
            Dim Chart As Excel.Chart
            Set Chart = ActiveChart
            For n = 1 To Chart.SeriesCollection.Count
                For i = 1 To Chart.SeriesCollection(n).Points.Count
                    Chart.SeriesCollection(n).Points(n).Format.Fill.ForeColor.RGB = RGB(getRand, getRand, getRand)
                Next i
            Next n
    End Sub
    
    Function getRand() As Integer
    Randomize
    getRand = Rnd * 255
    End Function

    das ist jetzt natürlich direkt VBA.

    Du müsstest das halt auf die Fremdanwendung rüberziehen.

    Gruß bei noch 32°C aus Hannover

    Raimo

    Samstag, 4. Juli 2015 13:35