当我运行我的vba代码时,Excel进入“无响应”模式。 这个可以吗? 有没有办法消除这个?

当我点击button来运行我的代码,我得到了蓝色的加载循环,如果我等待大约150s我的代码将运行,有时进入“无响应”模式,并且一切都输出正确。 但是,如果我点击button来启动我的代码,然后等待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本质上允许其他代码运行 – 而其他代码正在运行, 你的代码基本上被搁置了。

而且 ,允许Excel响应用户操作可能会对写入ActiveSheet代码(隐式或显式)产生灾难性后果 – 因为您不知道DoEvents返回之前ActiveSheet是否相同。

切换Application.ScreenUpdatingApplication.EnableEventsApplication.Calculationclosures,与stream行的看法相反, 不会加速您的代码 。 它只是削减任何其他代码可以执行的回应你的行动。

例如,无论何时写入单元格,Excel都会评估该单元格是否具有相关单元格,然后重新计算这些单元格:closures自动计算可以防止这种情况。 Excel还会在该修改的工作表上触发一个Worksheet.Change事件,并在该工作簿上触发一个Workbook.WorksheetChange事件 – 如果有VBA代码处理这些事件,则会调用该事件。 closuresEnableEvents可以防止这种情况发生。 Excel每次都会重新绘制UI:closuresScreenUpdating可以防止这种情况发生。 最终的结果是你的代码确实完成得更快,但是效率不如以前。

改变你的代码效率会比较高,对于这个网站来说太宽泛了。 将代码呈现给Code Review Stack Exchange上的审阅者。