遍历Power Pivot,数据透视表过滤器并打印到PDF

时间:2019-07-25 17:13:08

标签: excel vba for-loop pivot-table powerpivot

祝大家好运,这篇文章的目的是能够遍历Excel Power Pivot,数据透视表并将每个筛选结果打印到PDF的特定文件位置。

下面的代码运行,但是当它到达输出的for循环时,给我一个错误提示

  

“运行时错误-438对象不支持属性或方法”

For Each pi In pt

请参见下面的代码:

Sub Button1_Click()
 Dim strPath As String
 Dim wksSource As Worksheet
 Dim pt As PivotTable
 Dim pf As PivotField
 Dim pi As PivotItem
 Dim cf As CubeField

 Set wksSource = Worksheets("Summary for Each Analyst")

 Set pt = wksSource.PivotTables("PivotTable1")

 Set cf = pt.CubeFields("[Std_MainData].[CredentialingAnalyst]")

 If cf.Orientation <> xlPageField Then
  MsgBox "There's no 'Credentialing Analyst' field in the Report Filter. Try again!", vbExclamation
 End If

 strPath = "H:\"

 If Right(strPath, 1) <> "\" Then strPath = strPath & "\"

  ActiveWorkbook.ShowPivotTableFieldList = False

  pt.PivotCache.Refresh

  For Each pi In pt
   wksSource.ExportAsFixedFormat Type:=xlTypePDF, Filename:=strPath & pi.Name & ".pdf"
  Next pi

2 个答案:

答案 0 :(得分:1)

整个周末,我一直在为同一个问题而苦苦挣扎,终于让它在切片器而不是报表过滤器中循环工作。

'This VBA will loop through your Power Pivot slicer and print the results to PDF.
'To get it working change slicer name and storage location in below VBA.

Private Sub PowerPivotLoopSlicerPrintPDF()
Dim SC As SlicerCache
Dim SL As SlicerCacheLevel
Dim SI As SlicerItem

Set SC = ActiveWorkbook.SlicerCaches("Slicer_Kolonne1") 'Add slicer name between " "
Set SL = SC.SlicerCacheLevels(1)

'c(ounter) is set to 1, ready to begin
c = 1


'Repeat the a loop until number of prints exceeds number of items in slicer
Do While c <= SC.SlicerCacheLevels.Item.Count + 1

'This makes sure that SI is the correct slicer. Needed for corrent file name.
    For Each SI In SL.SlicerItems
        If SI.Selected = True Then
        SlicerverdiIndex = c
    Exit For
        End If
    Next SI


    'PRINT CODE
    Dim FName           As String
    Dim FPath           As String

    'Define file path for printed file storage
    FPath = "C:\Users\remia\Desktop\VBA\"   'Choose your filepath
    FName = SI.SourceName

    'Define WHAT to print and how to build file name
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    FPath & "\" & FName & ".pdf", Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
    False

    'PRINT CODE FINISHED

'Sets the slicer to the last item in the list
If SlicerverdiIndex = 1 Then
    SlicerverdiIndex = SC.SlicerCacheLevels.Item.Count + 1
End If
SC.VisibleSlicerItemsList = SL.SlicerItems(SlicerverdiIndex - 1).Name

'Adds 1 to the counter, will loop until end of slicer has been reached.
c = c + 1

Loop

End Sub

答案 1 :(得分:0)

请按照RADO的指示将pt更改为pv:

import React, { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

谢谢