我有一个只读的2013工作簿,我用作模板工具,数据模型转到4个链接的数据透视图,启用切片器交叉过滤 . 当我在一个切片器上选择过滤器选项,过滤掉所有选项和另一个切片器上的数据时,我的工作簿会崩溃 .

也就是说,切片器1具有选项A,B,C等 .

  • 选项A与切片器2上的子集1,2和3相关 .

  • 选项B与切片器2上的子集4,5和6相关 .

如果切片器2有任何数据选择,我过滤切片器1以排除该选择的任何部分我的工作簿崩溃 .

没用的东西:

  • 我重建了图表,切片器和连接,但仍然遇到了同样的问题 .

  • 我在另一个工作簿中构建了一个非常简单的模型,无法重现该问题 .

  • 我关掉了活动 .

  • 我评论了我的VBA .

如果我小心所以选择与切片器2共享切片器1关系的项目似乎“工作”,但这里显然有些东西被打破了 .

这种情况似乎仅在切片器2中与切片器1的相关子集没有重叠时才会发生 . 如果选项A具有子集1,2,3,4,5 . . 并且选项B有一个3,4,5但没有1或2我没有得到问题,它只有当所有子集对于父项是唯一的并且选择不重叠时(例如A中没有5 =当5是崩溃时)选择B和A独有的) . 我找不到与此相关的任何已知问题 .

事件查看器显示:

Faulting application name: EXCEL.EXE, version: 15.0.4797.1003, time stamp: 0x56bf05fc
    Faulting module name: msolap110_xl.DLL, version: 0.0.0.0, time stamp: 0x55b0c5bf

我的问题是:

  • “msolap110_xl.DLL”可能是问题还是更可能是症状的一部分?

  • 我是否以某种方式错误处理了数据透视图,切片器或数据模型?

  • 可以修复吗?

相关编程:

Private Sub myReloadDataModel()
    If Range("myHasPath").Value = "True" Then
        MsgBox "You need to enter a path to a valid target location.", vbOKOnly, "Bad Path"
    Else
        myUser = MsgBox("Are you sure you want Reload the Data Model with any csv data located in the target path?", vbOKCancel, "3. Load Data Model")
        If myUser = vbOK Then

            Application.ScreenUpdating = False
            Application.EnableEvents = False
            Application.Cursor = xlWait

            myTime01 = Time
            Sheets("Notes").Unprotect
            Sheets("2. Get Table").Unprotect
            ActiveWorkbook.RefreshAll
'            ActiveWorkbook.Model.Refresh
'            ActiveWorkbook.Connections("Query - myGetMasterSpan").Refresh
            x = ActiveWorkbook.Connections("Query - myGetMasterSpan").ModelTables.Item(1).RecordCount
            myTime02 = Time
            myTime03 = Format(myTime02 - myTime01, "HH:MM:SS")

            Sheets("2. Get Table").Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
                , AllowUsingPivotTables:=True

            Application.Cursor = xlDefault
            Application.EnableEvents = True
            Application.ScreenUpdating = True

            MsgBox Format(x, "#,##0") & " Records Loaded!" & vbNewLine _
                & vbNewLine _
                & "Total Update Time = " & myTime03, , "Update Completed"
        End If
    End If
End Sub

事件

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
    On Error Resume Next
    Application.ScreenUpdating = Fales
    Application.EnableEvents = False
    Sheets("2. Get Table").Unprotect

    Application.Run "mySlicerMagic"
    ActiveWorkbook.Connections("LinkedTable_Table6").Refresh

    Set myChart04 = Sheets("Flow Errors").ChartObjects("Chart 4").Chart
        myChart04.ChartTitle.Text = Range("myErrorsTitle")
    With myChart04.Axes(xlValue)
        .MinimumScale = Range("myMin_Scale")
        .MaximumScale = Range("myMax_Scale")
    End With

    Set myChart05 = Sheets("Flow Errors").ChartObjects("Chart 5").Chart
        myChart05.ChartTitle.Text = Range("myErrorsTitle")
    With myChart05.Axes(xlValue)
        .MinimumScale = Range("myMin_Zoom")
        .MaximumScale = Range("myMax_Zoom")
    End With

        Application.Run "myChart5Format"

    Set thisPulseChart_02 = Sheets("Pulse Analyzer").ChartObjects("Chart 2").Chart
    With thisPulseChart_02
        .ChartTitle.Text = "Full Pulse Flow - " & Range("myErrorsTitle")
    End With
    With thisPulseChart_02.Axes(xlValue)
        .MaximumScale = Range("myMax_Scale") + 0.09
    End With

    Set thisPulseChart_03 = Sheets("Pulse Analyzer").ChartObjects("Chart 3").Chart
    With thisPulseChart_03
        .ChartTitle.Text = "Raw Pulse Flow by Pulse- " & Range("myErrorsTitle")
    End With

        Application.Run "myChart3Format"

    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

这个子获得了我的选择范围

Private Sub mySlicerMagic()
    On Error GoTo 100

    Set myX = ActiveWorkbook.SlicerCaches("Slicer_Pulse_Set").SlicerCacheLevels(1).SlicerItems

    For i = 1 To myX.Count
        If myX(i).Selected = True Then
            x = x + 1
            If x = 1 Then
                myItemName01 = myX(i).SourceName
            End If
            myItemName02 = myX(i).SourceName
        End If
    Next

    Range("myPulseRange")(1, 1) = myItemName01
    Range("myPulseRange")(2, 1) = myItemName02
100
End Sub