将数组分配给.RemoveDuplicates Columns:=

我想删除保存数据的列范围内的重复行。

我首先得到我的数据集使用的最后一行和最后一列

lastUsedRowDiff = resultBook.Sheets("Differences").Cells(resultBook.Sheets("Differences").Rows.Count, "A").End(xlUp).Row lastUsedColumnDiff = resultBook.Sheets("Differences").Cells(6, resultBook.Sheets("Differences").Columns.Count).End(xlToLeft).Column 

我尝试使用这样的RemoveDuplicate函数:

 resultBook.Sheets("Differences").range(resultBook.Sheets("Differences").Cells(1, 1), resultBook.Sheets("Differences").Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44), _ Header:=xlNo 

它的工作原理,但我希望列的数量是dynamic的,因此这是不实际的初始化数组持有列。

我试图在调用RemoveDuplicates之前初始化一个拥有列索引的数组,如下所示:

 ReDim columnArray(1 To lastUsedColumnDiff) As Integer For p = 1 To lastUsedColumnDiff columnArray(p) = p Next p 

当我尝试将ColumnArray分配给列:=我得到一个错误。

 resultBook.Sheets("Differences").range(resultBook.Sheets("Differences").Cells(1, 1), resultBook.Sheets("Differences").Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates Columns:=columnArray, _ Header:=xlNo 

整个代码段如下:

 lastUsedRowDiff = resultBook.Sheets("Differences").Cells(resultBook.Sheets("Differences").Rows.Count, "A").End(xlUp).Row lastUsedColumnDiff = resultBook.Sheets("Differences").Cells(6, resultBook.Sheets("Differences").Columns.Count).End(xlToLeft).Column ReDim columnArray(1 To lastUsedColumnDiff) As Integer For p = 1 To lastUsedColumnDiff columnArray(p) = p Next p resultBook.Sheets("Differences").range(resultBook.Sheets("Differences").Cells(1, 1), resultBook.Sheets("Differences").Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates Columns:=columnArray, _ Header:=xlNo 

好,所以这是有趣的…一目了然,我不明白为什么它不会接受RemoveDuplicates方法调用Columns的数组参数。 谷歌提出了这个答案,这表明使用arrays上的VBA Evaluate函数,当我testing它,似乎按预期工作。

麻烦似乎是RemoveDuplicates方法似乎认为cols是某种function。 尝试使用evaluate()方法来将其识别为一个variables。 这在Excel 2007中为我工作,应该为你工作。 让我知道。

你的代码也可以从一些清理中受益,试试这个,它使用With blocks来使代码更易于阅读和修改:

 Sub foo() Dim lastUsedRowDiff As Long Dim lastUsedColumnDiff As Long Dim myWorkbook As Workbook Dim mySheet As Worksheet Dim columnArray() Dim p As Long Set myWorkbook = ThisWorkbook '## Modify as needed Set mySheet = ThisWorkbook.Sheets(1) '## Modify as needed With mySheet lastUsedRowDiff = .Cells(.Rows.Count, "A").End(xlUp).Row lastUsedColumnDiff = .Cells(6, .Columns.Count).End(xlToLeft).Column End With ReDim columnArray(1 To lastUsedColumnDiff) For p = 1 To lastUsedColumnDiff columnArray(p) = p Next With mySheet .Range(.Cells(1, 1), .Cells(lastUsedRowDiff, lastUsedColumnDiff)).RemoveDuplicates _ Columns:=Evaluate(columnArray), Header:=xlNo End With End Sub 

正如我刚刚发现的,Columns:= Evaluate(columnArray)方法可能无法正确处理。 太多的行被删除,不知道为什么。 尝试列:=(columnArray)。 这在Excel 2010中适用于我。

此外 – 与列:=(columnArray)确保您的columnArray从0索引。否则,你会得到一个运行时错误“9”:下标超出范围。 所以这应该如下所示:

 Sub RemoveDuplicates() Dim columns As Long Dim mySheet As Worksheet Dim myArray() Set mySheet = ThisWorkbook.Sheets(1) 'To modify columns = mySheet.UsedRange.columns.Count ReDim myArray(0 To columns - 1) For i = 0 To columns - 1 myArray(i) = i + 1 Next i mySheet.UsedRange.RemoveDuplicates columns:=(myArray), Header:=xlYes End Sub 

在MS Excel 2013上testing。