Excel charts - setting series end dynamically

后端 未结 7 1955
暗喜
暗喜 2020-12-10 07:21

I\'ve got a spreadsheet with plenty of graphs in it and one sheet with loads of data feeding those graphs.

I\'ve plotted the data on each graph using



        
7条回答
  •  温柔的废话
    2020-12-10 08:17

    This can be achieved in two steps:

    • Create a dynamic named range
    • Add some VBA code to update the charts data source to the named range

    Create a dynamic named Range

    Enter the number of rows in your data range into a cell on your data sheet.

    Create a named range on your data sheet (Insert - Name - Define) called MyRange that has a formula similar this:

    =OFFSET(Sheet1!$A$1,0,0,Sheet1!$D$1,3)
    

    Update the formula to match your layout

    • Sheet1!$A$1 set this to the top left hand side of your data range
    • Sheet1!$D$1 set this to the cell containing the number of rows
    • 3 set this value to the number of columns

    Test that the named range is working:

    Select the dropdown menus Edit - Go To, type MyRange into the reference field. Your data area for the chart should be selected.

    Add some VBA code

    Open the VBA IDE (Alt-F11)

    Select Sheet1 in the VBAProject window and insert this code

    Private Sub Worksheet_Change(ByVal Target As Range)
    
            If Target.Address <> "$D$1" Then Exit Sub
        'Change $D$1 to the cell where you have entered the number of rows
        'When the sheet changes, code checks to see if the cell $D$1 has changed
    
           ThisWorkbook.Sheets("Sheet1").ChartObjects(1).Chart.SetSourceData _
             Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
        '  ThisWorkbook.Sheets("Chart1").SetSourceData _
             Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
        'The first line of code assumes that chart is embedded into Sheet1
        'The second line assumes that the chart is in its own chart sheet
        'Uncomment and change as required
    
        'Add more code here to update all the other charts
    
    End Sub
    

    Things to watch for

    Do not directly use the named range as the data source for the chart. If you enter the named range "MyRange" as the Source Data - Data Range for the chart, Excel will automatically convert the named range into an actual range. Any future changes to your named range will therefore not update your chart.

    Performance might be impacted by the approaches listed above.

    The OFFSET function in the named range is "volatile" which means that it recalculates whenever any cell in the workbook calculates. If performance is an issue, replace it with the INDEX formula.

    =Sheet1!$A$1:INDEX(Sheet1!$1:$65536,Sheet1!$D$1,2)
    

    The code fires everytime data is changed on Sheet1. If performance is an issue, change the code to run only when requested (i.e. via a button or menu).

提交回复
热议问题