DataWright Information Services

Consulting and Resources for Excel and Access

Changing an external data source for a pivot table

A while ago I was asked to build a reporting tool that consisted of twenty or so pivot tables based on an external data source. The data in the original query was filtered by State, so that users could only see data that related to them. Once completed, the tool was made available to the other sections of the business, which meant changing the filters. Doing this by hand was tedious: each pivot table needed the State to be reset and, when the table was refreshed, the drop-down lists contained unwanted items from the previous States. It was time to go for a dig and see whether these properties could be manipulated in VBA.

Changing the filter on the query for the external data source

By recording the process of creating a pivot table from an external source, it is possible to see what parameters are used for the PivotCache property.

Property Description
Connection An array that contains parameters for the data connection
CommandType Defines the type of data that the CommandText contains. If your data source is a query, CommandType will be xlCmdSql; if you are using a table it is xlCmdTable; for an OLAP cube it is xlCmdCube, and for a SharePoint list it is xlCmdList
CommandText The connection data. If you are using a table, the CommandText is Array("YourTableName"); for a query, CommandText is a SQL statement.
MaintainConnection True to keep the connection open while the workbook remains open; False otherwise
CreatePivotTable The command that creates the pivot table. Requires three parameters: The TableDestination, TableName, and DefaultVersion.

At least in Excel 2007, you can use either xlCmdTable or xlCmdSql with Array("YourTableName") or a SQL statement. All four permutations worked when I tested them.

The parameter that defines the SQL for the data source is CommandText, so to modify the filters this is the parameter to use.

Removing the old names from drop-downs

When you change a pivot table to reference a new data set, you will find that the names from the old data set still appear in the drop-down options of row and column fields. This "pivot junk" is annoying for users, and although it can be removed manually the process is tedious. It's much simpler to use a line of code to do the job.

The code below does both jobs: resets the query for the pivot cache, and removes any unwanted items from the drop-downs in the pivot table. The original pivot cache retrieved all records from the UK_CarSales table, but the new SQL excludes manufacturers with names starting from A to L.

Sub ChangeSource()
  Dim sSQL As String
  Dim PT As PivotTable

  'define the new data query
  sSQL = "SELECT * FROM UK_CarSales WHERE Manufacturer>'M'"

  For Each PT In ActiveSheet.PivotTables
    'change the source, remove missing items, and requery the PT
    PT.PivotCache.CommandText = sSQL
    PT.PivotCache.MissingItemsLimit = xlMissingItemsNone
    PT.PivotCache.Refresh
  Next PT
End Sub

This sample will reset all pivot tables on the active sheet. It's straightforward to adapt it so that you loop through all worksheets in the workbook.