こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2013-07-02 02:56:09

QNo.8158621

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

こんにちは!
横からお邪魔します。

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

投稿日時 - 2013-07-02 11:05:47

ANo.2

重複検査をするプログラムなら、ループの部分は、

For i = 1 To dataend - 1
For k = i + 1 To dataend
If Cells(i,2).Value = Cells(k,2).Value Then

としないと、とんでもない範囲のCellsを参照してしまいます。

投稿日時 - 2013-07-02 10:05:21

ANo.1

> Cells(2, i + k).Value

仕様上列数が256までのExcelだと、i+kが257になった時エラーになりますね。というか、なった。
列を走査していくのは、行の重複削除をするという話と合わないような。

投稿日時 - 2013-07-02 07:16:37

あなたにオススメの質問