2016-09-25 6 views
2

次のコードを実行すると実行時エラーが発生します。ランタイムエラーが発生する9 - 下付き文字が範囲外にある

Sub em() 
    Dim strlogin As String 
    Dim strnextlogin As String 

    For i = 2 To Range("A1").End(xlDown).Row 
     strlogin = Sheets("Untitled").cell(i, 1) 
     strnextlogin = Sheets("Untitled").cell(i + 1, 1) 
     If (strlogin = strnextlogin) Then 
      Rows(i).Delete 
      i = i - 1 
     End If 
    Next i 
End Sub 
+0

が、私は重複で第一値を削除したいです。 –

+1

あなたはどの行がエラーを出すか、私の前提はコードがシートを見つけられない( "無題")と言うことができますか? – Davesexcel

答えて

5

私はあなたが最後のセルを見つけることxlDownを使用している問題

  1. のカップルを参照してください。最後の行を見つける方法については、THISのリンクを見ることをお勧めします。

  2. Excelが参照しているシートを見つけることができないため、エラーRuntime Error 9 Subscript out of rangeが表示されます。シートが存在することを確認してください。 Untitledシートを視覚的に見ることができれば、シート名の先頭または末尾にスペースがあると思います。

  3. この問題を解決すると、次のエラーはRuntime error 438: Object doesn't support this property or methodになります。それはcellsの代わりにcellを使用しているためです。たとえば.cell(i, 1)について.Cells(i, 1)であるべきと.cell(i + 1, 1)Sheets("Untitled")が、その後Rows(i).Deleteが間違ったシートから削除されますアクティブなシートでない場合

  4. .Cells(i + 1, 1)が他のあなたのオブジェクトを宣言する必要があります。ループ内で行を削除

  5. は避けてください)。コードが遅くなるだけです。私がどのようにdelRangeを以下のコードで使用したかを見てください。

はこれらの事を修正して、あなたは

注意を行ってもいいでしょう。

Option Explicit 

Sub em() 
    Dim delRange As Range 
    Dim ws As Worksheet 
    Dim i As Long, LRow As Long 

    Set ws = ThisWorkbook.Sheets("Untitled") 

    With ws 
     LRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     For i = LRow To 2 Step -1 '~~> Even 2 To LRow will work :) 
      If .Cells(i, 1) = .Cells(i + 1, 1) Then 
       If delRange Is Nothing Then 
        Set delRange = .Rows(i) 
       Else 
        Set delRange = Union(delRange, .Rows(i)) 
       End If 
      End If 
     Next i 

     If Not delRange Is Nothing Then delRange.Delete 
    End With 
End Sub 
関連する問題