Excel 根据每月更改的轴标签更新图表上的条形图颜色
我的图表测量因子回报,将最高的回报因子放在图表顶部。由于订单可能会每月更改,我想根据因子顺序动态调整颜色 我想循环遍历每个条,将因子名称与if语句块中的RGB代码匹配,然后移动到下一条 发生的情况:代码从第一个条开始,正确地将该条与“因子名称颜色”匹配,并移动到下一个单元格,而不是移动到下一个系列Excel 根据每月更改的轴标签更新图表上的条形图颜色,excel,vba,Excel,Vba,我的图表测量因子回报,将最高的回报因子放在图表顶部。由于订单可能会每月更改,我想根据因子顺序动态调整颜色 我想循环遍历每个条,将因子名称与if语句块中的RGB代码匹配,然后移动到下一条 发生的情况:代码从第一个条开始,正确地将该条与“因子名称颜色”匹配,并移动到下一个单元格,而不是移动到下一个系列 Sub update_factor_barcharts() Dim cht As Chart Dim i As Long Dim c As Range Dim rng
Sub update_factor_barcharts()
Dim cht As Chart
Dim i As Long
Dim c As Range
Dim rng As Range
Set cht = ActiveSheet.ChartObjects("Chart 7").Chart
Set rng = ActiveSheet.Range("Q26:Q31")
For i = 1 To cht.SeriesCollection.Count
For Each c In rng.Cells
If c = "Size" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS19").Value, Range("AT19").Value, Range("AU19").Value)
ElseIf c = "Value" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS20").Value, Range("AT20").Value, Range("AU20").Value)
ElseIf c = "Mom." Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS21").Value, Range("AT21").Value, Range("AU21").Value)
ElseIf c = "Low Vol." Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS22").Value, Range("AT22").Value, Range("AU22").Value)
ElseIf c = "Quality" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS23").Value, Range("AT23").Value, Range("AU23").Value)
ElseIf c = "Div. Yield" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS24").Value, Range("AT24").Value, Range("AU24").Value)
End If
Next c
Next i
End Sub
您的代码将移动到下一个单元格,因为一旦找到序列并更改颜色,if语句将结束,循环将强制它移动到下一个c 两种选择:
您的代码正在移动到下一个单元格,因为一旦找到序列并更改了颜色,if语句将结束,循环将强制它移动到下一个c 两种选择:
我的错误是尝试使用嵌套for循环,这是不必要的。也许有一种更有效的方法可以做到这一点,但下面的解决方案是删除外部for循环,这对我很有效
Sub update_factor_barcharts()
'
' The order of factor returns can change each month
'This macro automatically updates the charts to adjust for the changing order
Dim cht As Chart
Dim i As Long
Dim c As Range
Dim rng As Range
Set cht = ActiveSheet.ChartObjects("Chart 7").Chart
Set rng = ActiveSheet.Range("Q26:Q31")
i = 1
For Each c In rng.Cells
If c = "Size" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS19").Value, Range("AT19").Value, Range("AU19").Value)
i = i + 1
ElseIf c = "Value" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS20").Value, Range("AT20").Value, Range("AU20").Value)
i = i + 1
ElseIf c = "Mom." Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS21").Value, Range("AT21").Value, Range("AU21").Value)
i = i + 1
ElseIf c = "Low Vol." Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS22").Value, Range("AT22").Value, Range("AU22").Value)
i = i + 1
ElseIf c = "Quality" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS23").Value, Range("AT23").Value, Range("AU23").Value)
i = i + 1
ElseIf c = "Div. Yield" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS24").Value, Range("AT24").Value, Range("AU24").Value)
i = i + 1
End If
Next c
End Sub
我的错误是尝试使用嵌套for循环,这是不必要的。也许有一种更有效的方法可以做到这一点,但下面的解决方案是删除外部for循环,这对我很有效
Sub update_factor_barcharts()
'
' The order of factor returns can change each month
'This macro automatically updates the charts to adjust for the changing order
Dim cht As Chart
Dim i As Long
Dim c As Range
Dim rng As Range
Set cht = ActiveSheet.ChartObjects("Chart 7").Chart
Set rng = ActiveSheet.Range("Q26:Q31")
i = 1
For Each c In rng.Cells
If c = "Size" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS19").Value, Range("AT19").Value, Range("AU19").Value)
i = i + 1
ElseIf c = "Value" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS20").Value, Range("AT20").Value, Range("AU20").Value)
i = i + 1
ElseIf c = "Mom." Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS21").Value, Range("AT21").Value, Range("AU21").Value)
i = i + 1
ElseIf c = "Low Vol." Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS22").Value, Range("AT22").Value, Range("AU22").Value)
i = i + 1
ElseIf c = "Quality" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS23").Value, Range("AT23").Value, Range("AU23").Value)
i = i + 1
ElseIf c = "Div. Yield" Then
cht.SeriesCollection(1).Points(i).Interior.Color = RGB(Range("AS24").Value, Range("AT24").Value, Range("AU24").Value)
i = i + 1
End If
Next c
End Sub
另一个建议是:不要依赖VBA的默认设置。如果c=或
选择案例c
,请使用如果c.Value=
或选择案例c.Value
。另一个建议:不要依赖VBA的默认值。如果c=或选择案例c
,则使用而不是如果c.Value=
或选择案例c.Value
。