Обработка ошибок; Количество раз L oop Повтор - PullRequest
0 голосов
/ 12 февраля 2020

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

JumpToHere:
        On Error GoTo MyErrorHandler

Do Until IsEmpty(ActiveCell)

[SOME ".VALUE =" AND A BUNCH OF QUERIES HAPPEN HERE]

        Application.ScreenUpdating = True
        ActiveCell.Offset(1, 0).Select
        DoEvents
        With Application
            .Calculation = xlManual
            .ScreenUpdating = False
        End With

MyErrorHandler:
    Err.Clear
    ActiveCell.Offset(0, 20).Value = ActiveCell.Offset(0, 20).Value + 1
    Resume JumpToHere

Loop

My беспокойство (я считаю) связано с линией ActiveCell.Offset(0, 20).Value + 1. Когда возникает ошибка, я хочу, чтобы макрос записывал 1 в ActiveCell.Offset(0, 20) при возникновении первой ошибки, перезапустите l oop из той же строки, где произошла ошибка, затем добавьте +1 к ActiveCell.Offset(0, 20), если есть дополнительные ошибки / циклы, выполненные в строке.

В настоящее время макрос, кажется, никогда не добавляет счетчик ошибок в первую строку, но будет помещать значение 2 в каждую последующую строку, в том числе в первую пустую строку в нижняя часть данных для обработки, где не требуется никакой обработки. После того, как вся обработка ошибок закомментирована, макрос прекрасно проходит по всем строкам, поэтому я полагаю, что приведенный выше код не регистрирует количество ошибок.

1 Ответ

1 голос
/ 12 февраля 2020

без всего кода трудно увидеть, но, похоже, у вас есть обработчик ошибок внутри l oop? Таким образом, он выполняется каждый раз, когда выполняется код в l oop. Так что ваша проблема понятна, потому что в настоящее время «ActiveCell» бродит по строкам.

Так что просто переместите обработчик ошибок за пределы l oop, чтобы он не выполнялся каждый l oop, а только в том случае, если ошибка действительно возникает. Во-вторых, старайтесь избегать работы с ActiveCell, если у вас есть время для оптимизации кода.

Я думаю что-то вроде этого:

Sub GreatSub()

Dim Things As String


'Your code happens here


JumpToHere:
On Error GoTo MyErrorHandler

Do Until IsEmpty(ActiveCell)

    'More awesome code here

Loop

'Possibly more greatness here

Exit Sub

MyErrorHandler:
    Err.Clear
    ActiveCell.Offset(0, 20).Value = ActiveCell.Offset(0, 20).Value + 1
    Resume JumpToHere

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...