记录VBA宏以创建提供应用程序定义错误的数据透视表

时间:2016-04-28 14:21:34

标签: excel-vba pivot-table vba excel

我为创建数据透视表而录制的宏给出了以下错误:

  

运行时错误1004:应用程序定义的错误或对象定义的错误。

我已根据this Microsoft link从录制的宏中删除了相关部分。但是,我仍然收到同样的错误。

Sub testmacro()
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
        ActiveWorkbook.Connections("WorksheetConnection_Sheet8!$A$1:$E$162"), Version _
        :=xlPivotTableVersion15).CreatePivotTable TableDestination:="", _
        TableName:="PivotTable27", DefaultVersion:=xlPivotTableVersion15
    With ActiveSheet.PivotTables("PivotTable27").CubeFields("[Range].[and not]")
        .Orientation = xlPageField
        .Position = 1
    End With
    With ActiveSheet.PivotTables("PivotTable27").CubeFields("[Range].[term]")
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable27").AddDataField ActiveSheet.PivotTables( _
        "PivotTable27").CubeFields("[Measures].[Count of family 2]"), "Count of family"
    With ActiveSheet.PivotTables("PivotTable27").PivotFields( _
        "[Measures].[Count of family 2]")
        .Caption = "Distinct Count of family"
        .Function = xlDistinctCount
    End With
End Sub

调试器在ActiveWorkbook.PivotCaches.Create行引发错误。新工作表确实打开,但它是空白的。谢谢。

2 个答案:

答案 0 :(得分:0)

简短回答 - 定义外部数据源以指向数据透视表。

更长的答案......

当我录制宏以从不同的工作簿构建数据透视表时,我得到以下内容......

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
    "[JunkData.xlsx]Sheet1!R1C1:R11C3", Version:=6).CreatePivotTable _
    TableDestination:="Sheet6!R3C1", TableName:="PivotTable1", DefaultVersion _
    :=6

您可以看到指定了SourceType:=xlDatabase

我还可以将工作簿JunkData.xlsx设置为外部数据源。关闭JunkData文件后,在Excel中转​​到Data->现有连接 - >此计算机上的连接 - >浏览更多...导航到JunkData,选择它并按照提示操作,但只进行连接。 / p>

然后,我可以录制一个新的宏。在Create Pivot表对话框中,选择“Use a external data source”并选择JunkData。

然后我得到这行代码......

ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
    ActiveWorkbook.Connections("JunkData"), Version:=6).CreatePivotTable _
    TableDestination:="Sheet7!R3C1", TableName:="PivotTable2", DefaultVersion _
    :=6

您的代码看起来应该是SourceType:=xlDatabase而不是SourceType:=xlExternal

事实上,如果我将第一个示例更改为SourceType:=xlDatabase,我会得到与您相同的错误(是的,我将其更改为TableDestination:="")。如果JunkData文件关闭,第一个例子也不会运行。

第二个示例运行良好(使用TableDestination修改)。

如果您需要从已关闭的文件创建数据透视表,我认为您需要进行外部数据连接。

答案 1 :(得分:0)

我正在添加另一个答案,因为它与第一个答案不同。

  1. 要使用Distinct Count,您必须选择"将此数据添加到数据模型"插入数据透视表时。
  2. 这相当于VBA中的特定Workbook.Connections.Add2调用。
  3. 将数据模型指定为数据透视表的源会导致将源标识为xlExternal,即使数据位于同一工作簿中也是如此。
  4. 以下宏适用于各种场景(新打开的工作簿;已打开工作簿且数据模型已存在)。如果我删除了.Add2电话,那么我会收到相同的错误。我能得到Distinct Count。

    Dim NewSht As Worksheet
    '
        Workbooks("Book2").Connections.Add2 "WorksheetConnection_Sheet1!$A$1:$D$20", "" _
            , "WORKSHEET;[Book2]Sheet1", "Sheet1!$A$1:$D$20", 7, True, False
        Set NewSht = Sheets.Add
        Debug.Print NewSht.Name
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlExternal, SourceData:= _
            ActiveWorkbook.Connections("WorksheetConnection_Sheet1!$A$1:$D$20"), Version _
            :=6).CreatePivotTable TableDestination:=NewSht.Name & "!R3C1", TableName:= _
            "myPivotTable", DefaultVersion:=6
        NewSht.Select
        Cells(3, 1).Select
        With ActiveSheet.PivotTables("myPivotTable").CubeFields("[Range].[Name]")
            .Orientation = xlRowField
            .Position = 1
        End With
        ActiveSheet.PivotTables("myPivotTable").CubeFields.GetMeasure "[Range].[Name]" _
            , xlSum, "Count of Name"
        ActiveSheet.PivotTables("myPivotTable").AddDataField ActiveSheet.PivotTables( _
            "myPivotTable").CubeFields("[Measures].[Count of Name]"), "Count of Name"
        With ActiveSheet.PivotTables("myPivotTable").PivotFields( _
            "[Measures].[Count of Name]")
            .Caption = "Distinct Count of Name"
            .Function = xlDistinctCount
        End With
    End Sub