2016-01-08 6 views
2

Я построил генератор случайных чисел в 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

1 место для начала - добавить 'Application.ScreenUpdating = False' в начало, работать непосредственно с объектом (удалить операторы' .Select'), например 'Range (« H2: H8 »). Назначение копирования: = Range («P1») и «Range» («P9»). Назначение копирования: = Листы («Лист1»). Диапазон («A» и «Таблицы» («Лист1»). Строки. Count) .End (xlUp). Offset (1) ', а также квалифицировать все диапазоны с определенным листом. В некоторых случаях вы это делаете. Это может помочь избежать использования ресурсов, которые могут вызвать его замораживание. –

+1

В целях отладки вы можете поддерживать переменную счетчика и иметь строку типа «Если счетчик Mod 1000 = 0 Then DoEvents» во внутреннем цикле, чтобы он ответил на разрыв в редакторе VBA. Но, если вам нужно потратить несколько часов на обработку миллиона строк, вам, вероятно, понадобится другой подход, который не будет использовать так много. –

+1

Другим предложением, которое может помочь, является установка 'Application.Calculation = xlCalculationManual', тогда только поместите опцию' calculate' в конкретные строки, где вам нужны данные для пересчета. Это немного догадка, поскольку я думаю, что знаю, что вы делаете, но я не уверен на 100%. –

ответ

3

Select практически не требуется в VBA. Например, две линии

Range("H12").Select 
Range("H12").ClearContents 

можно заменить просто:

Range("H12").ClearContents 

Что еще более важно, 7 линий

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 

могут быть заменены одной строкой

Range("P1:P7").Value = Range("H2:H8").Value 

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

+0

TY Sir! Я дам вам знать результат, если хорошо, я отмечу это как ответ. – plankton