2014-12-03 4 views
2

Я получил этот код с этого веб-сайта, но у меня возникла проблема с форматированием его, как мне нужно его использовать. Код был первоначально только для столбцов А и B, но мне нужно работать на Столбцов A: F, я установил верхнюю часть, чтобы сослаться на мой Колонные A: F но у меня проблемы с массивом, я новичок в VBA, поэтому я не уверен на 100%, как это работает, я просто знаю, что получаю сообщение об ошибке в этой строке. Вот мой код.Удалить проблему с дубликатами массива

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 
+0

Какая ошибка? Вы пытались записать макрос и сравнить код, который он генерирует с этим кодом? – peege

+1

'Столбцы: = Массив (1, 2, 3, 4, 5, 6)' –

+0

Это не помогло. Я получаю ошибку времени выполнения «5»: неверный вызов или аргумент процедуры. – Lillian

ответ

1
Sub DeleteRows() 
    Columns("A:F").Select 
    ActiveSheet.Range("A:F").RemoveDuplicates _ 
     Columns:=Array(1, 2, 3, 4, 5, 6), Header:=xlYes 
End Sub 

Я использовал кнопку магнитофона, и она работала. Спасибо за совет!

+2

Хорошая работа для выяснения этого. Но я написал что-то, что объясняет, почему ваш первый код не работал. Также [проверьте это] (http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros), чтобы помочь вам улучшить кодирование. – L42

+0

Отличная ссылка. Я собираюсь называть это каждые несколько часов, я думаю. – peege

+0

Awesome L42, спасибо за помощь и совет! – Lillian

2

Чтобы ответить на этот вопрос, ваша проблема с этой линии:

Set Rng = Range("A:F").End(xlDown) 

метод End/свойство не следует использовать, так как это заставит вас работать на последней ячейке в Range("A:F").
Это означает, что у вас есть только один (1) клетки работать на но ваша следующая строка:

Rng.RemoveDuplicates Columns:=Array(1, 2), Header:=xlYes 

пытается удалить дубликаты в двух (2) столбцов (или по крайней мере 2-х ячеек).
Также, если выбрана только одна (1) ячейка, установка Заголовок аргумент xlYes также приведет к ошибке.
Кроме того, поскольку вы используете С пунктом, предшествуйте Range точкой.
Что-то вроде:

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 
0

Испытано: Это будет пройти через все столбцы, хотя. Если вы хотите установить лимит, просто вставьте 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 
0

После большого количества трудностей, связанных с этой проблемой с массивами, я, наконец, также создал некоторый рабочий код. Надеюсь, это поможет кому-то в этом нуждается. «-5» можно настроить в соответствии с вашими потребностями. Мне не нужно было смотреть на каждый столбец в моем конкретном экземпляре, но если вы это сделаете, вы можете увеличить его до «-1». Один ключ к успеху - это скобки вокруг «arrColstoCheck» при использовании команды RemoveDuplicates.

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 
Смежные вопросы