我正在尝试编写一些代码,这些代码将通过我在Excel工作簿中已经建立的命名区域来工作。工作簿中的每个工作表都有不同的布局,这使得编写代码的代码成为工作的最大份额。我已经这样做了,现在想编写代码,循环遍历每个工作表中的名称,并使用我已经建立的命名范围制作图表。我在以下代码中遇到了一堆错误,并希望得到一些帮助来修复它们并使代码更有效!
ChartName = ActiveSheet.Range(n).Offset(0, -6) & " " & ActiveSheet.Range(n).Offset(0, -5)
我在上面一行中遇到类型不匹配的错误,我无法弄清楚如何处理。另外,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
答案 0 :(得分:2)
我在下面进行了一些更改
(已更新以处理工作表上的两个单独范围,一个名为DateRange
的范围和一个名为Test
的范围。两个范围都是工作表的本地范围,以满足ActiveSheet
测试,否则它们属于ActiveWorkbook
{但DateRange
可以是全局的或本地的,并且无论如何都会图好}}
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)
n
,然后将DateRange
范围添加为x系列.SeriesCollection(1).Name = ChartName
而不是.SeriesCollection.Name = ChartName
InStr(n.Name, "DateRange") = 0
而非n.Name <> "DateRange"
来避免处理DateRange的任何本地名称版本,即WEO!DateRange
我建议您查看Jon Peltier's excellent site以获取更详细的代码示例
我的本地工作表名称的测试代码的示例截图
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
答案 1 :(得分:0)
而不是ActiveSheet.Range(n)
或n.Value
,使用n.RefersToRange
来获取名称所指的范围