【问题标题】:VBA to write data in cells very slowVBA在单元格中写入数据非常慢
【发布时间】:2018-10-12 05:19:49
【问题描述】:

我编写了一个非常简单的脚本,可以将数据写入 Excel 单元格。 基本上,这是一个数组循环,它将数据写入特定的单元格或公式。

问题是这部分脚本非常慢。 关于如何改善这一点的任何想法?

谢谢。

    For j = 0 To i - 1
    'Insère nouvelle ligne
    Rows(startRow & ":" & startRow).Select
    Selection.Copy
    Rows(startRow + 1 & ":" & startRow + 1).Select
    Selection.Insert Shift:=xlDown

    'Insère données
    If roomType(j) <> "" Then
        Feuil3.Cells(startRow, 1).Value = roomName(j)
        Feuil3.Cells(startRow, 2).Value = roomSurface(j)
        Feuil3.Cells(startRow, 7).Value = roomPeople(j)
        Feuil3.Cells(startRow, 12).Value = roomPeople(j)
        Feuil3.Cells(startRow, 5).Value = dict.Item(roomType(j))
        Feuil3.Cells(startRow, 3).Value = roomHeight(j)

        Feuil3.Range("F" & startRow).Formula = "=IFERROR(IF($E" & startRow & "=Data!$A$55,,ROUNDUP($B" & startRow & "/VLOOKUP($E" & startRow & ",Data!$A$3:$E$55,4,FALSE),0)),)"
        Feuil3.Range("H" & startRow).Formula = "=$C$25"
        Feuil3.Range("I" & startRow).Formula = "=IF($E" & startRow & "=Data!$A$55,$B" & startRow & "*$E$55,(MAX(F" & startRow & ",G" & startRow & ")*H" & startRow & "))"
        Feuil3.Range("N" & startRow).Formula = "=IFERROR(VLOOKUP($K" & startRow & ",$M$22:$O$26,3,FALSE),)"
        Feuil3.Range("O" & startRow).Formula = "=IFERROR(IF(ISBLANK(M" & startRow & ")=TRUE,L" & startRow & "*N" & startRow & ",L" & startRow & "*M" & startRow & "*N" & startRow & "),)"
        Feuil3.Range("Q" & startRow).Formula = "=MAX(I" & startRow & ",O" & startRow & ")"
        Feuil3.Range("T" & startRow).Formula = "=IFERROR(MAX(R" & startRow & ",S" & startRow & ")/(B" & startRow & "*C" & startRow & "),)"
    End If

    startRow = startRow + 1
Next j
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

【问题讨论】:

  • 选择、复制和粘贴会显着降低代码速度。很明显,您应该这样做是为了复制一行然后更改一些值。如何在数组的单独循环中插入尽可能多的单元格 ubound(不是为每个循环插入一行),然后在另一个循环中填充值?

标签: excel vba performance loops


【解决方案1】:

我把剧本切成小块。 这部分占用大部分时间

    For j = 0 To i - 2
    Feuil3.Cells(startRow, 5).Value = dict.Item(roomType(j))
    Feuil3.Cells(startRow, 6).Formula = "=IFERROR(IF($E" & startRow & "=Data!$A$55,,ROUNDUP($B" & startRow & "/VLOOKUP($E" & startRow & ",Data!$A$3:$E$55,4,FALSE),0)),)"
    Feuil3.Cells(startRow, 8).Formula = "=$C$25"
    Feuil3.Cells(startRow, 9).Formula = "=IF($E" & startRow & "=Data!$A$55,$B" & startRow & "*$E$55,(MAX(F" & startRow & ",G" & startRow & ")*H" & startRow & "))"
    Feuil3.Cells(startRow, 14).Formula = "=IFERROR(VLOOKUP($K" & startRow & ",$M$22:$O$26,3,FALSE),)"
    Feuil3.Cells(startRow, 15).Formula = "=IFERROR(IF(ISBLANK(M" & startRow & ")=TRUE,L" & startRow & "*N" & startRow & ",L" & startRow & "*M" & startRow & "*N" & startRow & "),)"
    Feuil3.Cells(startRow, 17).Formula = "=MAX(I" & startRow & ",O" & startRow & ")"
    Feuil3.Cells(startRow, 20).Formula = "=IFERROR(MAX(R" & startRow & ",S" & startRow & ")/(B" & startRow & "*C" & startRow & "),)"

    startRow = startRow + 1
Next j

【讨论】:

  • 请编辑您的问题,而不是发布答案。
【解决方案2】:

将数组分配给一系列单元格比分配给循环中的单个单元格要快。您可以尝试类似:Worksheets("MySheet").Range("A1:D100").Value = myArray。这是因为 VBA 和 Excel 之间的通信需要一些时间。更多内容:VBA Excel large data manipulation taking forever

同时使用Cells 代替Range 大约快2.6 倍。这是一个问题:Range() VS Cells() - run times

【讨论】:

  • 我试过 Worksheets("mySheet").Range("A" & startRow & ":A" & startRow + i).Value = myArray 但每个单元格都会收到 myArray(0) 的值。
  • 也许你应该使用:Application.Transpose(myArray)
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 2016-11-04
  • 2014-09-26
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多