2016-07-04 63 views
1

我是Excel VBA新手,沒有太多經驗。我有兩個數據工作表,我比較,然後如果一個值匹配我複製並粘貼到第二個工作表。我使用for循環來比較每一行,並想知道是否有更好的方法來做到這一點?我目前正在使用蠻力,並希望有一種方式,以便我的程序不會運行很長時間。 (我在不同的工作表上重複這段代碼13次)。從本質上講,如果符合某些條件,這些代碼就會整合信息。以下是我的代碼。如何在我的Excel VBA代碼中重構比較循環的速度?

Sub consolidate(z) 
     Sheets(z).Range("B1:AXH100").Delete '''deletes former values''' 
     For i = 1 To 30 
     For x = 1 To 500 
     If IsEmpty(Sheets("Sheet1").Cells(x, 13)) Then 'if cell value is empty skip it' 
      a = 1 
     Else: 
      If Sheets("Sheet1").Cells(x, 18) = Sheets(z).Cells(1, 1) Then 'check to see if value is same' 
      If Sheets("Sheet1").Cells(x, 13) = Sheets(z).Cells(i, 1) Then 'check to see if value is same' 
       Sheets("Sheet1").Cells(x, 15).Copy 'copy value' 
       Sheets(z).Select 'select second sheet' 
       Cells(i, 1).Select 
       ActiveSheet.Cells(ActiveCell.Row, Columns.Count).End(xlToLeft).Offset(0, 1).Select 'offsets cell to the 
    left' 
       Selection.PasteSpecial past:=xlPasteValues 'pastes' 
     End Sub 
+1

哪裏有可能,你應該儘量避免使用選擇單元格,因爲這會導致屏幕更新,這很慢。你可以嘗試在開始時加入Application.ScreenUpdating = False,看看它是否改善了它。這裏的替代選擇被給出爲[鏈接](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros) – Clusks

+2

代碼似乎不完整(缺少'下一步's abd'End If's)你也可以避免使用'Copy'並直接在'targetRange.Value = sourceRange.Value'中分配值。 – arcadeprecinct

回答

0

正如我回答here,如果你需要訪問或更改幾個單元,你好得多讀取單元到一個數組,直接與陣列(或多個)工作,並把結果返回到Excel一旦你完成了。這是相當多的工作,Excel的數組處理不是最好的,但速度方面沒有比較。

This article更詳細地解釋了該過程。