使用VBA复制和粘贴格式很慢。 我怎样才能加快速度?

下面的代码是一个有效的function。 这只是慢,我不知道如何加快速度。 它需要一个excel行号和它的headerval(string)的值,并find相同的headerval在不同的工作表上,然后复制格式并将其应用到我们的新工作表。 真正的错误是因为源表格有两个不同的格式选项。 它在行中传递,使用23或24. ZROW是一个公共variables,设置与ROW开始寻找。 srccolbyname函数从具有相同标题的源表中获取一个列号

Function formatrow(roww As Long, header As Boolean) Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Dim headerval As String Dim sht As Worksheet Set sht = ThisWorkbook.Sheets("DEALSHEET") Dim sht2 As Worksheet Set sht2 = ThisWorkbook.Sheets("Sheet1") If header = True Then: srcrow = 23: Else: srcrow = 24 LastColumn = sht.Cells(ZROW + 1, sht.Columns.Count).End(xlToLeft).Column For x = 2 To LastColumn headerval = sht.Cells(ZROW + 1, x).Value srccol = srccolbyname(headerval) sht2.Cells(srcrow, srccol).Copy 'THIS IS SLOW sht.Cells(roww, x).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Next x Application.Calculation = xlCalculationManual Application.ScreenUpdating = False End Function 

这里要求的是上面提到的支持function。

 Public Function srccolbyname(strng_name As String) As Integer Call findcol 'find ZROW Dim x As Integer Dim sht As Worksheet Set sht = ThisWorkbook.Sheets("Sheet1") LastColumn = sht.Cells(22, sht.Columns.Count).End(xlToLeft).Column For x = 2 To LastColumn chkval = sht.Cells(22, x).Value If Trim(UCase(chkval)) = Trim(UCase(strng_name)) Then srccolbyname = x Exit For Else srccolbyname = 2 End If Next x End Function 

有很多方法可以使你的代码更快,但是你会发现特别的复制和粘贴特别慢。 假设您需要保存的格式只是单元格的值,背景颜色和字体颜色,您可以尝试replace

  sht2.Cells(srcrow, srccol).Copy sht.Cells(roww, x).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False 

有了这个:

  sht2.Cells(srcrow,srcol).Value=sht.Cells(roww,x).Value sht2.Cells(srcrow,srcol).Interior.ColorIndex=sht.Cells(roww,x).Interior.ColorIndex sht2.Cells(srcrow,srcol).Font.ColorIndex=sht.Cells(roww,x).Font.ColorIndex 

你会发现在Stack Overflow之前,人们已经看到了这个问题: 在Excel中快速复制格式

如果你的性能问题仍然存在,我会考虑用range.find方法replace你的用户定义的函数srccolbyname (请参阅这里的更多信息: https : range.find 。 aspx )。 在我看来,这个内置方法正在发挥相同的作用。 通常,这些内置的方法将比UDF运行得更快。

一般来说,如果可能的话,最好引用一个范围(即单元格集合)而不是单个单元格。 通过逐个粘贴范围而不是单元格,可以最大限度地减lessExcel和VBA之间的stream量(即来回切换),这通常会影响性能。