Excel VBA,在动态生成的图表中具有多个列输入作为XYscatter图表系列名称

时间:2016-04-04 09:07:40

标签: excel vba charts dynamically-generated

我正在尝试使用VBA自动生成动态XY散点图。我的数据是每次试验的12个单独数据集,试验次数会有所不同。首先通过扫描csv文件以找到最后一组数据,并通过删除标签的第一行,我将其除以12以确定可用的集合数量,然后将数据填充到具有相应数据点的图形中。系列名称。我已经完成了大部分代码,但是我在包含系列名称的范围数据时遇到了一些语法问题。系列名称仅在我选择列而不是列数据列时才有效。

如何修改我的代码以将多列输入作为我的系列名称?

Sub PlotSelect()
    Dim myChart As Chart

    DataRow = 1
    SelectRow = 2

    With ActiveSheet
    'To count the number of rows to determine number of sets of data
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    End With
    Row = LastRow - 1
    N = Row / 12

    'Creating a dummy chart before repopulating the data points
    Range("A1:B2").Select
    Set myChart = ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmooth).Chart
    '    delete all the dummy series 
    For i = myChart.SeriesCollection.Count To 1 Step -1
    myChart.SeriesCollection(i).Delete
    Next

    'Populating chart with data    
    Do While DataRow <= N
        If DataRow <> -1 Then
            myChart.SeriesCollection.NewSeries
            myChart.SeriesCollection(DataRow).Name = Range(ActiveSheet.Cells(SelectRow, 2), ActiveSheet.Cells(SelectRow, 5))
            myChart.SeriesCollection(DataRow).Values = Range(ActiveSheet.Cells(SelectRow, 9), ActiveSheet.Cells(SelectRow + 11, 9))
            myChart.SeriesCollection(DataRow).XValues = Range(ActiveSheet.Cells(SelectRow, 8), ActiveSheet.Cells(SelectRow + 11, 8))
        End If
        DataRow = DataRow + 1
        SelectRow = SelectRow + 12
    Loop
End Sub

1 个答案:

答案 0 :(得分:0)

我不是使用一系列单元格来生成数据条目的名称,而是合并单元格中的数据并将内容复制到另一个单元格中,然后选择具有连接单元格的新单元格。后来我删除了临时单元格。

Do While DataRow <= 2
    If DataRow <> -1 Then
        myChart.SeriesCollection.NewSeries  'To add new data entries
        **Range("B9999").Select
        ActiveCell.FormulaR1C1 = ((Cells(SelectRow, 4)) & "_" & (Cells(SelectRow, 5)) & "_" & (Cells(SelectRow, 6)))
        myChart.FullSeriesCollection(DataRow).Name = Range("B9999")**
        myChart.SeriesCollection(DataRow).Values = Range(Cells(SelectRow, 2), ActiveSheet.Cells(SelectRow + 600, 2))
        myChart.SeriesCollection(DataRow).XValues = Range(Cells(SelectRow, 1), ActiveSheet.Cells(SelectRow + 600, 1))

    End If
    DataRow = DataRow + 1
    SelectRow = SelectRow + 601
Loop   

Range("B9999").Delete               'to delete temp data
ActiveWindow.ScrollRow = 2          'to reset spreadsheet view

修改位于**范围