我在柱形图的数据区域旁边有一个范围。我必须将图表的每个列的颜色与此范围相关联。例如。如果有" 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
答案 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
。