2017-12-28 10 views
0

私は30Kを超えるデータ行を持つスプレッドシートを持っています。それぞれのデータポイントは38です。重複した行があるかどうかを判断するために、各行に14のフィールドを連結し、データをトリムしました。これにより、349文字からなる各行のキーが作成されました。Application.Match Error 2015

編集:キーの複製は、14個のフィールドがすべて同じ場合に発生します。視覚的な見直しから、私はすべての14のフィールドのデータがまったく同じである約200行(2000年のうち)を特定しました。

次に、application.matchを使用して検索を実行し、そのキーがすでに作成されているかどうかを確認しました。重複がなければ、application.match関数は正常に動作します。重複があった場合しかし、それは

エラー2015

を返す私は、関数が#VALUEを返しているとき、これがあることを理解しています。イミディエイトウィンドウを使用してチェックすると値が重複し、スプレッドシートに「= Xi = Yj」と入力すると同じ(つまりTRUE)と表示されます

正しいロー値を知る必要がありますプロジェクトの次の部分では、重複した値を特定し、正しい行の値を取得する手段があるかどうか疑問に思っていますか?次のように

私が持っているコードは(まだのみのPoC)です:

While Cells(a, 1) <> vbNullString 

    If Cells(a, 36).Interior.Color = 5296274 Then 

    ElseIf Cells(a, 36) <> vbNullString Then 

    Else 
     Cells(a, 39) = Trim(Cells(a, 3) & Cells(a, 4) & Cells(a, 5) & Cells(a, 6) & Cells(a, 7) & Cells(a, 8) & Cells(a, 9) & Cells(a, 10) & _ 
     Cells(a, 11) & Cells(a, 12) & Cells(a, 13) & Cells(a, 14) & Cells(a, 15) & Cells(a, 16) & _ 
     Cells(a, 17) & Cells(a, 18) & Cells(a, 19)) 

     Cells(a, 44) = Len(Cells(a, 39)) 

     m = vbNullString 

     m = Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0) 

     If m = vbNullString Then 
      Cells(a, 39).Select 
      Selection.Style = "Good" 

     Else 
'   Range(Cells(a - 1, 39), Cells(a, 39)).Select 
'   Selection.Style = "Bad" 

     End If 
    End If 
    a = a + 1 

Wend 
+0

あなたが最初の後に重複キーのみ出現のすべての場所を収集していますか?そして、範囲を完全に参照してください。または、それらをWithステートメントの中に置き、接頭辞に "。"を付けます。 – QHarr

+1

ヒント: 'Cells(a、39)= Join(Application.Index(Cell、(r、3).Resize(、17).Value、0、0)、"; ") – JohnyL

+0

@QHarr - わからない質問の第2部分に従ってください。最初のものは、次のものがユニークでないものに変更された場合は最初のものを変更することを含め、それぞれの場所を知る必要があります。 – Clauric

答えて

0

多くの実験の後、私はエラーの理由を考え出しました。

作成されたキーの長さは349文字です。 Excelの機能の多くは最大文字数制限が256(0〜255)です。

それに基づいて、トリム機能を使用してキーをカットしました。コードは今のように見える

While Cells(a, 1) <> vbNullString 

    If Cells(a, 36).Interior.Color = 5296274 Then 

    ElseIf Cells(a, 36) <> vbNullString Then 

    Else 
'  Cells(a, 39) = Join(Application.Index(Cells(a, 3).Resize(, 17).Value, 0, 0), ";") 
     Cells(a, 39) = Trim(Cells(a, 3)) & Trim(Cells(a, 4)) & Trim(Cells(a, 5)) & Trim(Cells(a, 6)) & Trim(Cells(a, 7)) & Trim(Cells(a, 8)) & Trim(Cells(a, 9)) & Trim(Cells(a, 10)) & _ 
     Trim(Cells(a, 11)) & Trim(Cells(a, 12)) & Trim(Cells(a, 13)) & Trim(Cells(a, 14)) 

'  & Trim(Cells(a, 15)) & Trim(Cells(a, 16)) & Trim(Cells(a, 17)) & Trim(Cells(a, 18)) & Trim(Cells(a, 19))) removed 

     Cells(a, 44) = Len(Cells(a, 39)) 

     m = vbNullString 

     m = Application.Match(Cells(a, 39), Range(Cells(1, 39), Cells(a - 1, 39)), 0) 

     If m = vbNullString Then 
      Cells(a, 39).Select 
      Selection.Style = "Good" 
'   Cells(a, 41).Select 
'   Selection.ClearContents 

     Else 
      Cells(a, 39).Select 
      Selection.Style = "Bad" 
      Cells(a, 40) = m 

      Cells(m, 39).Select 
      Selection.Style = "Bad" 
      Cells(m, 40) = a 

     End If 
    End If 
    a = a + 1 

Wend 
1

は、2つのオプションが、条件に誤りを埋め込むようにしてください。このように:

If IsError(Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0)) Then 
    'm = something 
Else  
    m = Application.Match(Cells(a, 39), Range(Cells(2, 39), Cells(a - 1, 39)), 0) 
End If 
+0

そこに問題があります。それは、値を与えるために "m"が必要な場合にのみエラーを出します。何も見つからない場合は、m = vbnullstringが返されます。これは正しいです。 – Clauric

+0

@Clauric - If IsError条件で何か他のものを書いてください。 – Vityata