【问题标题】:VBA store msoThemeColor in variableVBA将msoThemeColor存储在变量中
【发布时间】:2016-06-30 18:29:49
【问题描述】:

我希望将 mso 主题颜色存储在一个变量中,以便图表颜色和模式可以动态变化(在这种情况下为变量 Th)。这是我当前的代码:

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 上还没有。谢谢,如果我可以提供任何其他详细信息,请告诉我!

【问题讨论】:

  • “我认为这里的问题是......”您的代码是否有错误?或者它只是没有像你期望的那样工作?如果出现错误,在哪一行出现什么错误?
  • 对不起 - 基本上变量 Th 没有被识别。没有错误信息。它没有选择正确的 msothemecolor
  • 删除as Long,看看如果它默认为Variant会发生什么(或者,试试String)。另外,确保偏移单元格在 1 到 6 之间。
  • 您将String 分配给声明为@ 的变量(Th ...认真考虑给它一个有意义的名称...像素是免费的,而令人头疼的开发人员不是) 987654327@。这注定会失败。如果您想将其用作字符串,请将其声明为 As StringLong 是 32 位整数类型。
  • 除了@Mat'sMug 的建议之外,我还认为msoThemeColorAccent*n* 实际上只是一个枚举而不是实际的字符串。您可能希望找到枚举并根据单元格值分配Long 枚举值。

标签: vba excel charts


【解决方案1】:

很难判断发生了什么,因为您的代码严重依赖默认成员。无论如何:

Dim Th As Long

这是正确的。

Dim themeColorIndex As MsoThemeColorIndex

这是正确的明确的(请参阅 MSDN 上的 MsoThemeColorIndex)。

作为Scott Holtzman said,这里可能的值是Enum 值,而不是字符串:您根本无法通过将字符串连接到定义的Enum 名称之一来生成正确的值。

所以通过这样做:

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

我的猜测是ActiveCell.Offset(-5, 0) 必须包含一个介于 1 和 6 之间的数字。这是一个危险的假设:ActiveCell 可以是字面上的任何东西。如果该值在特定单元格中,请通过其地址引用它:

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

如果您只对msoThemeColorAccent1msoThemeColorAccent6 感兴趣,那么您会希望B12 包含值510,它们是基础枚举值您正在寻找的。​​p>

如果您的工作表出于可用性原因必须允许值 16,那么您可以这样做:

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

【讨论】:

  • 希望我可以给 +10 以超越 :)
  • @ScottHoltzman 我认为Code Review 永远改变了我在 SE 上回答的方式 =)
  • 我最终选择了 Scott 的解决方案,但 Mat 的解释帮助我理解了进出。感谢大家的真棒帮助!
  • @JKo_FinanceUse 如果您现在有工作代码,我建议您将其放在Code Review 上,以使其防故障且更易于维护。干杯!
【解决方案2】:

由于 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

【讨论】:

  • 我最终选择了 Scott 的解决方案,但 Mat 的解释帮助我理解了进出。感谢大家的真棒帮助!
  • @JKo_FinanceUse - 我很高兴你得到你的答案。不过,我建议彻底研究 Mat 的答案。那里有很多很棒的编码实践。
猜你喜欢
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2020-02-10
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多