最有效的方法来添加格式化Excel – VBA

我有一个macros,将数百行数据添加到Excel电子表格。 我从插入每行数据的循环中调用一个过程。 每次插入数据时,我一直在应用该行的格式。 然而,在我的testing过程中,我发现当我不是一次一行地应用格式化的时候,我可以插入所有的数据大约3/4秒(3.3秒vs. 4.11秒)。 我试图克服的问题是不是每行都有相同的格式。 然而,有一个可预测的模式。 两行一格式和一行不同格式。 有没有循环的方式来应用这两种不同的格式,使我能够保持我得到的性能增益(用户希望看到一个2秒的回应,这可能是一个巨大的收益)。

我目前使用下面的代码(应用程序设置,如screenupdating,计算和事件都在这个过程中closures)

Private Sub BuildTerminalSummary(ByRef terminals, ByVal timeFrame) Dim terminal As clsTerminal Dim curSheet As Worksheet Dim breakLoop As Boolean Dim terminalCode As String Dim rowNumber As Long Set terminal = New clsTerminal Set curSheet = Sheets("Terminal Summary") rowNumber = 7 'Remove all content, borders, and tint ClearPage curSheet, rowNumber For Each terminal In terminals AddDetailData curSheet, terminal.InfoArray, rowNumber AddDetailData curSheet, terminal.PriorInfoArray, rowNumber + 1 AddDiffPercentFormulas curSheet, terminal.DiffPercentInfoArray, rowNumber + 2 rowNumber = rowNumber + 2 Next terminal 'Make sure the columns are wide enough to display the numbers curSheet.Cells.EntireColumn.AutoFit End Sub Private Sub AddDetailData(ByRef curSheet, ByRef data, ByVal rowNumber) With curSheet With .Cells(rowNumber, 3).Resize(1, 16) .value = data .Style = "Comma" .NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""??_);_(@_)" End With 'This overides the formatting in the revenue columns with currency instead of comma style With .Cells(rowNumber, 5).Resize(1, 2) .Style = "Currency" .NumberFormat = "_($* #,##0_);_($* (#,##0);_($* ""-""??_);_(@_)" End With With .Cells(rowNumber, 13).Resize(1, 6) .Style = "Currency" End With End With End Sub Private Sub AddDiffPercentFormulas(ByRef curSheet, ByRef data, ByVal rowNumber) With curSheet.Cells(rowNumber, 3).Resize(1, 16) .value = data .NumberFormat = "0.00%" End With End Sub 

您有两种格式,一种格式为2行,另一种格式为1行格式。 我打这个2row和1row格式。

您可以将2cell格式应用于整个列/整个数据区域,然后仅通过1cell格式进行循环。

如果您想避免使用复制/粘贴,可以使用“自动填充”对范围应用格式化。

 Range("A1:F3").AutoFill Destination:=Range("A1:F21"), Type:=xlFillFormats 

注意:源范围(“A1:F3”)需要是目标范围(“A1:F21”)的一部分

您也可以使用通常的vba优化方法将计算设置为手动并禁用ScreenUpdating。 虽然我不认为他们会在你的情况下做出任何显着的速度改进。

 Dim calc As XlCalculation calc = Application.Calculation Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.ScreenUpdating = True Application.Calculation = calc 

你可以重写AddDetail()来同时调用两个数组,所以你避免了50%的调用,并且能够一次格式化两行。 这将节省很多时间。 这是电话,而不是花费时间的格式。

而不是.Resize(1,16)尝试使用更快速的.range(cell(rownum,3),cell(rownum,19))。

另一种快速的方法是格式化第一行,并将完整的行格式复制到第二行,如

 MyRange(row, col).EntireRow.Copy MyRange(row+1, col).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False 

此外,我不能完全按照你的代码,你打电话给AddDetail()与rownum和rownum + 1,然后你打电话AddDiff …()与rownum + 2,但最后你增加rownum只有2 … shouldn'你增加它3 …或者你想“覆盖”您使用AddDetail()创build的行之一。

祝你好运MikeD