2017-07-17 5 views
0

2つの異なるシートで2つの異なる行を表示するようにExcelを取得しようとしていますが、同じ列を使用して別の列の数値の移動を検証します。 どのようにして現在のループを取り除いてロード時間を短縮できますか?現在のところ、と長くなります。 また、私はループを使用してはならないことを知って、私はそれはあなたが2枚に2枚からデータを格納する必要があり、プログラムの開始時に2つの異なる行をチェックして同じ列を確認する

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'演算子を使ってすべてのステートメントを1つにまとめることができます。 –

+0

@ Nathan_Savは、ループとifsの代わりに、それともifのものですか? – 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'のメソッド 'Range'が失敗したということです。具体的には、 'newv = newsheet.Range(oldsheet.Cells(1,1)、oldsheet.Cells(397、19))' – MaxAttack102

+0

を修正しました。コピー/ペーストエラー:)) –

+0

もう一度、私はそれを見た。ありがとうございました :) – MaxAttack102

0

同じように罰金、仕事であろうと、低い期待して、それを使用しましたアレイ。それから、何千ものセルの値を参照するのではなく、キャッシュされた配列を使って行うすべてのロジック(これはかなり高価な操作です)。

関連する問題