Обработчик ошибок Excel VBA не работает для ‘ошибка времени выполнения 13: несоответствие типов’

#vba #excel #error-handling #type-mismatch

#vba #excel #обработка ошибок #несоответствие типов

Вопрос:

Я запускаю приведенный ниже подраздел для файла Excel, содержащего около 10 листов, каждый из которых содержит сводную таблицу, связанную с одним и тем же источником данных. У меня есть две версии полей ‘Market’ и ‘Region’ в моих данных (т.Е. ‘Market (SC)’, ‘Market (AN)’, ‘Region (SC)’, ‘Region (AN)’), и мне нужно иметь возможность легко переключаться между ними. Я настроил код, чтобы сначала вывести соответствующие срезы на передний план (они накладываются друг на друга, чтобы скрыть другие), затем перебрать каждую сводную таблицу и поменять местами другие поля «Рынок» и «Регион» (сохраняя ту же позицию и т.д.).).

Поскольку я использую свойство «.SourceName» для идентификации поля, цикл выдает ошибку при сравнении сводного поля «Значения» с моей строкой. Я ввел «При ошибке перехода к следующему полю», чтобы указать ему перейти к следующему полю, когда это произойдет, но это работает только для 8 из 10 листов — для двух других я получаю сообщение об ошибке «Ошибка времени выполнения ’13’ Несоответствие типов», и на экране отладки отображается «*** » строка. Если я использую «При возобновлении следующей ошибки», предполагается, что оператор If был истинным и выполняет множество нежелательных действий (путает различные сводные таблицы).

Я самоучка и не имею полного представления об обработчике ошибок, но из ресурсов, с которыми я столкнулся, чтобы исправить эту ошибку, обработчик должен позаботиться об этом (что он работает для 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 " amp; target amp; "*" Or shp.GroupItems(i).Name Like "Region " amp; target amp; "*" Then shp.GroupItems(i).ZOrder msoSendToBack
                Next i
            Case Else
                If shp.Name Like "Market " amp; target amp; "*" Or shp.Name Like "Region " amp; target amp; "*" 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 " amp; target And fld.Orientation <> xlHidden Then
                orient = fld.Orientation
                pos = fld.Position
                fld.Orientation = xlHidden
                With pvt.PivotFields("Market " amp; repl)
                    .Orientation = orient
                    .Position = pos
                End With
            ElseIf fld.SourceName = "Region " amp; target And fld.Orientation <> xlHidden Then
                orient = fld.Orientation
                pos = fld.Position
                fld.Orientation = xlHidden
                With pvt.PivotFields("Region " amp; 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 листах, которые работают с этим кодом. Если я полностью удалю обработчик ошибок, я получу точно такое же всплывающее окно и выделенную строку для других листов… Любые предложения будут с благодарностью! Спасибо

Комментарии:

1. Вы не удаляете ошибку в своем обработчике ошибок. Прочитайте это для получения хорошего обзора того, как вы должны структурировать обработку ошибок: cpearson.com/excel/errorhandling.htm

2. Полностью удалите обработку ошибок и сообщите нам, в какой строке возникает ошибка

Ответ №1:

Тим, это было очень полезно и ответило на мой вопрос. Я обновил конец своего кода следующим образом:

 ResetPivotFilters

Exit Sub

err_handler:
Resume next_fld

End Sub
  

и обновил мою строку, разрешающую обработку ошибок, до «При ошибке Goto err_handler». Сейчас работает. Спасибо!