2017-07-17 51 views
0

我想讓Excel查看兩個不同的工作表中的兩個不同的行,但同一列來驗證在單獨的列中移動的數字。 我該如何擺脫我擁有的當前循環,以便減少加載時間?因爲截至目前還需要太長長。 另外,我知道我不應該用循環來,我用它在低希望,這是可行的,就像細檢查兩個不同的行,但同一列

Sub repeatingrows() 

Dim oldsheet As Worksheet 
Dim newsheet As Worksheet 
Set newsheet = Application.ActiveSheet 

Set oldsheet = ThisWorkbook.Worksheets(3) 
Set newsheet = ThisWorkbook.Worksheets(2) 


'CHECK IF THE ROWS ARE SIMILAIR TO PREVIOUS SHEET 

Dim rrow As Integer 
Dim srow As Integer 

For rrow = 3 To 397 
    For srow = 3 To 397 
     If oldsheet.Cells(rrow, 2) = newsheet.Cells(srow, 2) Then 
      If oldsheet.Cells(rrow, 5) = newsheet.Cells(srow, 5) Then 
       If oldsheet.Cells(rrow, 6) = newsheet.Cells(srow, 6) Then 
        With newsheet 
         oldsheet.Range(oldsheet.Cells(rrow, 16), oldsheet.Cells(rrow, 19)).Copy 
         .Range(.Cells(srow, 16), .Cells(srow, 19)).PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd 
        End With '^COPY AND PASTES THE ROW 
       Else 
       End If 
      Else 
      End If 
     Else 
     End If 
    Next srow 
Next rrow 

End Sub 
+0

使用'worksheetfunction.match'或數組進行比較。 –

+0

而不是使用嵌套的'if',你可以使用'And'運算符將所有語句組合成一個。 –

+0

@Nathan_Sav是,而不是循環和ifs或只是如果的? – MaxAttack102

回答

1

擺脫物體! 訪問對象成員可能非常耗時。寫入對象最差。所以你可以緩存讀取和寫入,並獲得很大的時間。另外,避免複製/過去,使用.Value = ...

Sub repeatingrows() 

    Dim oldsheet As Worksheet 
    Dim newsheet As Worksheet 
    Set newsheet = Application.ActiveSheet 

    Set oldsheet = ThisWorkbook.Worksheets(3) 
    Set newsheet = ThisWorkbook.Worksheets(2) 

    Dim oldv, newv, c 

    'CHECK IF THE ROWS ARE SIMILAIR TO PREVIOUS SHEET 

    Dim rrow As Integer 
    Dim srow As Integer 

    oldv = oldsheet.Range(oldsheet.Cells(1, 1), oldsheet.Cells(397, 19)) 
    newv = newsheet.Range(newsheet.Cells(1, 1), newsheet.Cells(397, 19)) 

    For rrow = 3 To 397 
     For srow = 3 To 397 
      If oldv(rrow, 2) = newv(srow, 2) And oldv(rrow, 5) = newv(srow, 5) And oldv(rrow, 6) = newv(srow, 6) Then 
       For c = 16 To 19 'can't use range1.Value = range2.Value in VB arrays 
        newv(srow, c) = newv(srow, c) + oldv(rrow, c) 
       Next 
      End If 
     Next 
    Next 

    'Finally, write results 
    newsheet.Range(oldsheet.Cells(1, 1), oldsheet.Cells(397, 19)) = newv 

End Sub 
+0

非常感謝你,我正準備讓這些陣列完全不同。唯一的一點是,它說對象'_Worksheet'的方法'範圍'失敗。特別是對於'newv = newsheet.Range(oldsheet.Cells(1,1),oldsheet.Cells(397,19))' – MaxAttack102

+0

已更正,複製/粘貼錯誤:))) –

+0

是的,當我仔細觀察它再次,我只是看到它。再次感謝你 :) – MaxAttack102

0

在您需要的數據由兩個片存儲兩個節目的開始陣列。然後使用緩存數組完成所有的邏輯,而不是引用數千次的單元格值(這是相當「昂貴」的操作)。

相關問題