2012-12-12 23 views
5

Ho alcuni grafici in cui i valori X sono testo e Y valori sono numerici. Voglio colorare ogni barra rossa se il valore Y per la barra è minore di zero, verde se maggiore o uguale a zero. Inoltre, se il valore X della barra è "NET CHANGE", ho bisogno che la barra sia gialla. Ho seguito le istruzioni in un thread StackOverflow precedente qui: Changing Bar colors using VBA based on category label.excel vba cambiando il colore del grafico a barre per un punto dati basato sul valore punto

Sto ricevendo l'errore di run-time 451 La procedura di proprietà di lasciare non definita e la procedura di acquisizione delle proprietà non ha restituito un oggetto.

Il mio codice è qui sotto:

For chartIterator = 1 To ActiveSheet.ChartObjects.count 

    For pointIterator = 1 To ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator).Chart.SeriesCollection(1).Points.count 
     If ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator).Chart.SeriesCollection(1).Values(pointIterator) >= 0 Then 
      ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator).Chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _ 
       RGB(146, 208, 80) 
     Else 
      ActiveWorkbook.Sheets("Due To Chart").ChartObjects(chartIterator).Chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _ 
       RGB(255, 0, 0) 
     End If 
    Next pointIterator 

Next chartIterator 

L'errore arriva fino al l'istruzione IF. Ho anche provato. Punti (pointIterator) .Value, che mi ha procurato un errore "proprietà o metodo non definito per questo oggetto".

Qualche idea su cosa sto facendo male?

Grazie in anticipo per il vostro aiuto.

risposta

6

Si sta riscontrando un problema nell'utilizzo di SeriesCollection (1) .Values, che si sta trattando come un array su cui è possibile eseguire l'iterazione. Invece, questa è una funzione che restituisce i valori dei punti in SeriesCollection.

È necessario assegnare i risultati della funzione a una variabile di matrice, quindi eseguire un'iterazione sull'array per verificare se i valori nell'array sono maggiori o minori di zero. Quindi, è possibile assegnare i colori ai punti del grafico.

Questo codice dovrebbe fare il trucco:

Sub color_chart() 

    Dim chartIterator As Integer, pointIterator As Integer, _ 
     seriesArray() As Variant 

    For chartIterator = 1 To ActiveSheet.ChartObjects.Count 
     seriesArray = ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator). _ 
         chart.SeriesCollection(1).Values 

     For pointIterator = 1 To UBound(seriesArray)    

      If seriesArray(pointIterator) >= 0 Then 
       ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator). _ 
       chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _ 
       RGB(146, 208, 80) 
      Else 
       ActiveWorkbook.Sheets("Sheet1").ChartObjects(chartIterator). _ 
       chart.SeriesCollection(1).Points(pointIterator).Interior.Color = _ 
       RGB(255, 0, 0) 
      End If 

     Next pointIterator 

    Next chartIterator 

    End Sub 
+0

questo ha funzionato perfettamente, grazie! – user1899231

1

Ecco un'alternativa che non richiede VBA, e funziona in modo dinamico come aggiornamento formule. Controlla l'esempio "condizionale formattato Bar Chart" in questo tutorial:

Conditional Formatting in Excel Charts

+0

Inizialmente non l'ho verificato, ma in realtà è molto interessante. Grazie! – user1899231