2011-05-24 192 views
1

嗨我寫了這段代碼。但是這個代碼很慢。我如何優化這段代碼?如何優化此vba循環代碼?

Private Sub printItem(r, lastCol, objStream) 
    FirstCol = 1 

    Dim strFirst As String 

    strFirst = CStr(ActiveSheet.Cells(r, 1).Value) 

    If strFirst = "" Then 
     Exit Sub 
    End If 

     objStream.WriteText " <" 
     objStream.WriteText "TagName" 
     objStream.WriteText " " 

     For c = FirstCol To lastCol 

      data = CStr(ActiveSheet.Cells(r, c).Value) 

      If LenB(Trim$(data)) > 0 Then 
       objStream.WriteText g_AttributeName(c) 
       objStream.WriteText "=""" 
       objStream.WriteText data 
       objStream.WriteText """ " 
      End If 

     Next c 

     objStream.WriteText "/>" 

    objStream.WriteText vbNewLine 
End Sub 
+1

沒有站出來,除了也許你會更好讀取單元格的值到一個變量數組在一個操作中,而不是一個接一個。它通常會讀取多少列,並且是objStream文本文件還是其他流?在g-AttributeName()中會發生什麼。 ? – 2011-05-24 15:06:28

+1

VBA解釋。這應該是有用的,不是很快。同樣,所有這些'WriteText'調用都會讓你付出代價,儘管這取決於'objStream'寫的是什麼。文件將比控制檯更快。底線 - 我不確定你能做得更好。 – 2011-05-24 15:19:46

+0

慢多慢?比你預想的要慢,還是太慢,以至於阻止你做某件事?如前所述,速度並不是VBA的特長。而對於那些寫得很快而且很髒的東西,我會接受較慢的性能 – 2011-05-24 20:42:42

回答

4

這就是您的代碼很慢的原因:您正在循環單元格。 VBA和Excel工作表數據之間的每次通信都有相當大的開銷,當您一次引用多個單元格時,這會加起來。相反,您應該將所有數據一次加載到Variant數組中,然後在該數組中循環,如下所示。這顯着更快。

Dim varData As Variant 

    varData = ActiveSheet.Cells(r, FirstCol).Resize(1, lastCol - FirstCol + 1) 

    For c = LBound(varData, 2) To UBound(varData, 2) 

     data = CStr(varData(1, c)) 

     If LenB(Trim$(data)) > 0 Then 
      ' etc. 
     EndIf 

    Next c 

對於進一步的閱讀,看看這個古老但仍相關文章:http://www.avdf.com/apr98/art_ot003.html