VBA - IF循环改进

时间:2016-07-29 14:59:15

标签: vba loops if-statement

我目前正在运行一个宏来识别工作簿中的重复项,但是它确定了索引中的第一个集合并且没有标记第一个集合然后导致我设置if语句到通过这个,这也增加了第一个实例的重复。这需要很长时间才能完成,如果可能的话,我希望改进这一点。任何建议都会非常感激,我是VBA的新手,但是因为我遇到了新的问题而一直在学习一些东西!

'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

2 个答案:

答案 0 :(得分:0)

我的第一个建议是不要过度复杂化,尝试使用重复值条件格式来查看是否有帮助:

enter image description here

如果你失败了,如果你只是想要找到副本,而不是第一次出现,你可以使用这样的公式:(如果你的数据在A2中开始,则在单元格B2中,它将需要一个没有标题行的标题行t匹配,或者你的第一行总是匹配)

=IF(COUNTIF($A1:A$1,A2)>=1,"Duplicate","")

当粘贴你的数据行时,它看起来像这样:

enter image description here

如果您迫切需要VBA解决方案,还有VBA解决方案,但我想我会先给你简单的解决方案。让我知道你在评论中的表现。

编辑:您可以使用VBA插入上述公式,使用R1C1表示法,例如:

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中B列与A列中最后一个填充行之间的单元格,即Range("A1").End(xlDown).Row(如果您希望A列中的空白作为数据的一部分,则不起作用)

然后,它将R1C1 ref公式设置为"=IF(COUNTIF(R1C1:R[-1]C1,RC1)>=1,""Duplicate"","""")",其中R1C1表示第一行,第一列,(即$A$1R[-1]C1表示上一行,第一列。例如, 如果您在B5,这将选择A4。 如果你在A2,这将选择A1。 如果你在A1,这会出错,因为你不能早于1。 RC1表示当前行,第一列。

希望这有帮助!

答案 1 :(得分:0)

答案与我提供的初始代码相同,对于30000件物品大约需要5分钟,因此它的作用并不算太差。