2009-12-04 51 views
0

我有一個宏,它將數百行數據添加到Excel電子表格中。我從插入每行數據的循環中調用一個過程。每次插入數據時,我一直在應用該行的格式。但是,在我的測試過程中,我發現我可以插入大約3/4秒的所有數據(3.3秒對4.11秒),但是我不一次一行地應用格式化。我試圖克服的問題是不是每行都有相同的格式;但是,有一個可預測的模式。兩行一格式和一行不同格式。有沒有循環的方式來應用這兩種不同的格式,以使我能夠保持我所獲得的性能收益(用戶希望看到一個2秒以內的響應,這可能是一個巨大的收益)。添加格式化Excel的最有效方法 - VBA

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 

回答

1

我目前使用下面的代碼(在這個應用程序設置,如screenupdating,計算和事件都被關閉)您有兩種在一個模式和1行格式化2行在另一種模式。我打電話給2row和1row格式。

您可以將2cell格式應用於整個列/整個數據區域,然後僅循環使用1cell格式。

+0

我沒有得到我期待的性能提升,但這確實有幫助。 – 2009-12-08 14:38:10

0

您可以重寫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 

除此之外我不能完全按照你的代碼,您正在使用的rownum調用AddDetail()和rownum + 1,然後你用rownum + 2調用AddDiff ...(),但是最後你只能通過2遞增rownum ...不應該將它增加3 ...或者你想「覆蓋」其中的一個使用AddDetail()創建的行。

好運 拾音

+0

感謝您提供的信息,我會盡力回覆您。代碼實際上是爲了這個例子而減少的,這就是爲什麼行編號看起來沒有問題。 – 2009-12-04 21:58:32

+0

我嘗試了這些建議,但在性能方面沒有看到任何好處。測試調整大小與其他方法的使用不會帶來任何性能問題,並且複製粘貼實際上爲整個過程增加了時間。 – 2009-12-08 14:23:03

2

如果你想避免使用複製/粘貼您可以使用自動填充功能應用格式化的範圍內。

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