我希望将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还没有。谢谢,如果我能提供任何其他细节,请告诉我!
答案 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
如果您只对msoThemeColorAccent1
到msoThemeColorAccent6
感兴趣,那么您希望B12
包含值5
到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
答案 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