Когда я запускаю свой код vba, Excel переходит в режим «не отвечающий». Это нормально? есть ли способ устранить это?

Когда я нажимаю кнопку, чтобы запустить мой код, я получаю синий кружок загрузки, и если я буду ждать около 150 секунд, мой код запустится, иногда перейдя в «не отвечающий» режим, и все будет правильно выведено. Но если я нажму кнопку, чтобы запустить мой код и подождать 10, а затем щелкнуть по окну и включить его в режим «не отвечающий», мой код закончит со всем правильным выходом примерно за 30 секунд.

Option Explicit Option Base 1 Private Sub CommandButton1_Click() Dim loadtypemax As Single, column As Single, row As Single Dim loadtype As String, number As String Dim loadcombosmax As Single Application.ScreenUpdating = False Application.Calculation = xlCalculationManual loadtypemax = ((Cells(Rows.count, "L").End(xlUp).row)) loadcombosmax = ((Cells(Rows.count, "E").End(xlUp).row)) column = 6 For row = 2 To loadcombosmax If Cells(row, column) > 0 Then number = Cells(row, column) loadtype = Cells(row, (column - 2)) If number = "" Then ElseIf number > 0 Then ActiveWorkbook.Worksheets("STAADloadtypes").Cells(number, 1) = "Load" ActiveWorkbook.Worksheets("STAADloadtypes").Cells(number, 2) = ActiveWorkbook.Worksheets("Load Cases").Cells(row, column).Value ActiveWorkbook.Worksheets("STAADloadtypes").Cells(number, 4) = "Title" ActiveWorkbook.Worksheets("STAADloadtypes").Cells(number, 5) = ActiveWorkbook.Worksheets("Load Cases").Cells(row, column - 4).Value End If ElseIf Cells(row, column) = "" Then End If If Cells(row, column) > 0 Then Call LRFD(loadtype, number, loadcombosmax) End If Next row Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub Sub LRFD(loadtype As String, number As String, loadcombosmax As Single) Dim countrow As Single, countcolumn As Single, row As Single, column As Single Application.Calculation = xlCalculationManual Worksheets("STAADloadcombos").Activate countrow = ActiveWorkbook.Worksheets("LRFD").Cells(Rows.count, "A").End(xlUp).row countcolumn = (loadcombosmax - 1) * 2 For row = 1 To countrow For column = 4 To countcolumn Step 2 If loadtype = ActiveWorkbook.Worksheets("LRFD").Cells(row, column).Value Then Call STAADloadcombos(column, number, countrow, countcolumn, row) End If Next column Next row Application.Calculation = xlCalculationAutomatic End Sub Sub STAADloadcombos(column As Single, number As String, countrow As Single, countcolumn As Single, row As Single) Dim r As Integer, rowrow As Single, c As Integer Dim rr As Single Application.Calculation = xlCalculationManual r = row * 2 rowrow = r - 1 ActiveWorkbook.Worksheets("STAADloadcombos").Cells(rowrow, 3) = ActiveWorkbook.Worksheets("LRFD").Cells(row, 1).Value ActiveWorkbook.Worksheets("STAADloadcombos").Cells(rowrow, 2) = ActiveWorkbook.Worksheets("LRFD").Cells(row, 2).Value ActiveWorkbook.Worksheets("STAADloadcombos").Cells(rowrow, 1) = "Load Comb" For c = 1 To countcolumn Step 2 If ActiveWorkbook.Worksheets("STAADloadcombos").Cells(r, c) = "" Then ActiveWorkbook.Worksheets("STAADloadcombos").Cells(r, c) = number c = countcolumn End If Next c For c = 2 To countcolumn Step 2 If ActiveWorkbook.Worksheets("STAADloadcombos").Cells(r, c) = "" Then ActiveWorkbook.Worksheets("STAADloadcombos").Cells(r, c) = ActiveWorkbook.Worksheets("LRFD").Cells(row, column - 1).Value c = countcolumn End If Next c Application.Calculation = xlCalculationAutomatic End Sub Private Sub CommandButton2_Click() Worksheets("STAADloadcombos").Range("A1:BA500").ClearContents Worksheets("STAADloadtypes").Range("A1:BA500").ClearContents End Sub 

Есть ли способ очистить мой код, чтобы он работал быстрее? Я читал о командах приложения для запуска и расчета приложений и вставлял их, но они, похоже, ничего не тратили. Я положил их правильно?

Да, это нормально.

Excel и VBA являются однопоточными, что означает, что только одна команда может быть выполнена в любой момент времени. Это означает, что когда Excel занят выполнением неэффективного кода VBA, он не может реагировать на события приложения, такие как пользователь, который щелкнет где-то или активирует другой рабочий лист.

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

Однако это также сделает ваш код более медленным, DoEvents как DoEvents существу позволяет запускать другой код – и пока этот другой код работает, ваш код по сути переносится на удержание.

Более того , разрешение Excel реагировать на действия пользователя может иметь катастрофические последствия для кода, написанного против ActiveSheet (неявно или явно), потому что вы не знаете , будет ли ActiveSheet одинаковым до того, как ActiveSheet .

Переключение Application.ScreenUpdating , Application.EnableEvents и Application.Calculation off, вопреки распространенному мнению, не ускоряет ваш код . Он просто сокращает любой другой код, который может выполняться в ответ на ваши действия.

Например, всякий раз, когда вы пишете в ячейку, Excel оценивает, имеет ли эта ячейка зависимые ячейки, а затем пересчитывает эти ячейки: это отключает автоматический расчет. Excel также запускает событие Worksheet.Change на этом модифицированном рабочем листе и событие Workbook.WorksheetChange в этой книге – если код VBA обрабатывает эти события, он будет вызываться. Отключение EnableEvents предотвращает это. Excel также каждый раз реконструирует свой интерфейс: отключает ScreenUpdating . В результате ваш код действительно работает быстрее, но он не эффективнее, чем раньше.

Изменение кода для повышения эффективности будет слишком широким для этого сайта. Представьте свой код для рецензентов в Exchange Code Stack Exchange для этого.

  • Производительность OLEDB для чтения Excel
  • VBA Вложенная для эффективности цикла
  • Как повысить скорость сбережения для пользовательской формы в Excel VBA
  • Excel vba: производительность программы медленная, из-за ошибки памяти при работе с большим набором данных в коллекции
  • Как ускорить этот код, чтобы найти и удалить строки, если найдена подстрока
  • Какой метод итерации, считывающий значения Excel, будет более результативным?
  • Проблемы с производительностью Excel VBA, сравнивающие удаление строк и столбцов
  • Ускорить объединение файлов Excel с помощью Pandas
  • Excel VBA - постепенно замедляется, когда массивы выгружаются в таблицу Word
  • Excel Get & Transform (Power Query) M Стиль и производительность кода
  • java: ByteArrayOutputStream.toByteArray ()
  • Давайте будем гением компьютера.