2016-06-30 33 views
5

グラフの色とパターンが動的に変更できるように(この状況では変数Th)、msoテーマの色を変数に格納することを検討しています。ここに私の現在のコードは次のとおりです:変数のVBAストアのmsoThemeColor

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 

私は正しいDimの分類を使用していないと思っています。私は変数としてRGBを格納することについて質問しましたが(Dim Longを使用して解決策と思われました)、まだmsoThemeColorsには何もありません。ありがとう、私は他の詳細を提供できるかどうか私に知らせてください!

+0

「私がここで問題にされると思っています...」あなたのコードでエラーを取得していますか?それとも、あなたが期待しているように働いていないのですか?エラーの場合、どの行でどのようなエラー? – BruceWayne

+0

申し訳ありません - 基本的に変数Thは認識されていません。エラーメッセージは表示されません。それは右のmsothemecolorをピックアップしていません –

+0

'' Long'を削除し、デフォルトで 'Variant'(あるいは' String'を試してください)がどうなるかを見てください。また、オフセットセルが1から6の間であることを確認してください。 – BruceWayne

答えて

5

msoThemeColorAccentは列挙型なので、以下のリファクタリングされたコードが機能します。

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

私はスコットの解決策について終わりましたが、マットの説明は私が理解するのを助けました。すごく助けてくれてありがとう! –

+0

@JKo_FinanceUse - あなたの答えが得られてうれしいです。私はマットの答えを徹底的に勉強することを提案します。そこには数多くの素晴らしいコーディング実践があります。 –

8

それはあなたのコードがデフォルトメンバーに大きく依存しているので、何が起こっているのか伝えるのは難しいです。とにかく:

Dim Th As Long 

これは正しいです。

Dim themeColorIndex As MsoThemeColorIndex 

これは正しいと明示的な(MSDN上MsoThemeColorIndexを参照)です。

Scott Holtzman saidと指定できる値は、Enumのいずれかの文字列を連結して正しい値を生成することはできません。文字列ではなく、Enumの値を使用できます。 ActiveCellは文字通り次のようになります。私の推測ではActiveCell.Offset(-5, 0)を作るために危険な仮定だ1と6の間の数を含まなければならないということです

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

:これを行うことによってそのよう

。その値は、特定のセル内にある場合は、そのアドレスによってそれを参照してください。

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

これは少し良いですが、それはまだB12の値が暗黙のうちに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 

あなたはmsoThemeColorAccent6msoThemeColorAccent1で唯一興味があるなら、あなたはB12根本的な列挙値、あなたが探しているである値105を、含まれているしたいと思います。

ワークシートの場合、ユーザビリティ上の理由から、値が61、その後、あなたがこれを行うことができます許可する必要があります。

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

次にあなたが危険な仮定を作っている:あなたは、アクティブなチャートがありますことを前提としてい!チャートはSheet1に存在し、あなたがより良い、それを参照してくださいしたいと仮定すると、再び、明示的に:

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

私は上に行くために+10を与えることを望みます:) –

+3

@ScottHoltzman私は[codereview.se]が私がSE =に答える方法を永遠に色づけしていると思う) –

+0

私はScottの解決策に行き着いたが、Matの説明は私を助けた内外を理解する。すごく助けてくれてありがとう! –