Excel 如何确保数据透视缓存正常工作?
我试图通过VBA在Excel中创建一个pivot,但我一辈子都搞不懂为什么这段代码不起作用。它没有抛出任何错误——只是没有创建透视表。我在其他程序中使用了完全相同的代码,没有问题(显然是替换了局部变量)。我已经确认我的源数据定义正确。我唯一的线索是,在执行pivot缓存的创建之后,它显示PvtCache=NothingExcel 如何确保数据透视缓存正常工作?,excel,vba,pivot-table,Excel,Vba,Pivot Table,我试图通过VBA在Excel中创建一个pivot,但我一辈子都搞不懂为什么这段代码不起作用。它没有抛出任何错误——只是没有创建透视表。我在其他程序中使用了完全相同的代码,没有问题(显然是替换了局部变量)。我已经确认我的源数据定义正确。我唯一的线索是,在执行pivot缓存的创建之后,它显示PvtCache=Nothing Option Explicit Sub Create_Report() Dim sht_Break_Data As Worksheet Dim sht_Num_Breaks_P
Option Explicit
Sub Create_Report()
Dim sht_Break_Data As Worksheet
Dim sht_Num_Breaks_Pvt As Worksheet
Dim tab_name As String
Dim lrow_Src As Long
Dim lcol_Src As Long
Dim rng_Pvt_Source As Range
Dim PvtStart As Range
Dim PvtCache As PivotCache
Dim Pvt As PivotTable
Dim PvtField As PivotField
Dim PvtName As String
Set_Global_Variables
'Get last row and column of Source Data Tab
With sht_Source_Data
lrow_Src = .Cells(Cells.Rows.Count, 1).End(xlUp).Row
lcol_Src = .Cells(1, Cells.Columns.Count).End(xlToLeft).Column
'Set source data range for pivots
Set rng_Pvt_Source = .Range(.Cells(1, 1), .Cells(lrow_Src, lcol_Src))
End With
'=======================================Create Pivot for Number of Breaks==========================================='
'Create sheet for Number of Breaks Pivot
'If the given tab name already exists, contents are deleted. If not, it is created
With ThisWorkbook
tab_name = "Num of Breaks Pivot"
If SheetExists(tab_name, ThisWorkbook) = True Then
Set sht_Num_Breaks_Pvt = .Sheets(tab_name)
On Error Resume Next
sht_Num_Breaks_Pvt.ShowAllData 'clear any active filter
sht_Num_Breaks_Pvt.Cells.Delete 'delete content
Else
.Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = tab_name 'add new tab to the end
Set sht_Num_Breaks_Pvt = .Sheets(tab_name)
End If
'Define pivot start location
Set PvtStart = sht_Num_Breaks_Pvt.Cells(2, 1)
'Create Pivot Cache from Source Data
Set PvtCache = .PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=rng_Pvt_Source)
'Create Pivot table from Pivot cache
Set Pvt = PvtCache.CreatePivotTable( _
TableDestination:=PvtStart, _
TableName:="test")
End With
End Sub
我无法让上面的代码工作,不管它有多大意义。因此,我决定使用记录器并修改输出。下面是一些工作代码:
'Create pivot for Breaks w/o Remedies >30 days
.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
rng_rmdy_GT30.Address(, , xlR1C1, True), Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:=sht_rmdyGT30_Pivot.Cells(2, 1), _
TableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion14
sht_rmdyGT30_Pivot.Activate
Set Pvt = ActiveSheet.PivotTables("PivotTable1")
奇怪的是,没有R1C1格式的源数据范围也破坏了这段代码。我无法让上面的代码工作,不管它有多大意义。因此,我决定使用记录器并修改输出。下面是一些工作代码:
'Create pivot for Breaks w/o Remedies >30 days
.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
rng_rmdy_GT30.Address(, , xlR1C1, True), Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:=sht_rmdyGT30_Pivot.Cells(2, 1), _
TableName:="PivotTable1", DefaultVersion:=xlPivotTableVersion14
sht_rmdyGT30_Pivot.Activate
Set Pvt = ActiveSheet.PivotTables("PivotTable1")
奇怪的是,没有R1C1格式的源数据区域也破坏了此代码。只是一个预感:使用F8逐行检查代码,并检查sht_Num_Breaks_Pvt是否设置为您认为的工作表。已通过打印工作表名称进行检查,并且正确。好的。你们能把这个添加到例行程序的末尾,然后把出现的情况发回来吗?msgbox pvt.parent.name&&&pvt.name由于未设置PvtCache(无论出于何种原因),因此不会打印任何内容。我让步了,最终只是修改了宏记录器的输出,让它工作起来。请看我的答案。直到现在我才注意到您在下一个声明中出现了错误。通常情况下,在错误转到0时不关闭它不是一种好的做法,因为任何子任务错误都将被掩盖,这就是这里发生的情况。你能解释一下为什么你需要下一个错误恢复语句吗?如果你把它注释掉会发生什么?只是一种预感:使用F8逐行检查代码,并检查sht_Num_Breaks_Pvt是否设置为你认为的工作表。已经通过打印工作表的名称进行了检查,并且它是正确的。好的。你们能把这个添加到例行程序的末尾,然后把出现的情况发回来吗?msgbox pvt.parent.name&&&pvt.name由于未设置PvtCache(无论出于何种原因),因此不会打印任何内容。我让步了,最终只是修改了宏记录器的输出,让它工作起来。请看我的答案。直到现在我才注意到您在下一个声明中出现了错误。通常情况下,在错误转到0时不关闭它不是一种好的做法,因为任何子任务错误都将被掩盖,这就是这里发生的情况。你能解释一下为什么你需要下一个错误恢复语句吗?如果你把它注释掉会怎么样?