2016-07-29 14 views
0

現在、ブック内の重複を識別するマクロを実行していますが、インデックスの最初のセットを識別し、最初のセットにタグを付けずにifステートメントを設定しています。これを渡すことで、最初のインスタンスに複製も追加されます。しかし、これは長い時間がかかり、可能であればこれを改善したいと考えています。どんな提案も大変ありがとうございます。私はVBAの新人ですが、新しい問題に遭遇したので少し勉強しています!VBA - IFループの改善

'Declaring the lastRow variable as Long to store the last row value in the Column1 
Dim lastRow As Long 
'matchFoundIndex is to store the match index values of the given value 
Dim matchFoundIndex As Long 
'iCntr is to loop through all the records in the column 1 using For loop 
    Dim iCntr As Long 
    Dim first_dup As Long 
    Dim tagging As Long 
    Dim item_code As String 

'Finding the last row in the Column 1 
    lastRow = Range("B1000000").End(xlUp).Row 
' 
'looping through the column1 
    For iCntr = 2 To lastRow 

     'checking if the cell is having any item, skipping if it is blank. 
     If Cells(iCntr, 1) <> "" Then 
      'getting match index number for the value of the cell 

      matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0) 

      'if the match index is not equals to current row number, then it is a duplicate value 
      If iCntr <> matchFoundIndex Then 

       'Printing the label in the column B 
       Cells(iCntr, 4) = "Duplicate" 

      End If 
     End If 
    Next 


    For first_dup = 2 To lastRow 
     If Cells(first_dup, 5) = "Duplicate" Then 
      item_code = Cells(first_dup, 1) 
      For tagging = 2 To lastRow 
       If Cells(tagging, 1) = item_code Then 
        Cells(tagging, 5) = "Duplicate" 
       End If 
      Next 
     End If 
    Next 

Example data: 
item code 
1 
2 
3 
4 
1 duplicate 
2 duplicate 
3 duplicate 
4 duplicate 
1 duplicate 
2 duplicate 
3 duplicate 
4 duplicate 
+0

個々のRange/Cellを使用する代わりにRange.Value配列を反復処理すると効果的です。 '= IF(MATCH($ A2、$ A:$ A、0)<> ROW($ A2)、" Duplicate "、" ")という式を使って同じ結果を得ることもできます。 –

答えて

0

私の最初の提案は、物事を-複雑にこのことができますかどうかを確認するために、重複する値に条件付き書式を使用して試すことはありません:あなただけを見つけるために必死であれば、それに失敗

enter image description here

最初のオカレンスではなく、次のような数式を使用することができます(データがA2で始まる場合はセルB2で、一致しないヘッダー行が必要になるか、最初の行が常に一致します)

=IF(COUNTIF($A1:A$1,A2)>=1,"Duplicate","") 
このような何かを見ることができるデータのあなたの行を下に貼り付け

どちら:

enter image description here

ありますが、VBAソリューションに必死ですが、私はあなたに簡単なを与えるだろうと思っている場合も、VBAのソリューションです最初のもの。あなたがコメントにどのように乗っているのか教えてください。

編集:あなただけ、R1C1表記で、VBAを使用して例えばを上記の式を挿入することができます。:

Sub test() 
    Range("B2:B" & Range("A1").End(xlDown).Row).FormulaR1C1 = "=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")" 
End Sub 

あなたは何が起こっているか知っているので、私はこれを打破するでしょう。

Range("B2:B" & Range("A1").End(xlDown).Row)

は、それを

その後B2とRange("A1").End(xlDown).Rowすなわち、列Aの最後の埋め行(あなたのデータの一部として列Aの空白を期待している場合ので、これは動作しません)間の列Bのセルを選択しますR1C1の計算式を"=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")"に設定します。R1C1は最初の行、最初の列(つまり$A$1)を意味します。 R[-1]C1は前の行、最初の列を意味します。たとえば、 B5にいる場合、これはA4を選択します。 あなたがA2にいる場合、これはA1を選択します。 A1の場合は、1より前の行には入力できないため、これはエラーになります。 RC1は、現在の行、最初の列を意味します。

希望すると便利です。

+0

こんにちはAndrew、私はすべての重複を見つけることが切望されていますが、 "duplicate"タグですべてのフラグを立てる必要があります。重複があるカテゴリを見るためにさらに処理を行うので、実際にこれを実行していると他の人は重複を見つける方法を知りません。最初にExcelにあなたの提案をありがとう! Ged – Hinchy16

+0

遅れて申し訳ありませんが、私の編集をご覧ください。 –

+0

こんにちはAndrew、countifは長い時間がかかりますが、私はあなたの提案を今すぐ試しています。以前はやっていたループよりもうまくいくと思います。私は最初にループを設計しました。私が必要とするすべての複製をタグ付けするものは何もないようです。私はこれをさらに使って、どのアイテムリストが互いに重なっているかを調べます。あなたの提案をありがとう! – Hinchy16

0

私が提示した最初のコードと同じでした。30000アイテムで約5分かかっていますので、それはそれほど悪くはありません。