当我点击按钮运行我的代码,我得到蓝色加载循环,如果我等待大约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
有什么方法可以让我的代码运行得更快吗?我读到了有关屏幕更新和计算应用程序命令的内容,并将它们放入其中,但它们似乎并没有花费任何精力。我把它们放正确了吗?
发布于 2017-10-25 14:10:05
是的,这很正常。
Excel和VBA是单线程的,这意味着任何时候只能执行一条指令.这意味着当Excel忙于执行效率低下的VBA代码时,它无法响应应用程序事件,例如用户单击某个位置或激活另一个工作表。
您可以在代码中的策略位置添加DoEvents
调用,以便让Excel有机会为其他事件执行处理程序;您的代码将在下一条指令中恢复,Excel将显示更多响应。
--然而,--它也会使您的代码执行得更慢,因为DoEvents
本质上允许其他代码运行--而当其他代码正在运行时,您的代码基本上被搁置了。
此外,允许响应用户操作会对针对ActiveSheet
(隐式或显式)编写的代码产生灾难性的后果--因为您不知道在DoEvents
返回之前ActiveSheet
是否会是相同的。
与人们普遍的看法相反,Application.ScreenUpdating
、Application.EnableEvents
和Application.Calculation
的切换,并没有加快 your code的速度。它只是削减任何其他代码可以执行的响应您的行动。
例如,每当您写入单元格中时,Excel都会计算该单元格是否有依赖的单元格,然后重新计算这些单元格:关闭自动计算会防止这种情况发生。Excel还会在修改后的工作表上触发一个Worksheet.Change
事件,并在该工作簿上触发一个Workbook.WorksheetChange
事件--如果有处理这些事件的VBA代码,它将被调用。关闭EnableEvents
可以防止这种情况发生。Excel每次都会重新绘制UI :关闭ScreenUpdating
可以防止这种情况发生。最终的结果是您的代码确实完成得更快,但是它并没有比以前更高效。
更改代码以提高效率对此站点来说太宽泛了。为此,请在Code Review Stack Exchange上向审阅者展示您的代码。
发布于 2021-05-17 23:43:14
我在Application.ScreenUpdating、Application.EnableEvents、Application.Calculation、DoEvents和Application.Wait (现在+TimeValue(“0:00:10”)中被试过,不幸的是,持续的选项无法解决这个问题,看看微软WebPage,如果一个程序说me “没有响应”是
因此,在我的例子中,我尝试向用户展示和MsgBox,并最终为Win10操作系统和客户提供一个FeedBack,但是非常无聊,以至于用户单击“是”、“确定”、“确定”并在其他论坛上查看VBA for MsgBox (自动关闭),他们建议我编写CreateObject("WScript.Shell").PopUp "Please Wait", 1
和tada!我将停止看到“没有响应的消息”,如果用户不按任何点击或按钮禁用消息,不要担心程序在消息关闭后1秒后执行,在我的情况下,这解决了我的许多问题,我希望能帮助你,好运气。
https://stackoverflow.com/questions/46934151
复制相似问题