Обработка ошибок в цикле для сортировки объектов сводной таблицы
Я пытался отсортировать объекты сводных таблиц в 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
но с этим вы выходите из обработчика ошибок и возобновляете нормальное выполнение кода. Обработчик ошибок снова включен.