• 締切済み

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

みんなの回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.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

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.2

重複検査をするプログラムなら、ループの部分は、 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)
回答No.1

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

関連するQ&A

  • 重複データーの集計、削除

    どなたかご教授下さい。 下記のようにD列に重複する行があればI列に集計し、行削除するマクロを作成しました。 さらに、重複する基準となる列を複数(D列,F列,G列)に増やしたいのですが、上手く出来ません。 宜しくお願い致します。 Sub test() Dim i, j For i = 19 To Cells(Rows.Count, 2).End(xlUp).row - 1 For j = Cells(Rows.Count, 2).End(xlUp).row To i + 1 Step -1 If Cells(i, 4).value = "" Then Exit Sub If Cells(i, 4).value = Cells(j, 4).value Then Cells(i, 9).value = Cells(i, 9).value + Cells(j, 9).value Rows(j).Delete End If Next Next End Sub

  • VBA アプリケーション定義またはオブジェクト定義エラーについて

    VBA アプリケーション定義またはオブジェクト定義エラーについて VBA初心者です。 VISTA、エクセル2007を使用しています。 Private Sub printTotal1() Cells(sRow, nPlayer + 2).Value = "Score" Cells(sRow, nPlayer + 3).Value = "Average" Dim score As Double For iPlayer1 = 1 To nPlayer score = 0 For iPlayer2 = 1 To nPlayer score = score + Cells(sRow + iPlayer1, iPlayer2 + 1).Value Next Cells(sRow + iPlayer1, nPlayer + 2).Value = score Cells(sRow + iPlayer1, nPlayer + 3).Value = score / nPlayer Next End Sub このように記入しているのですがいつもエラーが出てしまいます。 どのような原因なのでしょうか?勉強不足ゆえにこんな荒い質問の仕方ですいません。

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • VBA アプリケーション定義またはオブジェクト定義のエラーです

    VBA初心者です。 仕事中、暇な時にVBAの勉強をしています。 あるファイルのフォーマットを指定されたフォーマットに変換するプログラムを作成しています。 実行後、「アプリケーション定義またはオブジェクト定義のエラーです」と出て、先に進めません。 どなたが分かる方、ご教授お願い致します。 以下ソース Private Sub CommandButton1_Click() ' 変数定義 Dim openFileName As String Dim priorYearBudget As String, thisYearBudget As String, increaseAnddecrease As String Dim bigSection As String, mediumSection As String, smallSection As String Dim fileLastRow As Long, buf As Long, index As Long Dim head As String ' 初期化 index = 2 ' ファイル名取得 openFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") If openFileName <> "False" Then ' ファイルが存在したらファイルを開く Workbooks.Open openFileName ' 項目を変数に格納 ' bigSection = Sheets(1).Cells(1, 3) ' mediumSection = Sheets(1).Cells(1, 4) ' smallSection = Sheets(1).Cells(1, 5) priorYearBudget = Sheets(1).Cells(1, 6) thisYearBudget = Sheets(1).Cells(1, 7) increaseAnddecrease = Sheets(1).Cells(1, 8) ' ファイルの最終行を取得(データが格納されている行) fileLastRow = ActiveSheet.Cells.SpecialCells(xlLastCell).Row ' ワークシートの追加 Worksheets.Add after:=Worksheets("Sheet1") ' セルの幅指定 Columns("A").Select Selection.ColumnWidth = 70 Columns("B:D").Select Selection.ColumnWidth = 13 Columns("A").Select ' 幅設定で選択されたセルを解除 range("A1").Select ' 新規に追加されたワークシートに項目を設定 Sheets(2).Cells(1, 1).Value = "勘定科目" Sheets(2).Cells(1, 2).Value = priorYearBudget Sheets(2).Cells(1, 3).Value = thisYearBudget Sheets(2).Cells(1, 4).Value = increaseAnddecrease ' 元ファイルの見出しの形式を変更 For headCnt = 1 To fileLastRow head = Sheets(1).Cells(headCnt, 1) bigSection = Sheets(1).Cells(index, 3) midiumSection = Sheets(1).Cells(index, 4) smallSection = Sheets(1).Cells(index, 5) If head <> "" Then ' 項目設定 Sheets(2).Cells(headCnt, 1).Value = "【" & head & "】" End If If bigSection <> "" Then ' 大区分設定 Sheets(2).Cells(buf, 1).Value = bigSection←ここでエラー発生 ElseIf midiumSection <> "" Then ' 中区分設定 Sheets(2).Cells(buf, 1).Value = midiumSection ElseIf smallSection <> "" Then ' 小区分設定 Sheets(2).Cells(buf, 1).Value = smaillsection End If ' Sheets(2).Cells(cnt, 1).Value = head ' head = Sheets(1).Cells(cnt, 1) index = index + 1 buf = buf + 1 Next headCnt ' 元ファイルの金額をそのままコピー For budgetCnt = 2 To fileLastRow Sheets(2).Cells(budgetCnt, 2).Value = Sheets(1).Cells(budgetCnt, 6) Sheets(2).Cells(budgetCnt, 3).Value = Sheets(1).Cells(budgetCnt, 7) Sheets(2).Cells(budgetCnt, 4).Value = Sheets(1).Cells(budgetCnt, 8) Next budgetCnt Else MsgBox "キャンセルされました" Exit Sub End If End Sub 補足 エラーが発生する箇所をコメントアウトすると、正常に動作します。 よろしくお願い致します。

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • VBAで行を挿入する

    VBAを始めた初心者です。 Exel2002使用です。 VBAでA列の4行目から10行目に行の挿入をできるようにしようと下記のように書きましたが、Rows("i:i").Selectの部分でデバックがかかってしまいます。間違っている理由がわからないのですがよろしくお願いします。 また、DO While Loopステートメントを使ってA列が空白になるまで(例えばA4セル以下の)行を挿入とする場合の方法も教えていただけましたら幸いです。 Sub 4行目から10行目まで() Dim i As Integer For i = 4 To 10 Cells(i, 1).Value = i Rows("i:i").Select Selection.Insert Shift:=xlDown Next i End Sub Sub 4行目から空白になるまで() Dim i As Integer Range("A4").serect Do While activecell.value = "" Cells(i, 1).Value = i Rows("i:i").Select Selection.Insert Shift:=xlDown activecell.offset(1,0).select Loop End Sub

  • <Excel>VBAでのオートフィルタについて

    このような式で必要な行を抽出していたのですが、65536行下から検索をかけるので時間がかかります。 データの入っている一番下の行から上へ検索していくにはどのような方法があるでしょうか? Sub sDelLine() Dim i As Long For i = 65536 To 1 Step -1 If Cells(i, 3) = "男" Then Rows(i).Select Selection.Delete Shift:=xlUp End If Next End Sub

  • comboboxで任意の行列を削除する

    comboboxで選択したデーターを探して、その行の 2列目から45列までを、削除する方法をお教えください。 下のように記述したのですが、1行全てが削除されてしまいます。 どのように記述したらよいのでしょうか。 よろしくお願いします。 Private Sub 保存データー削除_Click() Dim i As Long For i = 2 To 199 If Cells(i, 2).Value = combobox1.Value Then Range(i & ":" & i).Delete End If Next i Dim k As Long, s As Long k = 1 For s = 1 To 31 Cells(s, 1).Value = k k = k + 1 Next s End Sub

  • VBAで行の削除

    お世話になります。 下記の様に行を削除しようとしていますが、 行を削除していくと、1行ずつずれていく為、 結果全部削除されません。 どのようにしたらうまく(空白のセルの行のみ) 削除出来ますでしょうか。 ご教示頂きたく宜しくお願い致します。          記 For k = 2 To r If Sheets("sheet1").Cells(k, 9) = "" Then Rows(k).Select Selection.Delete Shift:=xlUp End If Next k

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

専門家に質問してみよう