VBA将msoThemeColor存储在变量中

时间:2016-06-30 18:29:50

标签: excel vba excel-vba charts

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

! executable statements
call MPI_Init(ierr)
call MPI_Comm_size(MPI_COMM_WORLD, size, ierr)
call MPI_Open_port(MPI_INFO_NULL, port_name, ierr)
print *, "Port name is: ", port_name

do while (.true.)
   call MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, newcomm, ierr)

   loop = 1
   do while (loop .eq. 1)
      call MPI_Recv(buf, 255, MPI_INTEGER, MPI_ANY_SOURCE, MPI_ANY_TAG, newcomm, status, ierr)
      print *, "Looping the loop."
      loop = 0
   enddo

   call MPI_Comm_disconnect(newcomm, ierr)
   call MPI_Comm_free(newcomm, ierr)
enddo

call MPI_Close_port(port_name, ierr)
call MPI_Finalize(ierr)

我认为这里的问题是我没有使用正确的Dim分类。我在这里看到了关于将RGB存储为变量的问题(使用Dim Long似乎是解决方案)但是msoThemeColors还没有。谢谢,如果我能提供任何其他细节,请告诉我!

2 个答案:

答案 0 :(得分:8)

很难说出发生了什么,因为您的代码在很大程度上依赖于默认成员。无论如何:

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 ,这是你正在寻找的底层枚举值

如果您的工作表出于可用性原因,必须允许值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

答案 1 :(得分: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