2016-06-18 30 views
0

私はこのシートを2週間オンオフしています。私は完璧に近づいたような気がします。それは私の顧客がしたいすべてをします。私の新しい闘いは、それが私が顧客の実際のデータを入力するときです。最初のフィルタリングの後には、約30,000行と14個の列があります。マッチを探したり、比較したり、置き換えたりする私の方法では、あまりにも多くのことしかしません。私がやっていることはかなり明白です。最初の列で一致するものを検索し、隣接するセルを比較します。違いがある場合は、マスターセルデータをコメントに移動し、更新データをマスターセルに移動します。相違点の比較、比較、置き換え方法

私は間違っていません。私は自分自身をかなり誇りに思っていた。しかし、データを比較することは、私が持っている方法を少しオーバーロードしています。

Sub Compare_Function_MatchEval() 
     Call Set_Variables 
     UpdateSheet.Activate 
     For w = 5 To UpdateSheet.UsedRange.Rows.Count 
      v = 1 
      CellVal = UpdateSheet.Cells(w, 1).Value 
      MasterSheet.Activate 
      z = Application.WorksheetFunction.Match(CellVal, Range(Cells(1, 1), Cells((Rows.Count), 1)), 0) 
      For y = 2 To UpdateSheet.UsedRange.Columns.Count 
       v = v + 1 
       If Not UpdateSheet.Cells(w, v) = MasterSheet.Cells(z, v) Then 
        OldData = MasterSheet.Cells(z, v) 
        NewData = UpdateSheet.Cells(w, v) 
        MasterSheet.Cells(z, v).AddComment 
        MasterSheet.Cells(z, v).Comment.Text Text:=OldData 
        MasterSheet.Cells(z, v).Comment.Visible = False 
        MasterSheet.Cells(z, v) = NewData 
       End If 
      Next 
     Next 
     wbMaster.Application.ScreenUpdating = True 
     wbMaster.Application.Calculation = xlCalculationAutomatic 
End Sub 
+0

これはVB.NETコードではありません。タグを削除してください。 – Plutonix

+0

324現在実行する秒数:-( – Flibertyjibbet

+0

最初の 'WorksheetFunction.Match'呼び出しの目的は何ですか?あなたは結果を' x'に入れますが、どこで使うのか分かりません。 – Joffan

答えて

1

スプレッドシートに多くのコメントを追加すると、常に遅くなることがあります。そうであれば、シャドウシートのように、それを別々に扱うことを考えるかもしれません。とにかく、あなたのすべてのセルがコメントで終わってしまうのであれば、そのコメントデータを入手しやすくすることもできます。

最初のWorksheetFunction.Matchコールはあなたのコメントによれば、デッドコードですので、あなたのタイミング結果にコードが反映されていないことを願っています。

第2の(または唯一の)WorksheetFunction.Matchコールは、毎回検索範囲を再設定します。そのRangeは一度設定して使用することができます。ループ内でMasterSheet.Activateの必要性が回避されます。

Dim SearchZone as Range 
     : 
     MasterSheet.Activate 
     Set SearchZone = Range(Cells(1, 1), Cells((Rows.Count), 1)) 

     For w = 5 To UpdateSheet.UsedRange.Rows.Count 
      v = 1 
      CellVal = UpdateSheet.Cells(w, 1).Value 
      z = Application.WorksheetFunction.Match(CellVal, SearchZone, 0) 
      : 

実行時間が一致と更新の間でどのように分割されるかをテストする価値があります。マッチが遅い場合は(マスターとアップデートのために)キーを引き離してソートし、単純にトラバースする方が良いかもしれません。経済性を考慮して、Excelに一時的なシートでキーの並べ替え作業をさせることができます。

Set_Variables呼び出しがScreenUpdatingをオフにしていると仮定します。

+0

あなたは一度それを呼び出すとデータの配列を見つけ、配列を見つけた行を返しますか? – Flibertyjibbet

+0

@Addohmはこれを行う方法の例を追加しました。 ) – Joffan

0

編集;バリアント配列は

1ベースは2を編集していることから:テストされ、より多くのいくつかの秒を稼ぐために、最大範囲まで

使用アレイ(コメントでは不可能な)変数に

UBound(updateShtArr, 1)UBound(updateShtArr, 2)を保存しますコードは次のようになります(テスト済み)。

Option Explicit 

Sub Compare_Function_MatchEval() 

    Call Set_Variables 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    updateShtArr = UpdateSheet.UsedRange.Value 
    masterShtArr = MasterSheet.UsedRange.Value 

    iUp1Max = UBound(updateShtArr, 1) 
    iUp2Max = UBound(updateShtArr, 2) 
    For w = 5 To iUp1Max 
     z = GetRow(masterShtArr, iUp1Max, updateShtArr(w, 1)) 
     If z >= 0 Then 
      For v = 2 To iUp2Max 
       If Not updateShtArr(w, v) = masterShtArr(z, v) Then 
        With MasterSheet.Cells(z, v) 
         .AddComment 
         .Comment.Text Text:=masterShtArr(z, v) 
         .Comment.Visible = False 
         .Value = updateShtArr(w, v) 
        End With 
       End If 
      Next v 
     End If 
    Next w 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 

Function GetRow(arr As Variant, iMax, val As Variant) As Long 
    Dim i As Long 

    GetRow = -1 
    For i = 1 To iMax 
     If arr(i, 1) = val Then 
      GetRow = i 
      Exit Function 
     End If 
    Next i 
End Function 
+0

これを同様の量の比較でシミュレートしましたか?あなたの時代は何でしたか?私は明日これを行かせます。 – Flibertyjibbet

+0

私は自分のコードを繰り返しテストしていますが、コメントが増えるにつれて速度が過度に減衰します。私は、コメントを使用する代わりに、変更された値を示す別のシートを作成するかもしれません。私はあなたのコードをまだテストしていませんが、心に留めておいてください。 – Flibertyjibbet

+0

私はいくつかの40k行×14列でテストしたところ、約90秒かかりました。いくつかのコメントがあります。もちろん、それはマシンやその他のものにまで及んでいます。 – user3598756

関連する問題