Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何确保数据透视缓存正常工作?_Excel_Vba_Pivot Table - Fatal编程技术网

Excel 如何确保数据透视缓存正常工作?

Excel 如何确保数据透视缓存正常工作?,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

我试图通过VBA在Excel中创建一个pivot,但我一辈子都搞不懂为什么这段代码不起作用。它没有抛出任何错误——只是没有创建透视表。我在其他程序中使用了完全相同的代码,没有问题(显然是替换了局部变量)。我已经确认我的源数据定义正确。我唯一的线索是,在执行pivot缓存的创建之后,它显示PvtCache=Nothing

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时不关闭它不是一种好的做法,因为任何子任务错误都将被掩盖,这就是这里发生的情况。你能解释一下为什么你需要下一个错误恢复语句吗?如果你把它注释掉会怎么样?