1
votes

I finally made myself a fix for the bug in Excel where sometimes, seemingly at random, the source data for a Pivot Chart changes from, say "Pivot Table 32" to "Pivot Table 3".

I had been hand editing all of these to end in text (which seems to stop it from happening.)

My original script actually revealed another bug. Excel updated all of the pivot table names, but then the charts would completely lose their source if they weren't visible when the script ran.

So, anyway, here's the VBA script I wrote.

Sub FixAllPivotTables()

Dim pt As PivotTable
Dim ws As Worksheet

If MsgBox("This script is mostly harmless.  It will add an 'x' to the end of every Pivot Table name to stop an Excel bug where sometimes Pivot Charts lose their connection to their original pivot.  Pivot Charts that are visible work with just changing the name in code, but hidden ones lose their source data.  So, this activates each sheet and then zooms to all.  I assume it might break if your chart and your pivot table aren't on the same page?  USE WITH CAUTION! Click 'Cancel' to quit gracefully without messing with anything.", vbOKCancel) = vbOK Then

'change the settings
For Each ws In ActiveWorkbook.Worksheets
'Pivot Charts that are visible work with just changing the name in code, but hidden ones lose their source data.  So, this activates each sheet and then zooms to all.  I assume it might break if your chart and your pivot table aren't on the same page?  USE WITH CAUTION!
ws.Activate
Cells.Select
ActiveWindow.Zoom = True
  For Each pt In ws.PivotTables
    'This one changes the last character of the pivot name to append an "x" so that there are no issues
    'with pivot charts losing their reference when there are >10 pivot tables.
    If Right(pt.Name, 1) <> "x" Then
        pt.Name = pt.Name + "x"
        Debug.Print pt.Name + " I added an x"
    Else
        Debug.Print pt.Name + " had an x already"
    End If
  Next pt
ActiveWindow.Zoom = 100
Range("a1").Select
Next ws


MsgBox "Added an 'x' to the end of each pivot table name if it didn't have one already.", vbOKOnly


Else
MsgBox "Cancelled", vbOKOnly
End If

End Sub

I know there's not error trapping, etc. But, this is one of those bugs when you're using a ton of pivot table and pivot charts that will wreak havoc at the worst times without any warning. Thanks. Jon

1

1 Answers

0
votes

Changing the title of a source data pivot table to something not ending in 2 numbers seems to prevent the original bug. The script I provided above should help you prevent it as long as all of your pivot charts are on the same page as the pivot tables.

Sub FixAllPivotTables()

Dim pt As PivotTable
Dim ws As Worksheet

If MsgBox("This script is mostly harmless.  It will add an 'x' to the end of every Pivot Table name to stop an Excel bug where sometimes Pivot Charts lose their connection to their original pivot.  Pivot Charts that are visible work with just changing the name in code, but hidden ones lose their source data.  So, this activates each sheet and then zooms to all.  I assume it might break if your chart and your pivot table aren't on the same page?  USE WITH CAUTION! Click 'Cancel' to quit gracefully without messing with anything.", vbOKCancel) = vbOK Then

'change the settings
For Each ws In ActiveWorkbook.Worksheets
'Pivot Charts that are visible work with just changing the name in code, but hidden ones lose their source data.  So, this activates each sheet and then zooms to all.  I assume it might break if your chart and your pivot table aren't on the same page?  USE WITH CAUTION!
ws.Activate
Cells.Select
ActiveWindow.Zoom = True
  For Each pt In ws.PivotTables
    'This one changes the last character of the pivot name to append an "x" so that there are no issues
    'with pivot charts losing their reference when there are >10 pivot tables.
    If Right(pt.Name, 1) <> "x" Then
        pt.Name = pt.Name + "x"
        Debug.Print pt.Name + " I added an x"
    Else
        Debug.Print pt.Name + " had an x already"
    End If
  Next pt
ActiveWindow.Zoom = 100
Range("a1").Select
Next ws


MsgBox "Added an 'x' to the end of each pivot table name if it didn't have one already.", vbOKOnly


Else
MsgBox "Cancelled", vbOKOnly
End If

End Sub