VBA:在后台计算工作表,同时消息用户窗体处于事件状态

标签 vba excel userform

我在vba中编写了一个循环程序,每次都会将大量数据粘贴到新的工作表中。实际上它粘贴了计算出来的公式。完成所有计算大约需要 40 秒。不幸的是,下一个循环不会等待 40 秒,而是在下一张表中填充数据。这需要很多资源。为了让一个循环等待一点,但仍然要执行计算,我使用了 userform,它出现了 40 秒,然后它将被卸载并在下一个循环中使用。用户表单的目的是允许在下一张表中的计算开始之前完成计算。这种策略有一个缺点,因为当用户表单处于事件状态时,后台的计算会卡住。可以将 useform 的选项更改为 showmodal false,但是每次新循环开始时我都无法上传和卸载它。此外,我不确定是否会在非事件工作表中计算公式。我不得不提一下,每次激活一个 excel 加载项时,工作表中的公式都无法进行加载以等待计算,即使选项手动计算已打开。

如果有人知道如何推迟循环但不让完整的 excel 应用程序等待(Application.wait 或 ontime 方法不起作用),我将非常感谢您的帮助。我还尝试激活和停用事件,切换到手动计算并返回。这也无济于事,所有数据都是一次计算的。

另一篇文章中描述的方法对我不起作用,所有公式仍然同时计算:

Application.Calculate
 If Not Application.CalculationState = xlDone Then
 DoEvents
 End If

我将公式复制到新工作表的原始代码:
For raw_i = 1 To 3

Set o = GetObject("d:\formulas.xlsx")
Set Sheet_i = Worksheets.Add(after:=Worksheets(Worksheets.Count))
Sheet_i.Cells(1, 1).Formula = o.Worksheets("Sheet1").Cells(raw_i, 1).Formula
Set o = Nothing
LoadForm    
next raw_i 

最佳答案

VBA 不支持多进程线程 - 有一个执行路线,如果您暂停它,那么您暂停整个执行。要么全有,要么全无。

最好的希望是 While环形:

While Application.CalculationState <> xlDone
    DoEvents
Wend

它将循环直到计算完成。

回应您最近的编辑:

尝试将主循环更改为:
For raw_i = 1 To 3
    Set o = GetObject("d:\formulas.xlsx")
    Set Sheet_i = Worksheets.Add(after:=Worksheets(Worksheets.Count))
    Sheet_i.Cells(1, 1).Formula = o.Worksheets("Sheet1").Cells(raw_i, 1).Formula
    Sheet_i.Calculate
    DoEvents
    Set o = Nothing
Next

关于VBA:在后台计算工作表,同时消息用户窗体处于事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088885/

相关文章:

excel - 如果行数和列数不断变化,是否有更快的方法将单元格值从一张表复制到另一张表

Excel IF 语句,有 3 个条件 if a=true and b=true and c=true then d1 = ""

vba - 使用VBA : Assign value to label control on userform

vba - 如何在选择后粘贴形状

Excel 2010+ VBA - 如何搜索范围的公式而不是值

events - MS Access 2007 表单加载事件未触发

excel - 从excel vba用户表单组合框中选定行的列中提取数据

excel - 比较 Excel VBA 中的两列(大于/小于或等于)

python - 如何让 python 等到 Excel 宏/刷新完成

excel - VBA-MouseMove 打开和关闭另一个用户窗体