以下代码是一个有效的功能。它只是很慢,我不知道如何加快速度。它需要一个excel行号和它的headerval(字符串)的值,并在不同的工作表上找到相同的标题,然后复制格式并将其应用于我们的新工作表。真正的错误是因为源表有2种不同的格式选项。它在行中传递使用23或24. ZROW是一个公共变量,它设置为ROW开始查看。 srccolbyname函数从源表中获取具有相同headerval
的列号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
这里要求的是上面提到的支持功能。
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
答案 0 :(得分:4)
有许多方法可以让您的代码更快,但您会发现特别是特殊的复制和粘贴速度非常慢。如果您需要保留的格式只是单元格值,背景颜色和字体颜色,您可以尝试替换
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上查看了这个问题:fast way to copy formatting in excel
如果您的性能问题仍然存在,我会考虑用srccolbyname
方法替换您的用户定义函数range.find
(请参阅此处了解更多信息:https://msdn.microsoft.com/en-us/library/office/ff839746.aspx)。在我看来,它扮演的角色与这种内置方法相同。通常,这些内置方法的运行速度比UDF快。
一般来说,如果可能的话,最好是指一个范围(即一组细胞)而不是单独的细胞。通过逐个复制粘贴范围而不是单元格,可以最大限度地减少Excel和VBA之间的流量(即来回切换),这通常会妨碍性能。