#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». Сейчас работает. Спасибо!