Обработка ошибок в цикле для сортировки объектов сводной таблицы

Я пытался отсортировать объекты сводных таблиц в VBA с помощью функции, которую я пытался:

Public Function PTSort(PTName As String, PTFieldName as String, SortArray As Variant)

Dim m as Integer: m = 1 'Row counter
Dim i as Long 'Dummy Variable for cycling

With ActiveSheet.PivotTables(PTName).PivotFields(PTFieldName)
    .Parent.ManualUpdate = True
    For i = LBound(SortArray) To UBound(SortArray)
        With .PivotItems(SortArray(m - 1)) 'For in-code array
            .Position = m
        End With
    m = m + 1
    Next i
    .Parent.ManualUpdate = False
End With

End Function

Хотя это хорошо работает с известным набором элементов в SortArray, у меня есть основной список, которому нужно следовать при сортировке (чтобы стандартизировать несколько заказов по нескольким сводным таблицам), в котором сводная таблица не обязательно должна содержать все упомянутые сводные элементы. Я, следовательно, улучшил его до следующего:

Sub PTSort(PTName As String, PTFieldName as String, SortArray As Variant)

Dim m as Integer: m = 1
Dim i as Long
Dim k As Integer: k = 1 'To cycle the position independently from the array in the event of disjoint.

With ActiveSheet.PivotTables(PTName).PivotFields(PTFieldName)
    .Parent.ManualUpdate = True
    For i = LBound(SortArray) To UBound(SortArray)
        On Error GoTo ERRHANDLER:
        With .PivotItems(SortArray(k)) 'After parsing from range of cells into VariantArray, then does one not require the "-1"
            .Position = m
        End With
    m = m + 1
ExitHandler:
    k = k + 1
    Next i
    .Parent.ManualUpdate = False
End With
GoTo ENDEND:

ERRHANDLER:
GoTo EXITHANDLER:

ENDEND:
End Sub

Хотя OnError GoTo работает только один раз, независимо от того, как высоко он был расположен?

Помощь будет принята с благодарностью. Заранее спасибо!

1 ответ

Решение

Это из MSDN на Visual Studio, но я думаю, что это относится к VBA таким же образом.

"Включенный" обработчик ошибок - это тот, который включен оператором On Error. "Активный" обработчик ошибок - это включенный обработчик, который находится в процессе обработки ошибки.

Если ошибка происходит, когда обработчик ошибки активен (между возникновением ошибки и оператором Resume, Exit Sub, Exit Function или Exit Property), обработчик ошибок текущей процедуры не может обработать ошибку. Контроль возвращается к вызывающей процедуре

Так что после того, как ваш код первым On Error GoTo ERRHANDLER, ERRHANDLER включен Затем, когда возникает ошибка ERRHANDLER активируется и обрабатывает ошибку. Когда ты GoTo EXITHANDLER он остается активным и все еще обрабатывает ошибку. On Error GoTo ERRHANDLER не имеет никакого эффекта в этой точке.

Чтобы снова включить ERRHANDLER вам нужно использовать Resume EXITHANDLER вместо GoTo EXITHANDLER,


Изменить на Resume заявление. Есть три способа использования Resume: Resume, Resume Next а также Resume label

Resume без аргумента код возобновляет работу со строки, вызвавшей ошибку. Это, очевидно, нужно использовать очень осторожно, так как вы должны быть абсолютно уверены, что вы исправили проблему, или вы окажетесь в бесконечном цикле.

Resume Next заставляет код возобновить работу после строки, вызвавшей ошибку.

Resume Label почти так же, как GoTo Label но с этим вы выходите из обработчика ошибок и возобновляете нормальное выполнение кода. Обработчик ошибок снова включен.

Другие вопросы по тегам