首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我运行我的vba代码时,Excel进入“不响应”模式。这样可以吗?有办法消除这种情况吗?

当我运行我的vba代码时,Excel进入“不响应”模式。这样可以吗?有办法消除这种情况吗?
EN

Stack Overflow用户
提问于 2017-10-25 13:46:17
回答 2查看 10.1K关注 0票数 1

当我点击按钮运行我的代码,我得到蓝色加载循环,如果我等待大约150,我的代码将运行,有时进入“不响应”模式,一切都是正确的输出。但是,如果我单击按钮启动我的代码,等待10,然后单击窗口并强制它进入“不响应”模式,我的代码将在大约30分钟内完成所有正确的输出。

代码语言:javascript
运行
复制
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

有什么方法可以让我的代码运行得更快吗?我读到了有关屏幕更新和计算应用程序命令的内容,并将它们放入其中,但它们似乎并没有花费任何精力。我把它们放正确了吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-25 14:10:05

是的,这很正常。

Excel和VBA是单线程的,这意味着任何时候只能执行一条指令.这意味着当Excel忙于执行效率低下的VBA代码时,它无法响应应用程序事件,例如用户单击某个位置或激活另一个工作表。

您可以在代码中的策略位置添加DoEvents调用,以便让Excel有机会为其他事件执行处理程序;您的代码将在下一条指令中恢复,Excel将显示更多响应。

--然而,--它也会使您的代码执行得更慢,因为DoEvents本质上允许其他代码运行--而当其他代码正在运行时,您的代码基本上被搁置了。

此外,允许响应用户操作会对针对ActiveSheet (隐式或显式)编写的代码产生灾难性的后果--因为您不知道在DoEvents返回之前ActiveSheet是否会是相同的。

与人们普遍的看法相反,Application.ScreenUpdatingApplication.EnableEventsApplication.Calculation的切换,并没有加快 your code的速度。它只是削减任何其他代码可以执行的响应您的行动。

例如,每当您写入单元格中时,Excel都会计算该单元格是否有依赖的单元格,然后重新计算这些单元格:关闭自动计算会防止这种情况发生。Excel还会在修改后的工作表上触发一个Worksheet.Change事件,并在该工作簿上触发一个Workbook.WorksheetChange事件--如果有处理这些事件的VBA代码,它将被调用。关闭EnableEvents可以防止这种情况发生。Excel每次都会重新绘制UI :关闭ScreenUpdating可以防止这种情况发生。最终的结果是您的代码确实完成得更快,但是它并没有比以前更高效。

更改代码以提高效率对此站点来说太宽泛了。为此,请在Code Review Stack Exchange上向审阅者展示您的代码。

票数 4
EN

Stack Overflow用户

发布于 2021-05-17 23:43:14

我在Application.ScreenUpdating、Application.EnableEvents、Application.Calculation、DoEvents和Application.Wait (现在+TimeValue(“0:00:10”)中被试过,不幸的是,持续的选项无法解决这个问题,看看微软WebPage,如果一个程序说me “没有响应”

  1. 出于安全原因
  2. 因为太重或太复杂
  3. 因为程序没有向用户发送任何FeedBack。

因此,在我的例子中,我尝试向用户展示和MsgBox,并最终为Win10操作系统和客户提供一个FeedBack,但是非常无聊,以至于用户单击“是”、“确定”、“确定”并在其他论坛上查看VBA for MsgBox (自动关闭),他们建议我编写CreateObject("WScript.Shell").PopUp "Please Wait", 1和tada!我将停止看到“没有响应的消息”,如果用户不按任何点击或按钮禁用消息,不要担心程序在消息关闭后1秒后执行,在我的情况下,这解决了我的许多问题,我希望能帮助你,好运气。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46934151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档