为什么UserForm在VBA Excel中的运行时"无响应"?

Tim*_*RIM 7 excel vba excel-vba userform

我是VBA Excel的新手,我只知道这个报告格式化任务需要的东西.

我差不多完成了我的任务但是当我运行程序并开始进度时,尽管它成功运行,但GUI没有响应一分钟.我在这里分享我的代码,它有什么问题吗?你能建议我做最好的练习吗?我不希望它冻结,因为它对我的经理来说会很糟糕.

只是为了说清楚,通过"不响应"我的意思是它在屏幕上冻结并在它的窗口框架上显示"Not Responding",当我点击它时,它会给出如下信息:

在此输入图像描述

*ps:我获得记录的工作表有20997行和7列,我在同一文件大小和20997行23列上的另一张纸上做了一些记录.我的GUI非常简单,它只有一个启动进度的CommandButton.

我怎样才能解决这个问题?

小智 20

您可以通过放置来防止冻结excel窗口

DoEvents
Run Code Online (Sandbox Code Playgroud)

在你的循环中.

  • 这是最好的解决方案,您实际上需要允许应用程序处理常规事件(如点击,窗口拖动,重绘屏幕等),因此,由于您的代码工作密集,并且不会不时休息或放弃控制,应用程序几乎没有CPU时间来处理这个事件,所以我最好的做法是找到所有'Next'和'Loop'语句并在它们之前写一行'DoEvents',这样我就可以保证每个循环如果有一些事件,则循环将允许应用程序处理事件 (2认同)

Tim*_*RIM 0

好吧,我相信我找到了最好的解决方案。(A) :)

我没有在 TheLoop 子例程中使用 for 循环,而是删除了循环并将其更改如下。当我将它与我的第一个代码进行比较时,尽管我没有禁用事件属性,但现在它并没有冻结,这使得它变得非常快。

Sub TheLoop()

    Cells(2, 1).Resize(20996) = "Defect"
    Cells(2, 3).Resize(20996) = "New Defect"
    Cells(2, 4).Resize(20996) = "3"
    Cells(2, 5).Resize(20996) = "2"
    Cells(2, 7).Resize(20996) = "Name Surname"
    Cells(2, 8).Resize(20996) = "Name Surname"
    Cells(2, 9).Resize(20996) = "FALSE"


    Cells(2, 10).Resize(20996) = " http://SERVER_NAME:8888/PROJECT_NAME/ "


    Cells(2, 12).Resize(20996) = "Software Quality"
    Cells(2, 13).Resize(20996) = "Unsigned"
    Cells(2, 14).Resize(20996) = "Software Quality"
    Cells(2, 15).Resize(20996) = "1"
    Cells(2, 16).Resize(20996) = "Name Surname"
    Cells(2, 18).Resize(20996) = "Software Quality"
    Cells(2, 20).Resize(20996) = "Development"
    Cells(2, 22).Resize(20996) = " TYPE YOUR MODULE'S NAME TO HERE"

End Sub
Run Code Online (Sandbox Code Playgroud)