在Excel中的VBA,循环继续运行

时间:2014-02-25 23:15:47

标签: loops excel-vba reference vba excel

我在Excel中有一个图表,我试图让循环更改图表中一个条形的颜色,然后引用一个单元格作为导出的图像文件的名称。循环运行多次,最后我获得了50个图表,其中包含50个不同名称的突出显示栏。我的最终目标是更改黄色的50个条形之一的颜色,使用位于单元格D3中的名称导出该图表,然后将所有条形图更改回相同的颜色,移至下一个条形图块,更改它为黄色并导出图表,其名称位于单元格D4中。

50个最终图表名称位于D3:D53的范围内。以下是我的代码。非常感谢你的帮助。

Dim i As Integer,n As Integer

Dim part1 As String

For i = 1 To 50
For n = 3 To 52
part1 = Cells(n, 4)

ActiveChart.SeriesCollection(1).Select
ActiveChart.SeriesCollection(1).Points(i).Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.RGB = RGB(255, 255, 0)
    .Transparency = 0
    .Solid
End With

ActiveSheet.ChartObjects("Chart 1").Activate

ActiveChart.Export "ImageSaveLocation" & part1 & ".png"


ActiveChart.SeriesCollection(1).Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.RGB = RGB(0, 112, 192)
    .Transparency = 0
    .Solid
End With

        Next n
    Next i

End Sub

2 个答案:

答案 0 :(得分:1)

不确定为什么要嵌套For循环。

根据我的理解,您只是在ActiveChart中更改其中一个系列的颜色,使用D列中的名称导出,还原颜色,然后在图表中输出下一个系列。

下面的代码应该很好用(假设在ActiveSheet中的第一个图表上执行操作):

Sub ChartExport()
    ' Chart Names in D3:D53
    Const lTop = 3
    Dim i As Long, lColor As Long, part1 As String

    Application.ScreenUpdating = False
    With ActiveSheet.ChartObjects(1).Chart
        For i = 1 To .SeriesCollection.Count
            part1 = ActiveSheet.Cells(lTop + i - 1).Value
            Application.StatusBar = "Exporting Chart " & part1 & " (" & i & ")..."
            ' Store Original Color, Change, Export then Restore color
            lColor = .SeriesCollection(i).Format.Fill.ForeColor.RGB
            .SeriesCollection(i).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
            .Export "ImageSaveLocation" & part1 & ".png"
            .SeriesCollection(i).Format.Fill.ForeColor.RGB = lColor
        Next
    End With
    Application.StatusBar = False
    Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

我猜你的代码不是无限循环,只是超级慢。

在开头添加一些application.screenupdating = false(最后是= true),

避免使用.select / activate

dim i as long, n as long 'and not integer wich is slower , 

使用set

dim chartColl as Series 'or seriescollection ? (not sure, try)
set ChartColl= ActiveChart.SeriesCollection(1)

一起使用
with ChartColl.points(i).format.fill  'untested
    .visible= msoTrue
    '...
end with

小提醒:你将创建大约2500 * .png文件,因此你的硬盘速度将是重要的