- 締切済み
VBA アプリケーション・オブジェクト定義のエラー
ある行と別の行と同じ内容の文章が入っている場合、それを削除するマクロをくんでいますが、 アプリケーション・オブジェクト定義のエラーとのことで作動してくれません。。。 以下のような記述なのですが、アドバイスをいただけたら幸いです。 よろしくお願いいたします。 Sub 重複削除() Dim dataend Cells(Rows.Count, 5).End(xlUp).Select dataend = ActiveCell.Row For i = 2 To dataend - 1 For k = 1 To dataend - i If Cells(2, i).Value = Cells(2, i + k).Value Then '''''''''''''''''''''ここでひっかかる Rows(i + 1).Select Selection.Delete End If Next Next End Sub
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 横からお邪魔します。 No.1さんが回答されていらっしゃる通り、 >Cells(Rows.Count, 5).End(xlUp).Select >dataend = ActiveCell.Row の部分でE列の最終行を取得されているみたいですが その後の >If Cells(2, i).Value = Cells(2, i + k).Value Then 部分で 「行」がいつも間にか「列」に変わっていますよね! Excelで表示できる列数以上に最終行があった場合は当然そこでマクロが止まってしまいます。 ご希望としては「行削除」というコトでしょうから、少し考え方を変えて E列に重複するデータがあればそれを削除する!としてみてはどうでしょうか? せっかくコードをお考えですが、別コードでの一例です。 Sub 重複削除2() Dim i As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, "E").End(xlUp).Row To 2 Step -1 If WorksheetFunction.CountIf(Range("E:E"), Cells(i, "E")) > 1 Then Rows(i).Delete End If Next i Application.ScreenUpdating = True MsgBox "処理完了" End Sub こんな感じではどうでしょうか?m(_ _)m
- foomufoomu
- ベストアンサー率36% (1018/2761)
重複検査をするプログラムなら、ループの部分は、 For i = 1 To dataend - 1 For k = i + 1 To dataend If Cells(i,2).Value = Cells(k,2).Value Then としないと、とんでもない範囲のCellsを参照してしまいます。
- osamuy
- ベストアンサー率42% (1231/2878)
> Cells(2, i + k).Value 仕様上列数が256までのExcelだと、i+kが257になった時エラーになりますね。というか、なった。 列を走査していくのは、行の重複削除をするという話と合わないような。