2017-02-15 3 views
0

である私は、シート1とシート2で巨大なデータでやっているものです:range.findallはここで非常にslow.any代替

  1. は、一致するすべての行に(複数の比較に基づく)sheet1.columnnamesを比較in sheet2。差異を強調表示して結果シートに貼り付けます。

  2. column1に同じ値を持つすべての行について、他のフィールドのフォントの色を確認してください。赤色の場合は、column1を新しい結果シートにコピーします。

(1)で完了しました。 (2)私は(http://www.cpearson.com/excel/findall.aspx)の範囲のfindall関数を使用して、column1のすべての重複のサブセットを取得しています。コードは動作していますが、非常に遅いです。私はそれを行うことができる他の方法はありますか?

私は配列を使用している可能性がありますが、配列を使用してフォントの色に触れることはできません。私はApplication.Calculation = xlCalculationManualとApplication.ScreenUpdating = Falseを試しました。それは何の違いもありませんでした。

以下は、find allのコードスニペットです。他の方法をお勧めしますか?

「column1の中で同じ値を持つすべての行の」
Dim foundRange As Range 
Dim SearchRange As Range 
Dim FindWhat As Variant 
Dim irowcount, icount, iMaxCount As Long 
Dim bFlag As Boolean 
With XL_Ws_Result 
    'range with column header 
    Set rowRangeHeaderA = .Range(.Cells(1, 1), .Cells(Last_Row_Base, Last_Col_Base)) 
    'range in result sheet without column header 
    Set SearchRange = rowRangeHeaderA.Offset(1, 0).Resize(rowRangeHeaderA.Rows.count - 1, Last_Col_Base) 
End With 

For irowcount = 1 To SearchRange.Rows.count 
    'search string 
    FindWhat = SearchRange.Cells(irowcount, 1) 

    Set foundRange = FindAll(SearchRange:=SearchRange, _ 
          FindWhat:=FindWhat, _ 
          LookIn:=xlValues, _ 
          LookAt:=xlWhole, _ 
          SearchOrder:=xlByColumns, _ 
          MatchCase:=False, _ 
          BeginsWith:=vbNullString, _ 
          EndsWith:=vbNullString, _ 
          BeginEndCompare:=vbTextCompare) 

    If Not foundRange Is Nothing Then 
     iMaxCount = foundRange.Rows.count 
     For icount = 1 To iMaxCount 
      'check font color 
      If foundRange.Cells(icount, 9).Font.ColorIndex = 3 And foundRange.Cells(icount, 9).Font.ColorIndex = 3 Then 
       bFlag = True 
      Else 
       'if any cell is not red i want to skip entire found range. not need for further processing 
       bFlag = False 
       Set foundRange = Nothing 
       Exit For 
      End If 

      If bFlag = True Then 
       XL_Mismatch.Cells(i, 1) = foundRange.Cells(1, 1).Value 
      End If 
     Next icount 

     irowcount = irowcount + iMaxCount - 1 
    End If 
Next irowcount 
+0

findformatを試してから値を確認できますか? –

答えて

0

- >これはあなたが.Autofilter.Findよりもはるかに高速)作成しなければならないことを意味

「他のフィールドのフォントの色を確認することがある場合。 red、column1を新しい結果シートにコピーする " - >そして、前の.Autofilterの前または後にフィルタリングされたセルをループし、列を追加して(0または1とします)、セルをループしてフォントを取得しますあなたは今度は2つの条件(値+ 0または1)で.Autofilterを再度実行します。

その後、フィルタリングされた範囲をコピーして新しい結果シートに貼り付けてください。

私はこれがより速くなければならないと思います。

+0

ありがとうございます。しかし私は自分のロジックを変更しました。私は今findallを使用していません。私がしているのは、1)file1.copyの範囲を配列1にソートする2)ソートファイル2。 array2に範囲をコピーします。 3)配列をループして、必要な基準に従って共通の行とフィルタ行を探します。その方法はより速く、モジュールを追加する必要もありません。ご協力いただきありがとうございます。 – Jay

0

私のロジックが変更されました。私は現在findallを使用していません。私がしたことは、

1)sort file1です。アレイ範囲にコピー範囲

2)ソートファイル2。 array2に範囲をコピーします。

3)私は配列をループして、必要な基準に従って共通の行とフィルタ行を探します。

その方法はより速く、モジュールを追加する必要もありません。

関連する問題