Problem
If a workbook created with Excel or ExcelWriter contains a named range, can the named range be modified (i.e. modify the areas it references)?
A customer asked about this specific scenario:
For example, when the document was first created a named range called “DataRange” was created in the workbook referencing cells A1:B9 on sheet1. The end user has been instructed to create pivots and charts based on this named range.
Then at a later date when new data is available I want to refresh the data in that spreadsheet and refresh the named range. If the number of rows of data has changed, say going from 9 records to 12, how can I update the existing named range to include the new area and thus have all the pivots/charts that were created by the end user automatically linked to the new area?
Solution
Currently there is not a way to modify the area referenced by a named range using the ExcelApplication object. There is a method Range.JoinRange that can add a new area to a named range.
In the scenario listed above, this won’t work for the customer because Excel does not let you specify a formula containing multiple areas as the data source for a pivot table. Doing so would result in a “Reference is not valid” error.
In Excel, if you insert new rows or delete rows inside an existing range, the range would be automatically adjusted; charts and pivot tables which refer to this range are automatically updated. We can follow this approach to update named ranges referenced by pivot tables.
Inserting Data Rows with ExcelApplication
- Open the Excel file with the ExcelApplication object.
- Retrieve the existing named range. using Workbook.GetNamedRange or Worksheet.GetNamedRanged.
- Insert enough rows to accommodate new data within the named range using Worksheet.InsertRows or Worksheet.InsertRow.
- Insert data into the new rows by setting Cell.Value or using Worksheet.ImportData.
Inserting Data Rows with ExcelTemplate
- Create ExcelWriter data markers within the existing named range (e.g. use ExcelApplication to write Cell.Value = “%%=DataSource.ColumnName”).
- Use ExcelTemplate to populate the data markers.
Deleting Data Rows
To delete existing rows, you can use the Worksheet.DeleteRows or Worksheet.DeleteRow method.
Customer Example
In the customer’s scenario, the new rows need to be inserted inside the named range (not at the beginning or end). Also, the pivot table must be set to “Refresh on open”, which is an option under pivot table options > data.
Share the post "Modifying an existing named range with ExcelWriter"