对此非常新,但我会尝试简单地理解我的问题。
我有一张带有数据透视表的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是我要将文件保存为的销售人员的姓名。
答案 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