仅引用带有VBA的Excel数据体范围的一部分

时间:2017-08-01 21:29:27

标签: excel-vba excel-vba-mac vba excel

我找到了在表(e.g. The VBA Guide To ListObject Excel Tables)中引用整行/列单个单元格的解决方案,但不是特定范围。

示例:Table1的DataBodyRange是3列10行,我需要绘制每列中4-10行的数据(以编程方式,因为表是动态的,我希望能够重新绘制如果添加/删除列,则绘制图。

我希望语法类似于

Sub reDrawChart()

Set sourcedata = ActiveSheet.ListObjects("Table1")
Set cht = Worksheets("Sheet1").ChartObjects(1).Chart

'Delete existing series
cht.ChartArea.ClearContents 

'Add new series
With cht.SeriesCollection.NewSeries
    For i = 1 To nColumns
        .Name = sourcedata.HeaderRowRange(i)
        .Values = sourcedata.DataBodyRange(4:10, i) '<-- Touble spot
    Next i
End With

End Sub

但这不起作用。有没有办法做我试图用这一行做的事情?我应该解决它并寻求不同的解决方案吗?

我还想避免使用.Select,因为在Mac OS上感觉就像任何使VBA口吃的代码有50/50的机会崩溃到桌面。

2 个答案:

答案 0 :(得分:0)

您可以迭代表的ListColumns并使用Offset和Resize从每个`ListColumn'的DataBodyRange获取一组特定的行。

对于第4行到第10行,您需要偏移3行,然后调整7行。如果感兴趣的行数发生变化,或者第一行索引发生变化,您可以在下面的示例代码中调整这些数字:

Option Explicit

Sub TableSection()

    Dim ws As Worksheet
    Dim lst As ListObject
    Dim lcl As ListColumn
    Dim i As Long
    Dim var As Variant

    Set ws = ThisWorkbook.Worksheets("Sheet1") '<-- change to your sheet
    Set lst = ws.ListObjects("Table1") '<-- change to your table

    For Each lcl In lst.ListColumns
        ' change 3 and 7 depending on the rows you are interested in
        var = lcl.DataBodyRange.Offset(3, 0).Resize(7, 1)
    Next lcl

End Sub

答案 1 :(得分:0)

试试这个循环而不是你的循环:

    For i = 1 To sourceData.ListColumns.count
      With cht.SeriesCollection.NewSeries
        .name = sourceData.ListColumns(i).name
        .values = sourceData.ListColumns(i).DataBodyRange. _
          Offset(3).Resize(sourceData.ListRows.count - 3)
      End With
    Next i