【问题标题】:Excel VBA error handler not working for 'run-time error 13: type mismatch'Excel VBA 错误处理程序不适用于“运行时错误 13:类型不匹配”
【发布时间】: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


【解决方案1】:

蒂姆,这很有帮助,回答了我的问题。我将代码的末尾更新为以下内容:

ResetPivotFilters

Exit Sub

err_handler:
Resume next_fld

End Sub

并将我的错误处理启用行更新为“On Error Goto err_handler”。现在工作。谢谢!

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多