同一数据标签VBA中的两种不同颜色

时间:2013-06-13 11:49:30

标签: vba colors charts label

我有一张带有曲线的excel图表。曲线表示股票的价格取决于时间(所以基本上我有一个完整的日期列和B列的价格和图表)。

现在,对于图表中的每个点,都有一个数据标签文本,如下所示

Charts("CHART").SeriesCollection(1).Points(Numpoint).DataLabel.Text = numcomptagesetup & vbCrLf & numcomptagecountdown

“numpoint”是从第1点到最后一个的变量。 “numcomptagesetup”和“numcomptagecountdown”是“numcomptagesetup”从1到6的值,“numcomptagecountdown”从1到15的值。

上面的代码是写“numcomptagesetup”然后跳两行然后写“numcomptagecountdown”

根据2个信号,我需要的是将绿色或红色的“numcomptagesetup”颜色改为绿色和红色的“numcomptagecountdown”颜色。所以在某些情况下,我需要在同一个datalabeltext中有两种不同的颜色。

我已经写过这个循环并且至少在开始时(逐步方法)起作用然后一切都改变了,颜色不在好的位置(红色而不是绿色或相反)......真的很奇怪 默认情况下,所有点都是绿色,然后我在需要时将点的颜色更改为红色:

 For numpoint=1 to 100
With Charts("CHART").SeriesCollection(1).Points(Numpoint)
            .HasDataLabel = True
            .DataLabel.Text = numcomptagesetup & vbCrLf & numcomptagecountdown
            .DataLabel.Font.Size = 6
            .DataLabel.Font.Color = vbRed
            .MarkerSize = 5
End With
If Signal = 2 Then Charts("CHART").SeriesCollection(1).DataLabels.Select 
  With Charts("CHART").SeriesCollection(1).Points(Numpoint).DataLabel.Format.TextFrame2.TextRange.Characters(1, 3).Font.Fill 
    .Visible = msoTrue 
    .ForeColor
    .RGB = RGB(0, 176, 80) .Solid 
  End With 
End If

If Signal2 = 2 Then
    Charts("CHART").SeriesCollection(1).DataLabels.Select
    With Charts("CHART").SeriesCollection(1).Points(Numpoint).DataLabel.Format.TextFrame2.TextRange.Characters(4, 1).Font.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 176, 80)
        .Solid
    End With
End If

我希望你理解我的问题!如果不是,你可以问,我会尽快回答

谢谢!

2 个答案:

答案 0 :(得分:2)

我很难过。即便是宏录制器也会给我类似于你的代码,但是当我运行它时,颜色会应用于Series.DataLabels中的所有数据标签。

我有一个可能的解决方法,即将TextBox形状添加到图表中,并将它们直接放在数据标签的顶部。然后,删除最后的数据标签。

'## This is from your original code:
For numpoint=1 to 100
    With Charts("CHART").SeriesCollection(1).Points(Numpoint)
        .HasDataLabel = True
        .DataLabel.Text = numcomptagesetup & vbCrLf & numcomptagecountdown
        .DataLabel.Font.Size = 6
        .DataLabel.Font.Color = vbRed
        .MarkerSize = 5
    End With
Next

'## Now, I make some changes:
Dim srs As Series
Dim dl As DataLabel
Dim dlText As String

Set srs = Charts("CHART").SeriesCollection(1) '## I find it easier to work with objects, so I use variable "srs"

'## Delete any textboxes that might be leftover from previous.
For Each shp In cht.Shapes
    shp.Delete
Next

For Each dl In srs.DataLabels  '## object-oriented programming, use a DataLabel object variable :
    dlText = dl.Caption
    '## Add a textbox to overlay the datalabel
    Set tb = cht.Shapes.AddTextbox(msoTextOrientationHorizontal, dl.Left, dl.Top, dl.Width, dl.Height)
    With tb.TextFrame2
        .VerticalAnchor = msoAnchorMiddle
        .WordWrap = msoFalse
        .AutoSize = msoAutoSizeShapeToFitText
        With .TextRange
            .Text = dlText
            .Font.Size = dl.Format.TextFrame2.TextRange.Font.Size
            '## Apply character color format to the textbox:
            If Signal = 2 Then
                With .Characters(, 3).Font.Fill
                    .Visible = msoTrue
                    .ForeColor.RGB = RGB(0, 176, 80)
                    .Solid
                End With
            End If
            '## Apply character color format to the textbox:
            If Signal2 = 2 Then
                With .Characters(4, 1).Font.Fill
                    .Visible = msoTrue
                    .ForeColor.RGB = RGB(0, 176, 80)
                    .Solid
                End With
            End If
        End With
    End With
Next

'## Finally, turn off the datalabels that you don't need anymore.
srs.HasDataLabels = False

答案 1 :(得分:0)

我想出了别的东西:

 With ChartObj.Chart.SeriesCollection(1).DataLabels.Format.TextFrame2.TextRange.Characters.Font.fill                                    
         .TwoColorGradient msoGradientDiagonalUp, 1
         .GradientAngle = 45
         .GradientStops(1).Position = 0 '.2
         .GradientStops(2).Position = 1 '0.8
         .ForeColor.RGB = RGB(0, 0, 0)
         .BackColor.RGB = RGB(255, 255, 255)
 End With

给我一​​个数据标签的渐变颜色。