Excel更新图宏的数据范围

时间:2014-06-03 09:24:45

标签: excel vba

基本上我有一个包含大量数据的大型电子表格,现在每个月末我都会制作一个包含去年所有数据的图形。

例如:这是5月底,所以我的旧图表显示了从2013年4月30日到2014年3月30日的所有数据。在运行宏之后,它将包含从2013年5月5日至2014年5月5日的数据。

我使用数据的日期,可用性和10d MAV列以及标签的列标题

graph data

现在我正在寻找一个宏,它基本上会在每次运行宏时更新数据范围,以匹配帖子第一部分中的示例。
或者可以简化我工作的东西,因为我有大约36个图表,我必须每个月手动更新,通常需要很长时间才能让所有这些更新,当然如果我不得不让其他人用更少的excel知识来更新它,如果有一种更简单的方法来实现这一点,那么手动更新所有内容将会非常有用。

2 个答案:

答案 0 :(得分:1)

下面的VBA将为您完成任务。有三个独立的潜艇:

  • removeSeries清除现有图表
  • populateChart将一系列添加到图表
  • test显示上述两个函数的工作方式(假设日期在A列中,而B列和C列中的值)

sub populateChart需要许多可能需要解释的参数:

  • StartDate:格式为#MM / DD / YYYY#
  • EndDate:格式为#MM / DD / YYYY#
  • DateRange:工作表上放置日期数组的范围
  • ValueRange:工作表上放置值数组的范围
  • 图表:图表对象
  • series_index:如果您要添加多个系列,请使用1作为第一个,2个作为第二个,等等。

Sub removeSeries(Chart As Chart)
    For Each s In Chart.SeriesCollection
        s.Delete
    Next s
End Sub

Sub populateChart(StartDate As Date, EndDate As Date, DateRange As Range, ValueRange As Range, Chart As Chart, series_index As Integer)

    Dim first_row As Integer
    Dim last_row As Integer
    Dim ws_name As String

    'find first row
    For Each c In DateRange.Rows
        If DateValue(c.Value) >= StartDate Then
            first_row = c.Row
            Exit For
        End If
    Next c

    'find last row
    For Each c In DateRange.Rows
        If DateValue(c.Value) = EndDate Then
            last_row = c.Row
            Exit For
        ElseIf DateValue(c.Value) > EndDate Then
            last_row = c.Row - 1
            Exit For
        End If
    Next c

    'get name of worksheet
    ws_name = Chart.Parent.Parent.Name

    'add series and axis labels to chart
    Chart.SeriesCollection.NewSeries
    Chart.SeriesCollection(series_index).Values = "=" & ws_name & "!" & ValueRange.Rows(first_row & ":" & last_row).Address
    Chart.SeriesCollection(series_index).XValues = "=" & ws_name & "!" & DateRange.Rows(first_row & ":" & last_row).Address

End Sub

Sub test()
    removeSeries ActiveSheet.ChartObjects("Chart 1").Chart

    populateChart #4/1/2014#, #4/30/2014#, ActiveSheet.Range("A2:A" & ActiveSheet.Range("A1").End(xlDown).Row), _
    ActiveSheet.Range("B2:B" & ActiveSheet.Range("B1").End(xlDown).Row), ActiveSheet.ChartObjects("Chart 1").Chart, 1

    populateChart #4/1/2014#, #4/30/2014#, ActiveSheet.Range("A2:A" & ActiveSheet.Range("A1").End(xlDown).Row), _
    ActiveSheet.Range("C2:C" & ActiveSheet.Range("C1").End(xlDown).Row), ActiveSheet.ChartObjects("Chart 1").Chart, 2

End Sub

答案 1 :(得分:0)

我认为您可以尝试对数据应用过滤器,而不是使用宏。根据我的经验,当您更改过滤器中的选择时,Excel非常适合自动更新图表中使用的数据。因此,例如,当从5月移动到6月时,您将从“日期”列中取消选择“月”,然后选择“6月”(如果日期格式正确,Excel应该为您提供年份的分层列表,然后是月份。)