【发布时间】:2015-11-06 20:50:44
【问题描述】:
我有一个看起来很讨厌的 VBA,它将创建一个新工作表并根据列表命名该工作表,在该新工作表中创建一个数据透视表,然后将数据透视表过滤为工作表名称。该列表位于 A 列和 B 列中,并且在两列中都包含空白,但代码知道跳过这些空白。
我遇到的问题是,如果工作表名称包含“0000”,那么它将需要使用 B 列中的信息过滤数据透视表,直到下一个空白。 表格的外观:
AR0000RK
AR0030RK
AR0063RK
AR0082RK
AR0085RK
07020850
TX0000TY
TX0182TY
TX0262TY
07020830
AR0021ZZ
AR0031ZZ
AR0057ZZ
AR0062ZZ
AR0066ZZ
AR0078ZZ
AR0079ZZ
AR0084ZZ
TX0019ZZ
TX0126ZZ
TX0130ZZ
TX0210ZZ
TX0404ZZ
和代码:
Sub CreatePivotTable()
Application.DisplayAlerts = False
Dim Wb As Workbook
Dim sht As Worksheet
Dim pvtCache As PivotCache
Dim pvt As PivotTable
Dim StartPvt As String
Dim SrcData As String
Dim pvtLastRow As Long
Dim sh As Worksheet
Dim pf As String
Dim pf_Name As String
Dim pf_Field As PivotField
Dim pf_Filter As PivotFilter
Set aSht = ThisWorkbook.Sheets("ARK_E_TEXAS")
lastRow = aSht.Range("ARK_E_TEXAS_LIST").Rows.Count
Set addPivotName = aSht.Range("B2:B" & lastRow)
Set dataRange = aSht.Range("B2:B" & lastRow)
pvtLastRow = ThisWorkbook.Worksheets("RAW Data").Range("A1").CurrentRegion.Rows.Count
'Determine the data range you want to pivot
SrcData = ThisWorkbook.Worksheets("RAW Data").Range("A1:DU" & pvtLastRow).Address(ReferenceStyle:=xlR1C1)
Set sht = ActiveSheet
'Where do you want Pivot Table to start?
StartPvt = sht.Name & "!" & sht.Range("A5").Address(ReferenceStyle:=xlR1C1)
'Create Pivot Cache from Source Data
Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=SrcData)
'Create Pivot table from Pivot Cache
Set pvt = pvtCache.CreatePivotTable( _
TableDestination:=StartPvt, _
TableName:="PivotTable1")
pvt.ManualUpdate = True
pvt.AddFields RowFields:=Array( _
"building_no", "budget_actvty_cd", "cost_elem_cd", "obj_class_cd", "func_cd", "vend_name", "title", "act_no")
'Create calculated Pivot Fields
pf = "amt"
pf_Name = "Sum of amt"
pvt.AddDataField pvt.PivotFields("amt"), pf_Name, xlSum
pvt.RowAxisLayout xlTabularRow
pvt.ShowTableStyleRowStripes = True
pvt.TableStyle2 = "PivotStyleMedium6"
Set pf_Field = sht.PivotTables("PivotTable1").PivotFields("building_no")
pf_Field.ClearAllFilters
Do Until pf_Field.PivotFilters.Count = 0
pf_Field.PivotFilters(1).Delete
Loop
*For Each addPivotName In dataRange
If InStr("newSheetName", "0000") > 0 Then
If addPivotName.Value <> "" Then
Set pf_Filter = pf_Field.PivotFilters.Add(Type:=xlCaptionEquals, Value1:=addPivotName)
Else
Set pf_Filter = pf_Field.PivotFilters.Add(Type:=xlCaptionEquals, Value1:=newSheetName)
End If
End If
Next addPivotName*
pvt.ManualUpdate = False
Application.DisplayAlerts = True
End Sub
【问题讨论】:
-
请澄清所有这些值(
AR0000RK、AR0030RK、TX0000TY、TX0182TY和AR0021ZZ)是否是 PivotField 的项目:building_no,如果不是,请告知我们他们属于哪个领域。能否请您张贴预期结果的图片。 -
@EEM 是的,这些都是 building_no 的一部分。我试图做的是,如果名称包含“0000”,那么过滤器将使用 B 列中的数字到 A 列中的下一个数字