公式计算太慢了

时间:2018-03-06 14:46:17

标签: excel vba excel-vba copying

我想写一个Excel宏:我有一些带有起始值的计算。有超过100个不同的起始编号,我想自动复制正确单元格中的起始值,其他一些单元格具有读取此值并使用它的公式。这些公式化器从网络(afaik)获取一些数据,在其他一些工作表中进行计算,并且计算需要几秒钟。我工作的纸张中的单元格只是链接到其他纸张中的其他单元格,因此公式不直接位于“工作表”中(表单#1)。我不知道这些公式究竟做了什么,它们不是来自我。 对于每个起始号码,我想将结果复制到另一张表格中。

Private Sub CommandButton1_Click()
Application.Calculation = xlCalculationManual

For i = 2 To Sheets(2).Range("A1048576").End(xlUp).Row
    Sheets(1).Cells(5, 3).Value = Sheets(2).Cells(i, 3).Value

    Application.CalculateFull

    Sheets(2).Cells(i, 4).Value = Sheets(1).Cells(7, 3).Value
    Sheets(2).Cells(i, 5).Value = Sheets(1).Cells(8, 3).Value
    Sheets(2).Cells(i, 6).Value = Sheets(1).Cells(9, 3).Value
    Sheets(2).Cells(i, 7).Value = Sheets(1).Cells(10, 3).Value
    Sheets(2).Cells(i, 8).Value = Sheets(1).Cells(11, 3).Value
    Sheets(2).Cells(i, 9).Value = Sheets(1).Cells(12, 3).Value
    Sheets(2).Cells(i, 10).Value = Sheets(1).Cells(15, 3).Value
    Sheets(2).Cells(i, 11).Value = Sheets(1).Cells(16, 3).Value
Next i

Application.Calculation = xlCalculationAutomatic

i = 0
End Sub

因此,我将Sheet(2)的起始编号(C列)复制到Sheet(1)的Cell(C5)中。当更改Sheet(1)中的单元格(C5)的值时,将重新计算Sheet(1).Range(C7:C16)中的值。 我将新计算的值复制回Sheet(2),然后将其复制到正确的起始编号的行中。所以Sheet(1).Range(C7:C16)(两个值除外)在Sheet(2)中.Range(Di:Ki)( i ,起始编号的索引)。 这个循环用于每个起始编号。

所以范围(C7:C16)保持结果。我的问题是,宏不等待计算完成。范围内的所有单元格(Di:Ki)都得到相同的值(在我启动宏之前,范围(C7:C16)中的值)。

我尝试了不同的方式,如 Application.CalculateFull 所示,

 Do Until Application.CalculationState = xlDone
        DoEvents
    Loop

以及 Worksheet_Calculate()子。我还尝试了 Worksheet_Change(),但它没有获取公式计算。

当我使用基本添加等简单公式时,它确实有效: 例如。 Sheet(1)的公式.C7是C5 + 1(起始编号+ 1),我将在Sheet(2)中获取

Starting Number - Result from Sheet(1).C7
1 - 2
2 - 3
3 - 4 

也许有人可以帮助我?提前谢谢!

2 个答案:

答案 0 :(得分:0)

尝试使用这些花哨的技巧强制屏幕更新

  • ActiveSheet.Calculate
  • ActiveWindow.SmallScroll
  • Application.WindowState = Application.WindowState

借用

Force a screen update in Excel VBA

答案 1 :(得分:0)

如果我理解你的问题,那么我相信以下内容会按照您的预期进行,它将从C列中的Sheets(2)获取值,并将该值传递给Sheets(1)单元格C5,这将使你的公式做了一些计算,然后它将从C7:C16中取出值,并将它们放入表格D中的列表D到表格M中的初始值所在的同一行:

Private Sub CommandButton1_Click()
Dim i As Long
Application.Calculation = xlCalculationAutomatic
    For i = 2 To Sheets(2).Cells(Sheets(2).Rows.Count, "A").End(xlUp).Row
    'loop from row 2 to last on Sheets(2)
        Sheets(1).Cells(5, 3).Value = Sheets(2).Cells(i, 3).Value
        'add value from column C Sheets(2) to C5 of Sheets(1) for the formula calculations to take place
        Sheets(2).Cells(i, 4).Value = Sheets(1).Range("C7").Value
        'get the value from C7 and pass it to the relevant row in Sheets(2) on column D
        Sheets(2).Cells(i, 5).Value = Sheets(1).Range("C8").Value
        'get the value from C8 and pass it to the relevant row in Sheets(2) on column E
        Sheets(2).Cells(i, 6).Value = Sheets(1).Range("C9").Value
        'get the value from C9 and pass it to the relevant row in Sheets(2) on column F, and etc below
        Sheets(2).Cells(i, 7).Value = Sheets(1).Range("C10").Value
        Sheets(2).Cells(i, 8).Value = Sheets(1).Range("C11").Value
        Sheets(2).Cells(i, 9).Value = Sheets(1).Range("C12").Value
        Sheets(2).Cells(i, 10).Value = Sheets(1).Range("C13").Value
        Sheets(2).Cells(i, 11).Value = Sheets(1).Range("C14").Value
        Sheets(2).Cells(i, 12).Value = Sheets(1).Range("C15").Value
        Sheets(2).Cells(i, 13).Value = Sheets(1).Range("C16").Value
    Next i
End Sub

注意:

我删除了行Application.Calculation = xlCalculationManual,因为这会导致您的公式在将其更改回Application.Calculation = xlCalculationAutomatic之前不会计算任何内容。如果这不起作用,那么可能值得研究实际公式的作用,因为我已经对此进行了测试并且它符合您的预期。