在VBA中创建具有命名范围的图表

时间:2011-12-30 01:30:22

标签: excel excel-vba type-mismatch vba

我正在尝试编写一些代码,这些代码将通过我在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

2 个答案:

答案 0 :(得分:2)

我在下面进行了一些更改

(已更新以处理工作表上的两个单独范围,一个名为DateRange的范围和一个名为Test的范围。两个范围都是工作表的本地范围,以满足ActiveSheet测试,否则它们属于ActiveWorkbook {但DateRange可以是全局的或本地的,并且无论如何都会图好}}

  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. 等图表
  4. 设置xy类型后,您可以将源范围直接设置为范围名称n,然后将DateRange范围添加为x系列
  5. 将您的系列名称添加到第一个系列,即.SeriesCollection(1).Name = ChartName而不是.SeriesCollection.Name = ChartName
  6. 我使用了InStr(n.Name, "DateRange") = 0而非n.Name <> "DateRange"来避免处理DateRange的任何本地名称版本,即WEO!DateRange
  7. 我建议您查看Jon Peltier's excellent site以获取更详细的代码示例

    我的本​​地工作表名称的测试代码的示例截图

      Test
    • H10:H13DateRange
    • D14:D17

    enter image description here

        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来获取名称所指的范围