【发布时间】:2017-02-16 19:09:12
【问题描述】:
我正在为一个包含大约 10 个工作表的 Excel 文件运行下面的子程序,每个工作表都包含一个链接到同一数据源的数据透视表。我的数据中有两个版本的“市场”和“区域”字段(即“市场 (SC)”、“市场 (AN)”、“区域 (SC)”、“区域 (AN)”),并且需要能够轻松地在它们之间切换。我将代码设置为首先将相应的切片器放在前面(它们被叠加以便隐藏另一个),然后遍历每个数据透视表并交换其他“市场”和“区域”字段(保持相同的位置等.).
由于我使用属性“.SourceName”来识别字段,当“Values”PivotField 与我的字符串进行比较时,循环会出错。我已经输入“On Error Goto next_fld”来告诉它在发生这种情况时跳到下一个字段,但这仅适用于 10 个工作表中的 8 个 - 对于另外两个我收到错误“运行时错误” 13' 类型不匹配”,调试屏幕突出显示“***”行。如果我使用“On Error Resume Next”,它假定 If 语句为 True 并执行许多不需要的操作(弄乱各种数据透视表)。
我是自学成才,对错误处理程序没有完整的了解,但从我遇到的修复此错误的资源来看,处理程序应该会处理这个问题(它确实适用于 8 /10 个工作表)。
这是我的代码:
Sub SwapMktRegFields()
Dim ws As Worksheet, shp As Shape
Dim i As Integer
Dim target As String, repl As String
target = Sheet5.Range("E3").value
'Identify current field, use other as repl(acement)
Select Case target
'AN slicers selected
Case Is = "AN"
target = "(AN)"
repl = "(SC)"
Sheet5.Range("E3").value = "SC"
'SC slicers selected
Case Is = "SC"
target = "(SC)"
repl = "(AN)"
Sheet5.Range("E3").value = "AN"
End Select
'Bring replacement slicers to front (some are in shape groups)
For Each ws In ThisWorkbook.Worksheets
For Each shp In ws.Shapes
Select Case shp.Type
Case Is = msoGroup
For i = 1 To shp.GroupItems.Count
If shp.GroupItems(i).Name Like "Market " & target & "*" Or shp.GroupItems(i).Name Like "Region " & target & "*" Then shp.GroupItems(i).ZOrder msoSendToBack
Next i
Case Else
If shp.Name Like "Market " & target & "*" Or shp.Name Like "Region " & target & "*" Then shp.ZOrder msoSendToBack
End Select
Next shp
Next ws
'Replace old PivotFields with replacement PivotFields
Dim pvt As PivotTable
Dim fld As PivotField
Dim orient As Long, pos As Long
' MY ERROR HANDLER
On Error GoTo next_fld
For Each ws In ThisWorkbook.Worksheets
For Each pvt In ws.PivotTables
For Each fld In pvt.PivotFields
' *** ERROR ON NEXT LINE WHEN fld IS 'VALUES'
If fld.SourceName = "Market " & target And fld.Orientation <> xlHidden Then
orient = fld.Orientation
pos = fld.Position
fld.Orientation = xlHidden
With pvt.PivotFields("Market " & repl)
.Orientation = orient
.Position = pos
End With
ElseIf fld.SourceName = "Region " & target And fld.Orientation <> xlHidden Then
orient = fld.Orientation
pos = fld.Position
fld.Orientation = xlHidden
With pvt.PivotFields("Region " & repl)
.Orientation = orient
.Position = pos
End With
End If
next_fld:
Next fld
Next pvt
Next ws
'A custom function to clear filters and re-apply a default
ResetPivotFilters
End Sub
最奇怪的部分是错误与使用此代码的其他 8 张工作表完全相同。如果我完全删除错误处理程序,我会得到完全相同的弹出窗口和其他工作表突出显示的行......任何建议将不胜感激!谢谢
【问题讨论】:
-
您没有清除错误处理程序中的错误。阅读这篇文章,了解如何构建错误处理:cpearson.com/excel/errorhandling.htm
-
完全删除您的错误处理并告诉我们错误发生在哪一行
标签: vba excel error-handling type-mismatch