Excel VBA在单元格中写入数据的速度非常慢

Excel VBA在单元格中写入数据的速度非常慢,excel,vba,performance,loops,Excel,Vba,Performance,Loops,我编写了一个非常简单的脚本,将数据写入excel单元格。 基本上,这是数组上的循环,它将数据写入特定的单元格或公式 问题是脚本的这一部分速度非常慢。 关于如何改进这一点有什么想法吗 谢谢 For j = 0 To i - 1 'Insère nouvelle ligne Rows(startRow & ":" & startRow).Select Selection.Copy Rows(startRow + 1 & ":" &

我编写了一个非常简单的脚本,将数据写入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

将数组分配给一系列单元格比分配给循环中的单个单元格更快。您可以尝试以下操作:worksheetmysheet.RangeA1:D100.Value=myArray。这是因为VBA和Excel之间的通信需要一些时间。这里有一点更详细的说明:


另外,使用单元格代替范围的速度要快2.6倍。这里有一个问题:

我把脚本切成了碎片。 这部分占用了大部分时间

    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

选择、复制和粘贴会显著降低代码的速度。显然,您应该这样做,以便复制一行,然后更改一些值。在数组的一个单独的循环中插入尽可能多的单元格如何,然后在另一个循环中填充值?我尝试了工作表mysheet.RangeA&startRow&:A&startRow+I.Value=myArray,但每个单元格都接收myArray0的值。也许您应该使用:Application.TransposeMayarray请编辑您的问题,而不是发布答案。