在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
范围。两个范围对于表单来说都是本地的,以满足ActiveSheet
testing,否则它们将属于ActiveWorkbook
{但是DateRange
可以是全局的或本地的,仍然graphics罚款任何方式})
- 而不是
ActiveSheet.Range(n).Offset(0, -6)
您需要一个单元格,可能是第一个在n
范围,即Range(n).Cells(1).Offset(0, -6)
(加这意味着您的标题位于范围名称左侧的6列 – 确保有空间) - 尝试添加图表像
ActiveSheet.ChartObjects.Add(Left:=500, Width:=300, Top:=50, Height:=400)
- 一旦你设置了xytypes,你可以直接将源范围设置为你的范围名称
n
然后将DateRange
范围添加为x系列 - 将您的系列名称添加到第一个系列,即
.SeriesCollection(1).Name = ChartName
not.SeriesCollection.Name = ChartName
- 我已经使用
InStr(n.Name, "DateRange") = 0
而不是你的n.Name <> "DateRange"
以避免处理任何本地名称版本的DateRange,即WEO!DateRange
我build议你看看Jon Peltier的优秀网站,以获取更详细的代码示例
我的testing代码的本地工作表名称的示例屏幕截图
- 在
H10:H13
Test
H10:H13
-
DateRange
在D14: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
来获取名称引用的范围