Я построил генератор случайных чисел в excel, который выводит на другой столбец на другом листе в книге. Макрос отключен в ячейке A1000000. Когда я запускаю его в течение дня, пока я работаю, я могу получить около 200 000 строк. Когда я запускаю его за ночь и возвращаюсь утром, он застывает (не реагирует), что, я думаю, означает, что он просто замерз, прежде чем нанести удар.Excel VBA Macro не отвечает после работы за ночь
Я посмотрел на некоторые другие должности, но они не вполне отвечают на мои вопросы (Excel Not Responding During Macro) (Excel not responding after running macro).
Есть ли какой-либо способ, я могу получить его из Не реагировать и просто отключить макрос и посмотреть на выход?
Почему это происходит?
Вот мой код:
Sub Macro2()
'
' Macro2 Macro
'
' Keyboard Shortcut: Ctrl+q
'
Do
Do
Do
Range("H12").Select
Range("H12").ClearContents
Loop Until Range("K10") = "MATCH" And Range("K11") = "GOOD"
Range("H2:H8").Select
Selection.Copy
Range("P1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("P1:P5").Select
Application.CutCopyMode = False
ActiveWorkbook.Worksheets("NUMBER GENERATOR").sort.SortFields.Clear
ActiveWorkbook.Worksheets("NUMBER GENERATOR").sort.SortFields.Add Key:=Range(_
"P1:P5"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("NUMBER GENERATOR").sort
.SetRange Range("P1:P5")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Loop Until Range("P11") = "GOOD" And Range("P12") = 1
Range("P9").Select
Selection.Copy
Sheets("Sheet1").Select
Sheets("Sheet1").Range("A1").Select
Range("A" & Rows.Count).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, Transpose:=False
Sheets("NUMBER GENERATOR").Select
Range("H12").Select
Loop Until Sheets("Sheet1").Range("A1000000") <> ""
End Sub
1 место для начала - добавить 'Application.ScreenUpdating = False' в начало, работать непосредственно с объектом (удалить операторы' .Select'), например 'Range (« H2: H8 »). Назначение копирования: = Range («P1») и «Range» («P9»). Назначение копирования: = Листы («Лист1»). Диапазон («A» и «Таблицы» («Лист1»). Строки. Count) .End (xlUp). Offset (1) ', а также квалифицировать все диапазоны с определенным листом. В некоторых случаях вы это делаете. Это может помочь избежать использования ресурсов, которые могут вызвать его замораживание. –
В целях отладки вы можете поддерживать переменную счетчика и иметь строку типа «Если счетчик Mod 1000 = 0 Then DoEvents» во внутреннем цикле, чтобы он ответил на разрыв в редакторе VBA. Но, если вам нужно потратить несколько часов на обработку миллиона строк, вам, вероятно, понадобится другой подход, который не будет использовать так много. –
Другим предложением, которое может помочь, является установка 'Application.Calculation = xlCalculationManual', тогда только поместите опцию' calculate' в конкретные строки, где вам нужны данные для пересчета. Это немного догадка, поскольку я думаю, что знаю, что вы делаете, но я не уверен на 100%. –