2016-12-08 17 views
0

2枚のカラムに〜100000セルの長さのカラムが2つあります。 これらの列は次のようになります。Vlookupの機能から検出された値を削除する方法はありますが、vlookupはセルを再度検索しません。

--------- 
| 1 | a | 
--------- 
| 2 | b | 
--------- 
| 3 | c | 
--------- 
| 4 | d | 
--------- 
| 5 | e | 
--------- 

と、この:

--------- 
| 1 | a | 
--------- 
| 3 | k | 
--------- 
| 2 | b | 
--------- 
| 4 | d | 
--------- 

を今、私はお互いに最初の列を比較しています、彼らはそれが2番目の列はまた、一致しているかどうかを確認する必要があります一致するかどうか。だから、結果は次のようになります。=IFERROR(IF(VLOOKUP(A3;newsheet!A:B;2;FALSE)=B3;"Correct";"Wrong");"Not Found")しかし、これを行うには、それは私がエクセル2016とすべての私の4個のプロセッサを使用しています、非常に時間がかかる:私はこれを行うには、この機能を使用しています

--------------------- 
| 1 | a | correct | 
--------------------- 
| 2 | b | correct | 
--------------------- 
| 3 | c | wrong  | 
--------------------- 
| 4 | d | correct | 
--------------------- 
| 5 | e | not found | 
--------------------- 

。これはおそらく、アルファベット順の最初の列が両方とも取得されているため、遅く、遅く計算されますが、深くなればなるほど、確認する行が増えます。 VLOOKUP関数がセルをチェックしないようにする方法はありますか?それはすでに合意が見つかりました。

だから私の例では:それは| 1 | a |を見つけた場合は、次のラウンドは、それだけで以下の残りの項目を検索します。この問題に

+1

最初の列は常に両方のシートで同じですか? – Susilo

+0

列は常に同じ@Susilo –

+0

@ThomasInzina私の例で見るものはすべて、私がExcelで使っているものです:P –

答えて

0

値を動的に更新する必要がない限り、 VBAは100Kの式に代わるより優れた方法です。 ArrayListと配列を使用すると、データを処理するのに1.98秒かかりました。

Sub ValidateData() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 

    'You'll need to adjust these const values 
    Const LOOKUP_SHEET As String = "newsheet" 
    Const TARGET_SHEET As String = "oldsheet" 
    Dim x As Long, y As Long 
    Dim data As Variant, results As Variant 
    Dim key As String 
    Dim list As Object 
    Set list = CreateObject("System.Collections.ArrayList") 

    With Worksheets(LOOKUP_SHEET) 
     'Load the values from columns A and B into an array 
     data = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Resize(, 2) 
    End With 

    For x = 1 To UBound(data, 1) 
     'Create a unique identifier 
     'using a delimiter to ensure value don't mix 
     key = data(x, 1) & "|" & data(x, 2) 
     If Not list.Contains(key) Then list.Add key 
    Next 

    With Worksheets(TARGET_SHEET) 
     'Load the values from columns A and B into an array 
     data = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Resize(, 2) 
     'Resize the results array 
     ReDim results(1 To UBound(data), 1 To 1) 

     For x = 1 To UBound(data, 1) 
      'Create a unique identifier 
      'using a delimiter to ensure value don't mix 
      key = data(x, 1) & "|" & data(x, 2) 
      results(x, 1) = IIf(list.Contains(key), "Correct", "Wrong") 
     Next 

     .Range("C1").Resize(UBound(results, 1)) = results 
    End With 

    Application.Calculation = xlCalculationAutomatic 
    Application.ScreenUpdating = True 

End Sub 
0

を私を助けるために、事前に

--------------------- 
| 2 | b | correct | 
--------------------- 
| 3 | c | wrong  | 
--------------------- 
| 4 | d | correct | 
--------------------- 
| 5 | e | not found | 
--------------------- 

感謝することはできます」コメントは投稿の問題のため投稿してください。しかし、それが適切にソートされていると仮定すると私はと思っています。

編集:

また、あなたが代わりに一度に一つを行こうと、一度に両方の列を確認したい場合は、プロキシを作るために2つの列を結合することができます。すなわち自動入力ダウン= A1 & B1は

は、だから、

1A 図2b 図2c

など

が半分に必要なvlookupsを切り取り含む3番目の列を取得します:)

Sub ihopethishelps() 

Dim last As Long 
Dim r As Long 


Range("B1").Select 
Selection.End(xlDown).Select 
last = ActiveCell.Row - 1 
Range("C1").Select 

For r = 0 To last 

ActiveCell.Offset(r, 0).Value = _ 
"=IFERROR(IF(VLOOKUP(A" & r + 1 & ",Sheet2!A" & r + 1 & ":O" & last & ",2,FALSE)=B" & r + 1 & "," & Chr(34) & "Correct" & Chr(34) & "," & Chr(34) & "Wrong" & Chr(34) & ")," & Chr(34) & "Not Found" & Chr(34) & ")" 

Next 

End Sub 
関連する問題