我有一个列向量,比如说
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,没有提到限制......
答案 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