我希望将 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 上还没有任何问题。谢谢,如果我可以提供任何其他详细信息,请告诉我!
最佳答案
很难判断发生了什么,因为您的代码严重依赖默认成员。无论如何:
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
如果您只对 msoThemeColorAccent1
到 msoThemeColorAccent6
感兴趣,那么您需要 B12
包含值 5
code> 到 10
,它们是您要查找的底层枚举值。
如果出于可用性原因,您的工作表必须允许值 1
到 6
,那么您可以执行以下操作:
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
关于VBA 将 msoThemeColor 存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130741/