运行过夜后Excel VBA宏没有响应

时间:2016-01-08 13:51:14

标签: excel-vba loops vba excel

我在excel中构建了一个随机数生成器,它输出到工作簿中另一个工作表中的另一列。该宏在A1,000,000单位处被截止。当我在工作期间全天运行时,我可以接近200,000行输出。当我跑过夜而早上回来时,它被冷冻(没有回应),我认为这意味着它只是在击中切断之前自行冷冻。

我看了一些其他帖子,但他们并没有完全回答我的问题 (Excel Not Responding During Macro) (Excel not responding after running macro)。

有什么方法可以让它从Not Responding中解脱出来,只是禁用宏并查看输出?

为什么会这样?

这是我的代码:

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 个答案:

答案 0 :(得分:3)

在VBA中几乎不需要

Select。例如,两行

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的其他用途。在宏运行时进行这些更改并关闭屏幕更新应该有很大帮助(无论是否有足够的帮助都很难说,因为不清楚你实际在做什么)。