Код VBA в Excel случайным образом прекращает выполнение. Сообщения об ошибках отсутствуют

По сути, у меня есть кнопка Updata, которая берет информацию из двух столбцов, в двух таблицах (в пределах 1 книги). Общая цель этого кода – взять все значения из одного столбца, а затем добавить значения из другого столбца под ним.

Worksheets("Overall Flow").Range("A4:A1004").Value = Worksheets("Active").Range("A2:A1002").Value Dim i As Integer For i = 4 To 1004 If Worksheets("Overall Flow").Range("A" & Trim(str(i))) = "" Then Worksheets("Overall Flow").Range("A" & Trim(str(i)) & ":A" & Trim(str(1000 + i))).Value = Worksheets("Inactive").Range("A2:A1002").Value i = 1005 End If Next 

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

Когда я запускаю первую строку по отдельности, она работает нормально, но не тогда, когда:

 Worksheets("Overall Flow").Range("A" & Trim(str(i)) & ":A" & Trim(str(1000 + i))).Value = Worksheets("Inactive").Range("A2:A1002").Value 

или

 Worksheets("Overall Flow").Range("A4:A1004").Value = Worksheets("Inactive").Range("A2:A1002").Value 

присутствует во второй половине дня.

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

Для меня он работает отлично каждый раз, и я пробовал его на двух разных компьютерах – Excel 2003 и Excel 2010.

Я установил точку останова и наступил с F8, а также Shift F8, и оба работали нормально.

Что-то может отличаться от ваших данных (т. Е. Первая ячейка, скопированная с неактивного листа, пуста, и поэтому выполнение останавливается после обработки первой ячейки – проверьте, что столбец A4 не пуст), или, возможно, некоторая память повреждена из-за того, что Офис убит.

В модуле у меня есть:

 Sub test() Worksheets("Active").Range("A2:A1002").Value = "active" Worksheets("Active").Range("A5").Value = "" Worksheets("Inactive").Range("A2:A1002").Value = "inactive" Worksheets("Overall Flow").Range("A4:A1004").Value = Worksheets("Active").Range("A2:A1002").Value Dim i As Integer For i = 4 To 1004 If Worksheets("Overall Flow").Range("A" & Trim(Str(i))) = "" Then Worksheets("Overall Flow").Range("A" & Trim(Str(i)) & ":A" & Trim(Str(1000 + i))).Value = Worksheets("Inactive").Range("A2:A1002").Value i = 1005 End If Next End Sub 

Вы пробовали тот же код на другом компьютере?

Обновление : измененный код (теперь с проверкой ошибок!)

Основные моменты, касающиеся текущего кода:

  • При копировании диапазона ACTIVE проверьте, используется ли последняя последовательная ячейка. Это быстрее и эффективнее, чем цикл.
  • Почему вы обрезаете номер, который, как вы знаете, не будет содержать пробелы?
  • Нет необходимости устанавливать i = 1005, просто используйте Exit For . Это более эффективно и понятно для читателя, каково намерение. Я не использую это в коде ниже, так как я вообще избегал цикла.

Здесь вы можете сделать это без каких-либо циклов, которые я считаю более ясными и эффективными. Попробуйте это и посмотрите, работает ли оно для вас:

 Sub test() Dim lastRow As Long, offSet As Long lastRow = Worksheets("Active").Range("A2").End(xlDown).row 'Sanity checks If IsEmpty(Worksheets("Active").Range("A2")) = True Then offSet = 1: lastRow = 2 If lastRow > 1001 Then lastRow = 1002 Worksheets("Overall Flow").Range("A4:A" & lastRow + 2).Value = _ Worksheets("Active").Range("A2:A" & lastRow).Value If lastRow < 1002 Then Worksheets("Overall Flow").Range("A" & lastRow + (3 - offSet) & _ ":A1004").Value = Worksheets("Inactive").Range("A2:A1002").Value End If End Sub 

Примечания :

  • Проверка работоспособности 1 выполняется, если A2 пуст на активном листе.
  • Проверка работоспособности 2 соответствует, если есть ячейки за пределами A1002 со значениями в активном листе.

Это уже упоминалось в ответе транзистора1, но только как побочный комментарий.

У меня была аналогичная проблема, что код VBA просто прекратил выполнение в середине функции. Перед этим он также отскочил назад несколько строк кода. Сообщение об ошибке не было показано.

Я закрыл все открытые программы Excel, и после повторного открытия файла все снова работало нормально.

Итак, мой подтвержденный Ответ на эту проблему: « Поврежденная память», перезапустите Excel .

Edit: после этого я также столкнулся с проблемой, что редактор Visual Basic разбился, когда я попытался раскомментировать определенную строку. Поэтому я создал файл New Excel и скопировал свой код . Теперь у меня больше нет проблем.

Решение этого очень необычно.

CTRL + BREAK CTRL + BREAK CTRL + BREAK ESC

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

Это сработало для меня, надеюсь, это поможет кому-то.

У меня была эта проблема, и я отследил ее до пользовательских функций VBA, используемых в условном форматировании, которые были обработаны, в то время как application.screenupdating все еще был установлен в True.

Я не уверен, насколько совместимо это поведение, но когда пользовательская функция VBA упоминается в условном правиле форматирования, когда экран обновляется, он не будет проходить через код даже при использовании точек останова или метода debug.assert. Вот разбивка того, что произошло:

Контекст:

  • 2 открытых книги.
  • Условное форматирование и пользовательская функция, о которых идет речь, были в книге 1.
  • Код, который я пытался выполнить, был в рабочей книге2.

Обработать

  1. Я вызываю процедуру в книге2.
  2. Процедура Workbook2 достигает строки, выполняющей команду автофильтра.
  3. Команда Autofilter запускает обновление экрана во всех открытых книгах (любая команда, которая запускает событие Worksheet_Change или Worksheet_Calculate, может применяться здесь) .
  4. Обновление экрана обрабатывает условные правила форматирования, включая правило в рабочей книге1, вызывающее пользовательскую функцию рабочей книги1.
  5. Пользовательская функция запускается в «тихом» состоянии (т. Е. Без взаимодействия с пользователем, игнорируя точки останова и вызовы «debug.assert», это выглядит по дизайну как часть условного форматирования)
  6. Пользовательская функция завершает выполнение и прекращает выполнение всех других активных кодов.

Я исправил свою проблему, добавив вначале строку Application.ScreenUpdating = False, чтобы предотвратить обновление экрана и, в добавок, обработку условного формата (но лучше всего сохранить пользовательские функции от условного форматирования).

Я не уверен, что это относится к вашей ситуации вообще, но я надеюсь, что это поможет кому-то.

Interesting Posts

Попытка найти способ получить данные с другого листа

Распределите значение ячейки над столбцом ячеек

Приостановка цикла VBA для редактирования рабочего листа с использованием формы пользователя или без нее

Формула Excel для получения текста между двумя последними запятыми

Копировать значение в следующую пустую ячейку

Excel vba копирует пасту между двумя различными приложениями: сбой в коде, предупреждение в gui

Функциональность Goal Seek в PHP

Почему процесс Excel не будет закрыт во время работы приложения

VBA: функция дает «Ошибка времени выполнения» 424: Требуется объект «Ошибка при вызове

Итерирование столбцов для поиска столбца с последним отличным от нуля значением

Excel суммирует текстовое значение смежной ячейки

Как читать форматированный дисплей ячейки datetime с использованием python

Как открыть лист excel в iOS

Как использовать функцию «содержит» в макросе excel

Функция вызова / Sub в коде vba

Давайте будем гением компьютера.