Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 根据每月更改的轴标签更新图表上的条形图颜色_Excel_Vba - Fatal编程技术网

Excel 根据每月更改的轴标签更新图表上的条形图颜色

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

我的图表测量因子回报,将最高的回报因子放在图表顶部。由于订单可能会每月更改,我想根据因子顺序动态调整颜色

我想循环遍历每个条,将因子名称与if语句块中的RGB代码匹配,然后移动到下一条

发生的情况:代码从第一个条开始,正确地将该条与“因子名称颜色”匹配,并移动到下一个单元格,而不是移动到下一个系列

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

两种选择:

  • 为“c”循环中的每个序列生成一个if语句,这样一旦找到并更改了该序列,它就会检查下一个if语句
  • 使用“select case”代替循环中的“c”。比使用一堆if语句更简单

  • 您的代码正在移动到下一个单元格,因为一旦找到序列并更改了颜色,if语句将结束,循环将强制它移动到下一个c

    两种选择:

  • 为“c”循环中的每个序列生成一个if语句,这样一旦找到并更改了该序列,它就会检查下一个if语句
  • 使用“select case”代替循环中的“c”。比使用一堆if语句更简单

  • 我的错误是尝试使用嵌套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