Loop Pivot Table Filter基于列中的值

时间:2018-03-05 03:46:28

标签: excel vba excel-vba pivot-table

对此非常新,但我会尝试简单地理解我的问题。

我有一张带有数据透视表的Excel工作表,我逐个过滤第一列(销售人员姓名),然后将过滤后的数据透视表复制粘贴到新工作表并将其另存为销售人员姓名。

是否有可能让宏根据表(Table1)中的值循环遍历第一列过滤器并将值复制到新工作表中?宏的一个例子会有所帮助。

更新 - 我已经在某种程度上管理了某些东西,但它正在复制pivottable批发,然后尝试保存每行的文件。

Sub Gen()

Dim PvtTbl As PivotTable
Set PvtTbl = ActiveSheet.PivotTables("PivotTable1")
Dim Field As PivotField
Set Field = ActiveSheet.PivotTables("PivotTable1").PivotFields("SPerson")
Dim PvtItm As PivotItem
Dim Range As Range
Dim i As Long
Dim var As Variant


Application.ScreenUpdating = False


For Each PvtItm In Field.PivotItems
    ActiveSheet.Range("$A$11").Select
    Selection.CurrentRegion.Select
    Selection.Copy
    Workbooks.Add
    ActiveSheet.Paste
    ActiveWorkbook.SaveAs ("C:\" & ActiveSheet.Range("$B$2") & Format(Date, "yyyy - mm") & ".xlsx")
Next PvtItm


Application.ScreenUpdating = True


End Sub`

其中$ A $ 11是pivottable,$ B $ 2是我要将文件保存为的销售人员的姓名。

1 个答案:

答案 0 :(得分:0)

2个版本:

版本1,使用循环选择可旋转项目。

版本2使用.ShowPages pivottable方法。

我猜测方法1应该更有效率。

在最初几次运行中,没有其他任何运行,我惊讶地看到.ShowPages更快;平均2.398秒,与版本1相比,花费3.263秒。

警告:这只是针对计时的一些测试运行,并且由于我的编码可能存在差异,但可能值得探索?没有使用其他优化方法。当然,还有其他一些可能。

版本1:

Option Explicit
Sub GetAllEmployeeSelections()

    Const filePath As String = "C:\Users\User\Desktop\" 'save location for new files

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim pvt As PivotTable

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet3")
    Set pvt = ws.PivotTables("PivotTable1")

    Application.ScreenUpdating = False

    Dim pvtField As PivotField
    Dim item As Long
    Dim item2 As Long

    Set pvtField = pvt.PivotFields("SPerson")

    For item = 1 To pvtField.PivotItems.Count

          pvtField.PivotItems(item).Visible = True

          For item2 = 1 To pvtField.PivotItems.Count

              If item2 <> item Then pvtField.PivotItems(item2).Visible = False

          Next item2

        Dim newBook As Workbook
        Set newBook = Workbooks.Add

        With newBook

            Dim currentName As String
            currentName = pvtField.PivotItems(item).Name

            .Worksheets(1).Name = currentName

            pvt.TableRange2.Copy

            Worksheets(currentName).Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats

           .SaveAs Filename:=filePath & currentName & ".xlsx"

           .Close

        End With

        Set newBook = Nothing

    Next item

    Application.ScreenUpdating = True

End Sub

版本2:

为什么不利用.ShowPages的{​​{1}}方法并将PivotTable作为页面字段参数?它循环指定的sPerson并为具有该项目值的每个项目生成工作表。然后,您可以再次循环字段项并将数据导出到新工作簿,保存,然后删除创建的工作表。

这可能有点矫枉过正了!

<强> PivotTable.ShowPages Method (Excel)

  

为页面字段中的每个项目创建新的数据透视表。每   新报告是在新工作表上创建的。

     

语法

     

表达。 ShowPages(PageField)

     

expression表示数据透视表对象的变量。

代码:

pagefield