“I approve of your spreadsheet methodology.”
-Henry Ford
I’ve got some Excel VBA macros that you may find useful in your work on PowerPivot. Been saving these up for awhile now, and I think there are now enough to warrant a post.
I’ll post them all below with a description of each, but since WordPress seems to prevent copy/paste by default, I will also place a text file here containing all of them, so you can download all at once.
These get the job done in workmanlike fashion. Feel free to point out how much better I could have made them
I know, I could have turned off visual display updates to make them faster, for instance, but if I had to make these things pretty before sharing, I never would have shared
So hopefully, you will find them useful, if as nothing more than a starting point.
Without further delay, I give you, the macros…
“Make the same change to all PivotTables in the Workbook” Macro
Useful When: You have lots of Pivots and they all need the same change made
Be careful of: Well, as with all macros, you should save your work before running
Sub ModifyAllPivotTables()
Dim Pivot As PivotTable
Dim Sheet As Worksheet
For Each Sheet In ActiveWorkbook.Worksheets
For Each Pivot In Sheet.PivotTables
‘YOUR CODE HERE
‘EXAMPLE: Add Field “b” to Rows:
‘Pivot.AddDataField Pivot.PivotFields(“b”), “Sum of b”, xlSum
‘With Pivot.PivotFields(“b”)
‘ .Orientation = xlRowField
‘ .Position = 3
‘End With
Next
Next
End Sub
Remove slicer parent controls (rectangles around slicers in the sheet)
Useful when: You want to get rid of that “Unsupported Features” warning in Excel Services
Also useful when: You end up with lots of slicer parent controls stacked on top of each other, like we do… ‘cuz we copy/paste sheets too much
Be careful of: This macro nukes all Rectangle art shapes in the workbook
Also be careful of: The PowerPivot addin puts the parent controls back whenever you select a pivot
Sub RemoveAllRectangles()
Dim oSheet As Worksheet
Dim oShape As Shape
For Each oSheet In ActiveWorkbook.Sheets
For Each oShape In oSheet.Shapes
If Left(oShape.Name, 9) = “Rectangle” Then
oShape.Delete
End If
Next oShape
Next oSheet
End Sub
Connect all Slicers on a given sheet to a specific pivot on any sheet
Useful when: You want to create an All Slicers sheet, that contains nothing but slicers that are intended to affect pivots on other sheets. I like to use the PowerPivot addin to create the slicers because it sizes them correctly, then getting rid of the pivot, leaving just a slicer sheet. But then you have to connect all those slicers to the pivot(s) on other sheet(s), eek. This macro is a huge help.
Be careful of: What could possibly go wrong with this one? Heh heh.
Sub ConnectSlicers()
Dim oSlicer As Slicer
Dim oSlicerCache As SlicerCache
For Each oSlicerCache In ActiveWorkbook.SlicerCaches
For Each oSlicer In oSlicerCache.Slicers
If oSlicer.Shape.BottomRightCell.Worksheet.Name = “YOUR SHEET NAME HERE” Then
oSlicer.SlicerCache.PivotTables.AddPivotTable (Sheets(“ANOTHER OR SAME
SHEET”).PivotTables(“DESIREDPIVOT”))
End If
Next
Next
End Sub
“Disable slicer cross filtering” macro
Useful when: you have a lot of pivots in a workbook that all have very similar slicer fields in use, and you suddenly realize that cross-filtering is not required on a bunch of those fields and it is just slowing down performance.
Be careful of: If you have slicer fields with similar names, this macro’s use of InStr (essentially, a “Contains” operator) may cause you problems.
Sub DisableCrossFilter()
Dim oSlicer As Slicer
Dim oSlicerCache As SlicerCache
Dim sName As String
Dim bClearCrossFilter As Boolean
‘ASSUMES 3 FIELDS YOU WANT TO DISABLE X-FILTER FOR, CHANGE 3 TO OTHER NUMBER AS NEEDED!
Dim aTestString(1 To 3) As String
Dim iStringCount As Integer
iStringCount = 3
Dim i As Integer
‘YOUR FIELD NAMES HERE
aTestString(1) = “Buyer”
aTestString(2) = “Period”
aTestString(3) = “Store”
For Each oSlicerCache In ActiveWorkbook.SlicerCaches
For Each oSlicer In oSlicerCache.Slicers
bClearCrossFilter = False
For i = 1 To iStringCount
If InStr(oSlicer.Name, aTestString(i)) > 0 Then
bClearCrossFilter = True
End If
Next i
If bClearCrossFilter = True Then oSlicer.SlicerCacheLevel.CrossFilterType = xlSlicerNoCrossFilter
Next
Next
End Sub
Enable slicer cross filtering
Useful when: you over-use the macro above
Just replace the FOR loop body of the macro above with:
For Each oSlicerCache In ActiveWorkbook.SlicerCaches
For Each oSlicer In oSlicerCache.Slicers
bSetCrossFilter = False
For i = 1 To iStringCount
If InStr(oSlicer.Name, aTestString(i)) > 0 Then
bSetCrossFilter = True
End If
Next i
If bSetCrossFilter = True Then oSlicer.SlicerCacheLevel.CrossFilterType =
xlSlicerCrossFilterShowItemsWithDataAtTop
Next
Next
Hide all gridlines and headers
Useful when: you want to make your report sheets look more professional
Sub HideGridAndHeaders()
Dim sSheet As Worksheet
For Each sSheet In ActiveWorkbook.Worksheets
sSheet.Activate
ActiveWindow.DisplayGridlines = False
ActiveWindow.DisplayHeadings = False
Next
End Sub
Link to text file with all macros
Here’s the link again in case you don’t want to scroll all the way back up.
Got a macro of your own?
Post it in comments or email it to me. If I get enough I’ll do a “Part Two – Macros From the Community” post.
Posted by powerpivotpro 









