我有一个只读的 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