Excel 删除重复的数组问题
我从这个网站上得到了这个代码,但是我在如何使用它的格式上遇到了问题。代码最初只适用于列A和B,但我需要它用于列A:F,我固定了顶部部分,以引用我的列A:F但我对数组有问题,我是VBA的新手,因此我不确定这是如何工作的,我只知道我在那条线上出错了。这是我的密码Excel 删除重复的数组问题,excel,vba,Excel,Vba,我从这个网站上得到了这个代码,但是我在如何使用它的格式上遇到了问题。代码最初只适用于列A和B,但我需要它用于列A:F,我固定了顶部部分,以引用我的列A:F但我对数组有问题,我是VBA的新手,因此我不确定这是如何工作的,我只知道我在那条线上出错了。这是我的密码 Sub DeleteRows() With ActiveWorkbook.Worksheets("MC RRRs") Set Rng = Range("A:F").End(xlDown) Rn
Sub DeleteRows()
With ActiveWorkbook.Worksheets("MC RRRs")
Set Rng = Range("A:F").End(xlDown)
Rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
End With
End Sub
我用了录音按钮,它工作了。谢谢你的建议 要回答这个问题,您的问题在于这一行:
Set Rng = Range("A:F").End(xlDown)
不应使用End方法/属性,因为它将使您处理范围(“A:F”)
中的最后一个单元格这意味着您只有一(1)个单元格要处理,但您的下一行:
Rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes
尝试删除两(2)列(或至少两个单元格)中的重复项。此外,如果只选择了一(1)个单元格,则将标题参数设置为
xlYes
也将生成错误。另外,由于使用With子句,所以在
范围之前加一个点。
比如:
Sub DeleteRows()
Dim Rng As Range
With ActiveWorkbook.Worksheets("MC RRRs")
Set Rng = .Range("A:F")
Rng.RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6), Header:=xlYes
End With
End Sub
测试:这将通过所有列。如果要设置限制,只需插入一个max而不是所有列
Sub RemoveDuplicates()
Dim lastRow As Long
Dim tempLast As Long
Dim lastCol As Long
Dim colLet As String
Dim iCol As Integer 'because ConvertToLetter uses Integers
lastCol = Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column
lastRow = 0
'Get the true last row no matter what column it is in. Loop through each and check.
For iCol = 1 To lastCol
colLet = ConvertToLetter(iCol)
lastRow = Sheets("Sheet1").Range(colLet & "2").End(xlDown).Row
ActiveSheet.Range(colLet & "1:" & colLet & lastRow).RemoveDuplicates Columns:=1, Header:=xlYes
Next iCol
End Sub
Function ConvertToLetter(iCol As Integer) As String
'FROM http://support.microsoft.com/kb/833402
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
在对这个数组问题进行了大量的研究之后,我最终也产生了一些工作代码。我希望这能帮助有需要的人。“-5”可以根据您的需要进行调整。我不需要查看我的特定实例中的每一列,但是如果您这样做,您可以将其增加到“-1”。成功的一个关键是使用RemoveDuplicates命令时“arrColstoCheck”周围的括号
Sub RemoveDuplicates()
Dim rngDupes As Range
Dim lngCols As Long
Dim lngRows As Long
Dim i As Long
Dim strCols As String
Dim arrColstoCheck() As Variant
Dim wsComData1 as Worksheet
Set wsComData1 = Application.ActiveSheet
With wsComData1
.Activate
'Determine number of columns and rows in worksheet
lngCols = .Cells(1, Columns.Count).End(xlToLeft).Column
lngRows = .Cells(Rows.Count, 1).End(xlUp).Row
ReDim arrColstoCheck(0 To lngCols - 5)
'Fill array with column numbers
For i = 0 To lngCols - 5
arrColstoCheck(i) = i + 1
Next i
'Convert lngCols to Character for later use
strCols = Chr(lngCols + 64)
Set rngDupes = .Range("A1:" & strCols & lngRows)
rngDupes.RemoveDuplicates Columns:=(arrColstoCheck), Header:=xlNo
End With
End Sub
错误是什么?您是否尝试录制宏并将其生成的代码与此代码进行比较?列:=数组(1、2、3、4、5、6)
不起作用。我收到一个运行时错误“5”:过程调用或参数无效。我已为您发布了一个答案,希望您能了解一些如何使录制的宏更具动态性和适应性的想法。:)很好地解决了这个问题。但是我发布了一些东西来解释为什么你的第一个代码不起作用。也可以帮助你改进编码。优秀的链接。我想每隔几个小时我就会提到这个,没问题。你也可以接受你自己的答案或者你认为最能解决你问题的任何其他答案。
Sub RemoveDuplicates()
Dim rngDupes As Range
Dim lngCols As Long
Dim lngRows As Long
Dim i As Long
Dim strCols As String
Dim arrColstoCheck() As Variant
Dim wsComData1 as Worksheet
Set wsComData1 = Application.ActiveSheet
With wsComData1
.Activate
'Determine number of columns and rows in worksheet
lngCols = .Cells(1, Columns.Count).End(xlToLeft).Column
lngRows = .Cells(Rows.Count, 1).End(xlUp).Row
ReDim arrColstoCheck(0 To lngCols - 5)
'Fill array with column numbers
For i = 0 To lngCols - 5
arrColstoCheck(i) = i + 1
Next i
'Convert lngCols to Character for later use
strCols = Chr(lngCols + 64)
Set rngDupes = .Range("A1:" & strCols & lngRows)
rngDupes.RemoveDuplicates Columns:=(arrColstoCheck), Header:=xlNo
End With
End Sub