Страницы: 1
RSS
Code execution has been interrupted, Досадная ошибка
 
Здравствуйте...
Уверен, я не первый с этим сталкиваюсь, но что-то не удается обойти.
Запускаю два макроса. Первый - подставляет данные для проверки и ведет подсчет ошибок.
Второй - подставляет данные в таблицу, в которой потом запускается первый.

Все работает до некоторого момента. А потом бац, и Code execution has been interrupted, при чем при нажатии на Debug может подсветиться любая строка кода.
При ручном режиме (F8) все работает, после перезагрузки некоторое время тоже работает.
Подозрительные действия с моей стороны - часто прерываю код вручную (Ctrl+PauseBreak).
Из-за чего может такое появляться?
Хотел вставить сюда пример кода, но все буквы на русском языке (названия листов и комментарии) стали абракадаброй :(
Код
Sub ÏðîâåðêàÑòàòåé()
Dim k%
k = 0
'ïåðåáèðàþ âñå âõîäÿùèå íàçâàíèÿ ñòàòåé (ñî 2-é ïî 67-þ)
For i = 2 To 67
    Worksheets("Ëèñò8").Cells(8, 4).Value = Worksheets("Ëèñò8").Cells(i, 20).Value
    'âçâûâàþ èçâëå÷åíèå äàííûõ ïî âûáðàííîé ñòàòüå
    Call Èçâëå÷åíèåÄàííûõÏîÑ÷åòó
    'îáíîâëÿþ ýêðàí, æäó 2 ñåêóíäû, ïîêà ïåðåñ÷èòàþòñÿ ôîðìóëû
    Application.ScreenUpdating = True
    Application.Wait Time:=Now + TimeSerial(0, 0, 0.5)
    'âûâîæó èòîã ïîäñ÷åòà (Cells(8, 7).Value - "èñòèíà" èëè "ëîæü")
    If Worksheets("Ëèñò8").Cells(8, 7).Value = False Then
    k = k + 1
    End If
Next i
MsgBox k & " îøèáîê íàéäåíî."
End Sub
 
Подозреваю, что проблема тут: Application.Wait Time:=Now + TimeSerial(0, 0, 0.5). Эта строка вообще для чего?
 
Влад, жду, пока формулы посчитаются (в таблице их много, суммеслимн). Но ДО вставки этой строки тоже такое было :(
 
А что у нас второй макрос делает?
 
Перезагружался...

Первый:
Код
Sub ПроверкаСтатей()
Dim k%
k = 0
'перебираю все входящие названия статей (со 2-й по 67-ю)
For i = 2 To 67
    Worksheets("Лист8").Cells(8, 4).Value = Worksheets("Лист8").Cells(i, 20).Value
    'взвываю извлечение данных по выбранной статье
    Call ИзвлечениеДанныхПоСчету
    'обновляю экран, жду 2 секунды, пока пересчитаются формулы
    Application.ScreenUpdating = True
    Application.Wait Time:=Now + TimeSerial(0, 0, 0.5)
    'вывожу итог подсчета (Cells(8, 7).Value - "истина" или "ложь")
    If Worksheets("Лист8").Cells(8, 7).Value = False Then
    k = k + 1
    End If
Next i
MsgBox k & " ошибок найдено."
End Sub
Второй:
Код
Sub ИзвлечениеДанныхПоСчету()
Application.ScreenUpdating = False
Dim d$, g$, b%, bb%, i%, j%, rr%
j = 11
'обозначая границы поиска
b = Worksheets("Подготовка26").Cells(Rows.Count, 19).End(xlUp).Row
bb = Worksheets("Лист8").Cells(Rows.Count, 4).End(xlUp).Row
    'очищаю старые данные
    For rr = 11 To bb
        Cells(rr, 3).ClearContents
        Cells(rr, 4).ClearContents
    Next rr
    'копирую совпадения
    For i = 1 To b
        d = Worksheets("Подготовка26").Cells(i, 19).Value
        g = Worksheets("Лист8").Cells(8, 4).Value
        If d Like g Then
            Worksheets("Лист8").Cells(j, 3).Value = Worksheets("Подготовка26").Cells(i, 22).Value
            Worksheets("Лист8").Cells(j, 4).Value = Worksheets("Подготовка26").Cells(i, 21).Value
            j = j + 1
        End If
    Next i
    'убираю дубликаты (в надежде, что уйдет только лишнее:)
    Worksheets("Лист8").Range("$C$11:$D$1500").RemoveDuplicates Columns:=Array(1, 2), _
        Header:=xlNo
End Sub
 
Понятно. Это "больной мозоль" экселя - код ВБА всегда выполняется намного быстрее, чем операции с ячейками. У Вас таких операций много + пересчет, поэтому и появляются "затыки". Предлагаю попробовать использовать DoEvents, дабы дать возможность коду "отвлекаться" на обработку ячеек.
Изменено: Влад - 28.07.2015 12:01:23
 
Влад, благодарю! Сейчас поищу, что это за DoEvents и с куда его вставляют... :)
 
Дополнительно рекомендовал бы отказаться от удаления дубликатов каждый раз в цикле, а выполнить эту операцию один раз по его завершению.
 
Цитата
AlexTM написал: Хотел вставить сюда пример кода, но все буквы на русском языке ... стали абракадаброй
надо было перейти на русскую раскладку клавиатуры... (чтобы вставить код имеющий киррилицу)
Цитата
AlexTM написал: Перезагружался...
не надо было... (если проблема была только с киррилицей)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Читают тему
Наверх