2014-12-03 80 views
2

我從這個網站得到了這段代碼,但我有問題格式化它,以我需要如何使用它。該代碼最初只爲列將,但我需要它爲列工作:F,我固定頂部提及我的A柱:F,但我有與Array有關的問題,我是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 2014-12-03 00:41:39

+1

'列:= Array(1,2,3,4,5,6)' – 2014-12-03 00:48:13

+0

這不起作用。我得到一個運行時錯誤'5':無效的過程調用或參數。 – Lillian 2014-12-03 00:58:10

回答

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 2014-12-03 01:42:03

+0

優秀的鏈接。我想每隔幾個小時就提一下,我在想。 – peege 2014-12-03 01:45:04

+0

真棒L42,謝謝你的幫助和建議! – Lillian 2014-12-03 15:50:33

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

測試:這將通過所有列,但。如果你想設置限制,只需插入一個最大值而不是所有的列。

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」。成功的關鍵之一是使用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