2016-06-30 64 views
5

Sto cercando di memorizzare i colori del tema mso in una variabile in modo che i colori ei motivi del grafico possano cambiare dinamicamente (Th variabile in questa situazione). Ecco il mio codice corrente:Archivio VBA msoThemeColor nella variabile

Dim Th As Long 
Th = "msoThemeColorAccent" & ActiveCell.Offset(-5, 0) 
If ActiveCell = "Realized" Then 
    ActiveChart.SeriesCollection(Srs).Select 

    With Selection.Format.Fill 
     .ForeColor.ObjectThemeColor = Th 
     .Solid 
    End With 
    With Selection.Format.Line 
     .ForeColor.ObjectThemeColor = Th 
    End With 
End If 

Sto pensando che il problema qui è che non sto usando la categorizzazione Dim corretta. Ho visto domande su come memorizzare RGB come variabili (usando Dim Long sembrava essere la soluzione) ma ancora nulla su msoThemeColors. Grazie e fammi sapere se posso fornire altri dettagli!

+0

"Sto pensando il problema qui è ..." ti stai un errore con il tuo codice? O semplicemente non funziona come te lo aspetti? Se un errore, quale errore a quale linea? – BruceWayne

+0

Scusa: in pratica la variabile Th non viene riconosciuta. Nessun messaggio di errore. Msothemecolor –

+0

Rimuovi il 'come Long' e vedi cosa succede se è appena impostato su' Variant' (in alternativa, prova 'String'). Inoltre, assicurati che la cella offset sia compresa tra 1 e 6. – BruceWayne

risposta

5

Poiché msoThemeColorAccent è un'enumerazione, il codice riportato di seguito funzionerà.

Dim lThemeColor As Long 
lThemeColor = ActiveCell.Offset(-5, 0) + 4 
'msoThemeColor1 enum is 5, 2 is 6, 3 is 7 ... so add 4 to the value 

If ActiveCell = "Realized" Then 

    With ActiveChart.SeriesCollection(Srs).Format 
     With .Fill 
      .ForeColor.ObjectThemeColor = lThemeColor 
      .Solid 
     End With 
     With .Line 
      .ForeColor.ObjectThemeColor = lThemeColor 
     End With 
    End With 

End If 
+1

Ho finito per andare con la soluzione di Scott ma la spiegazione di Mat mi ha aiutato a capire dentro e fuori. Grazie a tutti per l'aiuto fantastico !! –

+0

@JKo_FinanceUso - Sono felice che tu abbia avuto la tua risposta. Suggerirei comunque di studiare a fondo la risposta di Mat. Ci sono un sacco di ottime pratiche di programmazione. –

8

E 'difficile dire che cosa sta succedendo, perché il codice si basa fortemente su membri predefiniti. Ad ogni modo:

Dim Th As Long 

Questo è corretto.

Dim themeColorIndex As MsoThemeColorIndex 

Questo è corretto e esplicito (vedi MsoThemeColorIndex su MSDN).

Come Scott Holtzman said, i valori possibili qui sono valori Enum, non stringhe: non è possibile generare il valore corretto concatenando le stringhe in uno dei nomi definiti Enum.

Così facendo questo:

Th = "msoThemeColorAccent" & ActiveCell.Offset(-5, 0) 

La mia ipotesi è che ActiveCell.Offset(-5, 0) deve contenere un numero compreso tra 1 e 6. Questo è un presupposto pericoloso fare: ActiveCell potrebbe essere letteralmente nulla. Se tale valore è in una cella specifica, riferirsi ad esso dal suo indirizzo:

themeColorIndex = Sheet1.Range("B12").Value 

Questo è leggermente meglio, ma assume ancora che il valore in B12 può essere implicitamente convertito in un numero intero Long.

Dim selectedValue As Variant 
selectedValue = Sheet1.Range("B12").Value 
If Not IsNumeric(selectedValue) Then 
    MsgBox "Invalid value!" 
    Exit Sub 
End If 

If Sheet1.Range("E12").Value <> "Realized" Then Exit Sub 

Dim themeColorIndex As MsoThemeColorIndex 
themeColorIndex = selectedValue 

Se siete interessati solo a msoThemeColorAccent1 attraverso msoThemeColorAccent6, quindi ti consigliamo B12 per contenere i valori 5 attraverso 10, che sono i valori enum sottostanti che stai cercando.

Se il tuo foglio di lavoro, per ragioni di usabilità, deve consentire valori 1 attraverso 6, allora si può fare questo:

Dim themeColorIndex As MsoThemeColorIndex 
'msoThemeColorAccent1 underlying value is 5, so we add 4 to the value: 
themeColorIndex = selectedValue + 4 

Allora stai facendo un'altra pericoloso presupposto: si assume che ci sia un grafico attivo !Supponendo che esiste il grafico in Sheet1, si sarebbe molto meglio fare riferimento ad esso, ancora una volta, in modo esplicito:

Dim theChart As ChartObject 
Set theChart = Sheet1.ChartObjects(1) 
With theChart.SeriesCollection(srs) 'whatever srs means 
    With .Format 
     .Fill.ForeColor.ObjectThemeColor = themeColorIndex 
     .Fill.Solid 
     .Line.ForeColor.ObjectThemeColor = themeColorIndex 
    End With 
End With 
+3

vorrei poter dare +10 per andare sopra e oltre :) –

+3

@ScottHoltzman Penso che [codereview.se] abbia sempre colorato il modo in cui sto rispondendo su SE =) –

+0

Ho finito per andare con la soluzione di Scott ma la spiegazione di Mat mi ha aiutato per capire dentro e fuori. Grazie a tutti per l'aiuto fantastico !! –