【问题标题】:Excel VBA: Chart-making macro that will loop through unique name groups and create corresponding charts?Excel VBA:将遍历唯一名称组并创建相应图表的图表制作宏?
【发布时间】:2012-09-23 00:47:54
【问题描述】:

好吧,我一直在绞尽脑汁,为傻瓜阅读 excel 编程,并四处寻找,但我正在为我在这里遇到的这个小问题感到压力。我对 vba 编程或任何编程语言都是全新的,但我正在尽力掌握它。

情景和我的目标是什么:

下图是我从不同流媒体站获得的一长串数据的示例。该样本仅包含两个(niobrara 和蛇)来说明我的问题,但实际上我有超过 80 个站的数据,每个站的压力期数量都不同(B 栏)。

COLUMN A,是站名列。 B栏,压力期数 C 列,模拟率 D 列,估计费率

我一直想弄清楚的是如何制作一个循环遍历站名(A 列)的宏,并为每个唯一的站名组制作一个图表,该图表将在组的右侧弹出,比如说在 E 列区域。

图表非常简单,只需要两个系列的散点图/折线图;一个以 COLUMN B 作为 x 值,以 COLUMN C 作为 y 值的系列;其他系列需要 COLUMN B 作为 x 值,COLUMN D 作为 y 值。

现在我的主要考验是我不知道如何让宏区分车站名称,使用与该名称相关的所有数据制作图表,然后循环到下一个车站组并创建图表与此相对应,并继续遍历 COLUMN A 中的所有 80 多个电台名称,并在其右侧制作相应的 80 多个图表,例如 COLUMN E。

如果我有足够的积分来“赏金”这个,我会心跳加速。但既然我没有,那么谁能解决我的困境,我真诚地感谢帮助我理解这个问题顺利运行,并希望将来能更好地理解这样的场景。如果我需要澄清更多信息以使我的问题更易于理解,请评论您的查询,我很乐意更详细地解释该主题。

干杯。

哦,还有额外的功劳;现在我考虑了一下,我在 COLUMN B 中手动输入了数字。由于循环需要使用该列作为 x 值,因此如果它可以循环自身并在生成之前自行填充该列,这将是很重要的图表(我想它与“计算与站名对应的行”这样简单的事情有关。但同样,我不知道与站名相对应的正确术语,因此我是泡菜m in; 但是,如果足够精明地回答这个问题的资深程序员可以,我想这样一段代码会足够简单,但对于我寻求的这样一个宏的成功至关重要。

【问题讨论】:

    标签: loops excel charts vba


    【解决方案1】:

    试试这个

    Sub MakeCharts()
        Dim sh As Worksheet
        Dim rAllData As Range
        Dim rChartData As Range
        Dim cl As Range
        Dim rwStart As Long, rwCnt As Long
        Dim chrt As Chart
    
        Set sh = ActiveSheet
    
        With sh
            ' Get reference to all data
            Set rAllData = .Range(.[A1], .[A1].End(xlDown)).Resize(, 4)
            ' Get reference to first cell in data range
            rwStart = 1
            Set cl = rAllData.Cells(rwStart, 1)
            Do While cl <> ""
                ' cl points to first cell in a station data set
                ' Count rows in current data set
                rwCnt = Application.WorksheetFunction. _
                   CountIfs(rAllData.Columns(1), cl.Value)
                ' Get reference to current data set range
                Set rChartData = rAllData.Cells(rwStart, 1).Resize(rwCnt, 4)
                With rChartData
                    ' Auto fill sequence number
                    .Cells(1, 2) = 1
                    .Cells(2, 2) = 2
                    .Cells(1, 2).Resize(2, 1).AutoFill _
                       Destination:=.Columns(2), Type:=xlFillSeries
                End With
                ' Create Chart next to data set
                Set chrt = .Shapes.AddChart(xlXYScatterLines, _
                   rChartData.Width, .Range(.[A1], cl).Height).Chart
                With chrt
                    .SetSourceData Source:=rChartData.Offset(0, 1).Resize(, 3)
                    ' --> Set any chart properties here
    
                    ' Add Title
                    .SetElement msoElementChartTitleCenteredOverlay
                    .ChartTitle.Caption = cl.Value
    
                    ' Adjust plot size to allow for title
                    .PlotArea.Height = .PlotArea.Height - .ChartTitle.Height
                    .PlotArea.Top = .PlotArea.Top + .ChartTitle.Height
    
                    ' Name series'
                    .SeriesCollection(1).Name = "=""Modeled"""
                    .SeriesCollection(2).Name = "=""Estimated"""
    
                    ' turn off markers
                    .SeriesCollection(1).MarkerStyle = -4142 
                    .SeriesCollection(2).MarkerStyle = -4142 
    
                End With
    
                ' Get next data set
                rwStart = rwStart + rwCnt
                Set cl = rAllData.Cells(rwStart, 1)
            Loop
    
        End With
    
    End Sub
    

    【讨论】:

    • Chris- 这非常有用,它与样本配合得很好。我创建了一个宏,其中数据表提取了创建另一个表所需的所有信息,就像您基于上面的代码的表一样,但有一点小问题。
    • 第 50 个站名出现错误(这种情况不时发生,并被列为 #N/A)。您的代码在此之前为每个站点制作了漂亮的图表,停止了,(运行时错误:类型不匹配)出现在您的代码中 {Do While cl ""} 我怎样才能让它跳过列为 #N/ 的任何行A 并移动到下一站?谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多