将图表中的列颜色链接到工作表中的范围

时间:2017-08-31 07:17:50

标签: excel vba excel-vba charts

我在柱形图的数据区域旁边有一个范围。我必须将图表的每个列的颜色与此范围相关联。例如。如果有" X"在表格中,因此与此行相关的图表列将为红色,否则为绿色。

我在下面写过类似的内容,但它不起作用。另一方面,VBA不会丢弃此代码:)

数据列从E2开始,图表的列是Point(1),...(2)等。

Sub Chart_Color()

Worksheets("Sheet1").ChartObjects("Chart 1").Activate 'sheet's name
ActiveChart.FullSeriesCollection(1).Select

LineNum = Worksheets("Sheet1").Rows.Count
For i = 1 To LineNum
i = i + 1
If Worksheets("Sheet1").Range("E:E").Cells(i + 1).Value = "X" Then
ActiveChart.FullSeriesCollection(1).Points(i).Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.RGB = RGB(255, 0, 0)
    .Transparency = 0
    .Solid
End With
Else
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.RGB = RGB(0, 255, 0)
    .Transparency = 0
    .Solid
End With
End If
Next i
End Sub

3 个答案:

答案 0 :(得分:0)

现在有效:)

Sub chart_color()

Application.ScreenUpdating = False

Dim Cell As Range
Dim i As Byte

For i = 0 To 100
For Each Cell In Worksheets("Sheet1").Range("E1").Offset(i, 0)

If Cell.Value = "X" Then
Worksheets("Ma").ChartObjects("Chart 1").Activate
ActiveChart.FullSeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
End If
If Cell.Value = "Y" Then
Worksheets("Ma").ChartObjects("Chart 1").Activate
ActiveChart.FullSeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
End If
If Cell.Value = "Z" Then
Worksheets("Ma").ChartObjects("Chart 1").Activate
ActiveChart.FullSeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
End If

Next Cell
Next i

End Sub

答案 1 :(得分:0)

假设您的上述代码有效,我无法测试(部分原因是因为我没有Office 365),下面的代码应该更有效。

Dim ColorId As Long
Dim LastRow As Long
Dim R As Long                           ' row number
Dim i As Long


Application.ScreenUpdating = False
With Worksheets("Sheet1")
    LastRow = .Cells(.Rows.Count, "E").End(xlUp).Row
    For R = 2 To LastRow                ' start in row 2
        ColorId = InStr(1, "XYZ", Trim(.Cells(R, "E").Value), vbTextCompare)
        If ColorId Then
            ColorId = Array(vbRed, vbGreen, vbBlue)(ColorId - 1)
            With Worksheets("Ma").ChartObjects("Chart 1").FullSeriesCollection(R - 1)
                For i = 1 To .Points.Count
                    .Points(i).Format.Fill.ForeColor = ColorId
                Next i
            End With
        End If
    Next R
End With

如果它不起作用,您可能希望从中提起循环结构。您的循环包含数千个不需要的单元格。我敦促你考虑的另一件事是我试图不激活或选择任何东西。我知道这是可能的,我知道这样做更好,但我可能还没有找到正确的语法来解决FullSeriesCollection问题。这是我从你自己的代码中借用和转录的。

如果vbRed,vbGreen和vbBlue不适合您,则以下代码可以替换这些值。将它放在上面代码的顶部,就在Dim R As Long下面,除了最后一行必须替换过程中间的类似代码行。

Dim myRed As Long, myGreen As Long, myBlue As Long

myRed = RGB(0, 0, 255)
myGreen = RGB(255, 255, 0)
myBlue = RGB(0, 255, 0)
Set ColorId = Array(myRed, myGreen, myBlue)(ColorId - 1)

答案 2 :(得分:0)

我们现在正在查看我的代码的这一部分,您发现它无法正常工作(抱歉,我无法测试)。

ColorId = vbRed            ' ColorId is a Long
i = 1
Worksheets("Ma").ChartObjects("Chart 1").FullSeriesCollection(1) _
                            .Points(i).Format.Fill.ForeColor = ColorId

这应该等同于你说它确实有用的代码。

i = 1
Worksheets("Ma").ChartObjects("Chart 1").Activate
ActiveChart.FullSeriesCollection(1).Points(i).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)

让我们暂时忘记i的价值。我赋给它的值是任意的。

我在形状对象上测试了.Fill.ForeColor = ColorId.Fill.ForeColor.RGB = ColorId,但它们都有效。因此,应该可以用两行代码简单地替换我的1 1/2行代码并替换`RGB(255,255,0)'使用' ColorId'。您可能还必须激活(选择)工作表(" Ma")才能激活其中的图表。

我研究了SeriesCollection和Points方法,因此将修改我的上述代码以改进两者的引用,这可能会打开新的错误源。你确定你需要格式化积分吗?我的直觉是尝试设置这样的颜色: -

Worksheets("Ma").ChartObjects(1).Chart.SeriesCollection(1) _
                .Interior.Color = ColorId

仅在进行过滤时才将SeriesCollection替换为FullSeriesCollection