使用VBA

时间:2016-01-21 12:50:21

标签: vba dynamic charts

我必须创建近200个时间序列图表。所以我试着编写一个完成我需要完成的大部分工作的宏 我为这个时间序列生成了名称作为例子:

Name:= AKB_ExampleA

该名称是指我用此公式声明的动态范围:

=OFFSET('sheet1'!$C$7:$C$137;0;0;COUNT('sheet1'!$C$7:$C$206))

现在到目前为止编码的宏:

Sub graphik_erstellen()

Call graphik1("AKB")

End Sub

Sub graphik(Name As String)
'
    Dim Ch As Chart
    Dim RngToCover As Range
    Set Ch = charts.Add
    Set Ch = Ch.Location(Where:=xlLocationAsObject, Name:="Charts")

    With Ch
      .ChartType = xlLine
      .SetSourceData Source:=Range(Name & "_ExampleA")
      .SeriesCollection(1).XValues = Range("Datum_Volumen")
      .SeriesCollection(1).Name = "SERIES1"
      .FullSeriesCollection(1).Select
        With Selection.Format.Line
            .Visible = msoTrue
            .ForeColor.RGB = RGB(192, 0, 0)
            .Transparency = 0
        End With
      .HasTitle = True
      .ChartTitle.Text = Name & ", Volumen (nach Korrektur)"
      .HasLegend = True
      .Legend.Position = xlLegendPositionBottom
      .Legend.Select
        Selection.Format.TextFrame2.TextRange.Font.Size = 11
        Selection.Format.TextFrame2.TextRange.Font.Bold = msoTrue
      With .Parent
        .top = 100
        .left = 100
        .height = 287.149606299
        .width = 543.685039370078
        .Name = Name & "_chart"
      End With
End With

End Sub

我的问题是,如果我这样做,动态范围就不会被考虑。它需要名称的范围($ C $ 7:$ C $ 137),但它应该引用名称本身(为了动态)。
因此,如果我点击图表查看系列,则系列值将声明为:='sheet1'!$C$7:$C$137而不是='sheet1'!ExampleA

如果有人可以帮助我,我真的非常感激。 最好 埃利奥

1 个答案:

答案 0 :(得分:2)

我已经重新排列了几行代码,并试图发表评论来引用它们。

让我知道什么有效。您可能需要将SeriesCollection更改为FullSeriesCollection。除此之外,代码在Excel 2010中有效。

第一个Sub根据来自Range 7的Column“C”中提供的数据,我只获得Row尺寸。

让我知道。

Option Explicit

Sub graphik_erstellen()

    'You always want to use direct reference to a sheet/range chart
    'Refering to the WorkBook they are in and the worksheet as well.
    'especially if you are opening multiple WorkBooks / Sheets
    Dim CurrentWorkSheet As Worksheet
    Set CurrentWorkSheet = Workbooks("Book1").Worksheets("Sheet1")

    'Dynamically finding the end of the data in Column C
    Dim LastRow As Long
    LastRow = CurrentWorkSheet.Cells(CurrentWorkSheet.Rows.Count, "C").End(xlUp).Row

    'Setting the range using the document reference aswell
    Dim AKB As Range
    Set AKB = Workbooks("Book1").Worksheets("Sheet1").Range(Cells(7, "C"), Cells(LastRow, "C"))


    Call graphik(AKB)

End Sub

Sub graphik(Name As Range)

    Dim DataChart As Chart
    Dim RngToCover As Range
    Set DataChart = Workbooks("Book1").Charts.Add

    'With Excel 2010 the line above will automatically add the chart as a sheet and not aobject in a sheet
    'Set DataChart = DataChart.Location(Where:=xlLocationAsObject, Name:="Charts")


    With DataChart
        .Name = "Charts" ' This will be the Name of the CHart Tab
        .ChartType = xlLine
        .SetSourceData Source:=Name

        'You can see below I avoided the Select and Selection
        With .SeriesCollection(1)
            'Using Offset I just used the data one cell to the left of the range
            .XValues = Name.Offset(0, -1)
            .Name = "SERIES1"
            With .Format.Line
                .Visible = msoTrue
                .ForeColor.RGB = RGB(192, 0, 0)
                .Transparency = 0
            End With
        End With

        .HasTitle = True
        .ChartTitle.Text = "MIDDEL TOP TEXT" 'Name & ", Volumen (nach Korrektur)"
        .HasLegend = True
        With .Legend
            .Position = xlLegendPositionBottom
            .Format.TextFrame2.TextRange.Font.Size = 11
            .Format.TextFrame2.TextRange.Font.Bold = msoTrue
        End With

        'Not sure about this, it doesnt work in my Excel 2010
        '
        With .Parent
            .Top = 100
            .Left = 100
            .Height = 287.149606299
            .Width = 543.685039370078
            .Name = Name & "_chart"
        End With

    End With

End Sub

让我知道您对Sheet和Chart名称的意图,然后我也可以帮助您实现所需的目标。