动态数据范围变化时更改图表数据范围?

时间:2014-09-09 07:12:37

标签: excel excel-vba charts range excel-2010 vba

我在工作表中创建了一个动态名称范围,称为“grafiekrange”(荷兰语中的图表范围)。我创建了一个图表,在那里你选择图表数据范围,我键入: ='blad1'!grafiekrange因为blad1是名称范围所在的工作表名称。

我按下确定,图表连接到该特定时刻名称所指的单元格的范围。当名称范围的范围扩大时,图表的数据范围仍然相同。 因此,当我将图表连接到 name 范围时,excel以某种方式将名称范围转换为硬编码范围的单元格;例如$A$1:$H$10代替'blad1'!grafiekrange

我发现了一些vba代码,这是某种解决方法,但是这种解决方法会删除图表并在工作表中的每一次更改中创建一个新图表。

这是工作表的代码:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet
.ChartObjects.Delete
End With
Call CreateChart
End Sub

这是模块中的代码:

Option Explicit
'=========================================================================
Sub CreateChart()
   Dim objChart As ChartObject
   Dim myChtRange As Range
   Dim myDataRange As Range
   With ActiveSheet
    ' What range should chart cover

    Set myChtRange = Range("chtArea")   'Range("G2:Q30")
    ' What range contains data for chart


    Set myDataRange = Range("grafiekrange")


    ' Cover chart range with chart
    Set objChart = .ChartObjects.Add( _
        Left:=myChtRange.Left, Top:=myChtRange.Top, _
        Width:=myChtRange.Width, Height:=myChtRange.Height)
    ' Put all the right stuff in the chart
    With objChart.Chart
      .ChartArea.AutoScaleFont = False
      .ChartType = xlLine
      .SetSourceData Source:=myDataRange, PlotBy:=xlRows
           .HasTitle = True
           .ChartTitle.Characters.Text = "YTD Afzetontwikkeling (cumulatief) bij AS Watson (KV+TP)"
      .ChartTitle.Font.Bold = True
      .ChartTitle.Font.Size = 12
      With .Axes(xlValue, xlPrimary)
        .HasTitle = False
      End With
    End With
   End With
  End Sub
  '=========================================================================

在每一次改变上创建一个新的图表并不是我想要的,但如果它做了我想要的,它就像这样工作并不重要。 但是,我想有2个系列具有某些格式。前两个系列应该有一个虚线。 我使用宏录制器来查看它是如何工作的,并尝试在上面的代码中实现它。但是我没有成功获得有效的代码。

这是宏录制器返回的代码:

Sub Macro3()
'
' Macro3 Macro
'

'
ActiveSheet.ChartObjects("Grafiek 29").Activate
ActiveChart.Axes(xlValue).MajorGridlines.Select
ActiveChart.SeriesCollection(1).Select
With Selection.Format.Line
  .Visible = msoTrue
  .DashStyle = msoLineDash
End With
End Sub

我的问题是: 你可以帮助我在上面的代码中实现系列格式,或者为我提供一个代码,只需更新每一次更改的数据范围(对我来说,听起来更有效但我不知道如何这样做)。 非常感谢提前。

我自己尝试了一些东西,但这不是图表数据,不知何故,现在返回错误,我第一次没有:

Option Explicit

Private Sub Worksheet_Change(ByVal myrange As Range)

Set myrange = grafiekrange

  With ActiveSheet.ChartObjects("Grafiek 35")

    ActiveChart.SetSourceData Source:="myrange" 

  End With

End Sub

2 个答案:

答案 0 :(得分:0)

我无法相信,插入表会杀死公式,但无论如何。

如果='blad1'!grafiekrange获取正确的图表数据,则将以下宏放入模块中:

Sub setSelectedChartSourceData()
 Dim oChart As Chart

 On Error Resume Next 'If Selection is not the CharArea, then next line throws error.

 Set oChart = Selection.Parent
 oChart.SetSourceData Source:=Range("blad1!grafiekrange")

 On Error GoTo 0 'Set Error handling to default.

End Sub

您可以为宏指定键盘快捷键。 [Ctrl] + [Shift] + [D]表示例如

现在,如果图表数据和命名范围数据已更改,请选择图表并按[Ctrl] + [Shift] + [D]或以其他方式运行宏setSelectedChartSourceData。

问候

阿克塞尔

答案 1 :(得分:0)

我不知道我改变了什么,但我有一个工作方法。 我在一个模块中添加了这段代码:

Option Explicit
'=========================================================================
Sub CreateChart()
Dim objChart As ChartObject
Dim myChtRange As range
Dim myDataRange As range
With ActiveSheet
' What range should chart cover

    Set myChtRange = range("chtArea")   'Range("G2:Q30")
' What range contains data for chart


Set myDataRange = range("grafiekrange")


' Cover chart range with chart
Set objChart = .ChartObjects.Add( _
    Left:=myChtRange.Left, Top:=myChtRange.Top, _
    Width:=myChtRange.Width, Height:=myChtRange.Height)
' Put all the right stuff in the chart
With objChart.Chart
    .ChartArea.AutoScaleFont = False
    .ChartType = xlLine
   .SetSourceData Source:=myDataRange, PlotBy:=xlRows
           .HasTitle = True
           .ChartTitle.Characters.Text = "YTD Afzetontwikkeling (cumulatief) bij AS Watson (KV+TP)"
    .ChartTitle.Font.Bold = True
    .ChartTitle.Font.Size = 12
    With .Axes(xlValue, xlPrimary)
        .HasTitle = False
    End With
End With
End With
End Sub
'==========

然后在工作表中我有这个子:

Option Explicit
Private Sub Worksheet_Change(ByVal myrange As range)
Dim grafiekrange As range

Set myrange = grafiekrange

With ActiveSheet.ChartObjects("Grafiek 3").Activate

ActiveChart.SetSourceData Source:=range("grafiekrange")

End With

End Sub

在工作表中,我有几个命名范围,现在使用grafiekrange。这个命名范围有这个公式:

=VERSCHUIVING(Blad4!$A$1;0;0;AANTALARG(Blad4!$A:$A)+1;AANTAL.ALS(Blad4!$1:$1;"YTD*")+1)

其中:

VERSCHUIVING = OFFSET()

AANTAL.ALS = COUNTIF

AANTALARG = COUNTA

现在它有效。

现在我只需要找到一个解决方案,以便在每次更改时定位图表(已包含在上面的代码中)