在VBA中使用命名范围制作图表

我正在尝试编写一些代码,这些代码将在我的Excel工作簿中已经build立的命名范围内工作。 工作簿中的每张表格都有不同的布局,这使得编写名称的代码成为大部分工作的一部分。 我已经这样做了,现在想编写代码,循环遍历每张表中的名称,并使用我已经build立的命名范围制作图表。 我遇到了以下代码中的一堆错误,并希望得到一些帮助修复它们,使代码更有效率!

ChartName = ActiveSheet.Range(n).Offset(0, -6) & " " & ActiveSheet.Range(n).Offset(0, -5)

我在上面的错误中得到了一个types不匹配,我只是无法弄清楚如何处理。 此外, ActiveSheet.ChartObjects.Add绘制一个无效的属性分配!

 Sub WEO_DevCharts() Sheets("WEO").Activate Dim objChart As ChartObject Dim n As Name Dim ChartName As String For Each n In ActiveSheet.Names If n.Name <> "DateRange" Then ChartName = ActiveSheet.Range(n).Offset(0, -6) & " " & ActiveSheet.Range(n).Offset(0, -5) Set objChart = ActiveSheet.ChartObjects.Add With objChart.Chart .chartType = xlXYScatterLines .SeriesCollection.Values = n.Value .SeriesCollection.XValues = ActiveSheet.Range("DateRange").Value .SeriesCollection.Name = ChartName .legend.Delete End With End If Next n End Sub 

下面我做了一些修改

(更新来处理表单中的两个单独范围,一个名为DateRange的范围和一个名为Test范围。两个范围对于表单来说都是本地的,以满足ActiveSheettesting,否则它们将属于ActiveWorkbook {但是DateRange可以是全局的或本地的,仍然graphics罚款任何方式})

  1. 而不是ActiveSheet.Range(n).Offset(0, -6)您需要一个单元格,可能是第一个在n范围,即Range(n).Cells(1).Offset(0, -6) (加这意味着您的标题位于范围名称左侧的6列 – 确保有空间)
  2. 尝试添加图表像ActiveSheet.ChartObjects.Add(Left:=500, Width:=300, Top:=50, Height:=400)
  3. 一旦你设置了xytypes,你可以直接将源范围设置为你的范围名称n然后将DateRange范围添加为x系列
  4. 将您的系列名称添加到第一个系列,即.SeriesCollection(1).Name = ChartName not .SeriesCollection.Name = ChartName
  5. 我已经使用InStr(n.Name, "DateRange") = 0而不是你的n.Name <> "DateRange"以避免处理任何本地名称版本的DateRange,即WEO!DateRange

我build议你看看Jon Peltier的优秀网站,以获取更详细的代码示例

我的testing代码的本地工作表名称的示例屏幕截图

  • H10:H13 Test H10:H13
  • DateRangeD14:D17

在这里输入图像说明

  Sub WEO_DevCharts() Sheets("WEO").Activate Dim objChart As ChartObject Dim n As Name Dim ChartName As String For Each n In ActiveSheet.Names If InStr(n.Name, "DateRange") = 0 Then ChartName = Range(n).Cells(1).Offset(0, -6) & " " & Range(n).Cells(1).Offset(0, -5) Set objChart = ActiveSheet.ChartObjects.Add(Left:=500, Width:=300, Top:=50, Height:=400) With objChart.Chart .ChartType = xlXYScatterLines .SetSourceData Range(n) .SeriesCollection(1).XValues = Range("DateRange") .SeriesCollection(1).Name = ChartName .Legend.Delete End With End If Next n End Sub 

而不是ActiveSheet.Range(n)n.Value ,使用n.RefersToRange来获取名称引用的范围