VBA的.removeDuplicates似乎不起作用......为什么?

时间:2017-12-28 22:58:45

标签: excel vba excel-vba duplicates

我有一个列向量,比如说

1 2 1 2 1 1 1 1 1

我需要以编程方式删除重复项。因此,在删除重复项后,输出应该只是:

1 2

但是,VBA的.removeDuplicates方法失败,触发错误1004(应用程序定义的错误)。
我的设置如下: 我有一个包含实际数据的工作簿。第二个工作簿包含在第一个工作簿上运行的vba代码。

观察#1:

当我从包含数据的工作簿中执行.removeDuplicates方法并因此执行包含工作表的数据时,代码就像魅力一样。

sub test  
 ActiveSheet.Range("$a$2:$a$20").RemoveDuplicates Columns:=1, Header:=xlYes
end sub

观察#2:

然而,当我尝试从另一个工作簿运行相同的代码时(稍微修改以解决代码在第一个工作簿外部的事实),.removeDuplicates失败:

Sub test()
    Dim wb As Workbook
    Dim sh As Worksheet

    'get a handle to data containing workbook and sheet
    Set wb = Workbooks(1) 'change wb index as needed
    Set sh = wb.Sheets("s2") ' change sheet name  as needed
    sh.Range("$a$2:$a$20").RemoveDuplicates Columns:=Array(1), Header:=xlYes
End Sub

之前有人必须处理这件事吗?我不能从另一个工作簿中使用.removeDuplicates吗?我看一下MSDN的API,没有提到限制......

1 个答案:

答案 0 :(得分:1)

删除重复的行为很奇怪,有时可以,但是有时不能,基本上,当选定范围内的单元格为空白时,它将不起作用。为避免删除重复的运行时错误,您可以使用以下过程

Call remove_duplicate(ThisWorkbook.Name, "Mysheets", 14, 400) 

以上调用会在SUB之后启动,其作用与remove,remove,replicate相同 哪里

ThisWorkbook.Name是工作簿名称,对于您的情况是“ 1”。 Mysheets是工作表名称,因此您的情况将是“ s2”。 14 =列号,对于您的情况是1。 400 =最后一行编号,对于您的情况是20。

Sub remove_duplicate(ByVal WorkBookName As String, ByVal worksht As String, ByVal col_Number As Integer, ByVal LastRow As Integer)
'WorkBook must be open withwise won't work
'col_Number = the column u want to test duplicate value

Dim i As Long
Dim CalcMode, ViewMode As Variant

Workbooks(WorkBookName).Worksheets(worksht).Activate

If LastRow <= 1 Then  'if Rows on column is empty or only contains header then exit the sub
    Exit Sub
End If

With Application
    CalcMode = .Calculation
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
End With

ColChr = Split(Cells(1, col_Number).Address, "$")(1)
With ActiveSheet
    If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False
    ViewMode = ActiveWindow.View
    ActiveWindow.View = xlNormalView
    Range("A1").Select
    For i = LastRow To 2 Step -1
        CheckVal = Range(ColChr & i).Value
        CountVal = Application.CountIf(Range(ColChr & ":" & ColChr), CheckVal)
        If CountVal > 1 Then
            Rows(i).EntireRow.Delete
        End If
    Next i
End With

ActiveWindow.View = ViewMode
With Application
   .ScreenUpdating = True
   .Calculation = CalcMode
   .ScreenUpdating = True
End With

End Sub