Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2274 / 13645 ツリー ←次へ | 前へ→

【69012】行の削除(大量) 列行 11/5/10(火) 11:54 質問[未読]
【69013】Re:行の削除(大量) kanabun 11/5/10(火) 12:57 発言[未読]
【69014】Re:行の削除(大量) 列行 11/5/10(火) 13:22 回答[未読]
【69015】Re:行の削除(大量) UO3 11/5/10(火) 13:35 回答[未読]
【69016】Re:行の削除(大量) Abebobo 11/5/10(火) 14:15 発言[未読]
【69018】Re:行の削除(大量) 列行 11/5/10(火) 16:40 お礼[未読]
【69019】Re:行の削除(大量) Abebobo 11/5/10(火) 19:04 発言[未読]
【69021】Re:行の削除(大量) UO3 11/5/10(火) 21:16 発言[未読]
【69026】Re:行の削除(大量) Abebobo 11/5/10(火) 23:18 発言[未読]
【69017】Re:行の削除(大量) 列行 11/5/10(火) 16:38 お礼[未読]
【69029】Re:行の削除(大量) 列行 11/5/11(水) 10:11 お礼[未読]

【69012】行の削除(大量)
質問  列行  - 11/5/10(火) 11:54 -

引用なし
パスワード
   お世話になってます。
今回あるデータをまとめているのですが
A〜Qまで各項目があり
7000行ほどあるデータの処理をしています。

その中で特定の文字や数字のある行を削除するというマクロを
以下のように作ってみました。
Dim DeleteRow As Long
  Range("A2").Select
  Do
    If ActiveCell.Value = "" Then Exit Do
    DeleteRow = ActiveCell.Row
    If Range("D" & DeleteRow) = "ABC"
     Or Range("G" & DeleteRow) = 0
     Or Range("P" & DeleteRow) <> ""
     Then
      Rows(DeleteRow).Delete
    Else
      ActiveCell.Offset(1, 0).Select
    End If
    DoEvents
  Loop

このときに Rows(DeleteRow).Delete でなぜか1秒ほどかかり
全部やり終わるまでに結構時間がかかってしまいました。
もっと効率の良い方法がないかと考えたのですが・・・
なにか他に良い方法がありましたら教えていただきたいと思います。

【69013】Re:行の削除(大量)
発言  kanabun  - 11/5/10(火) 12:57 -

引用なし
パスワード
   ▼列行 さん:

>A〜Qまで各項目があり
>7000行ほどあるデータの処理をしています。

7000行くらいなら、フィルタオプションで削除行を抽出して
一括行削除してしまったらどうでしょ。

'フィルタオプション
Sub Try1()
  Dim mRng As Range '対象範囲
  Dim cRng As Range '条件設定範囲
  Dim WS1 As Worksheet
  
  Set WS1 = ActiveSheet
  Set cRng = WS1.Range("AA1").Resize(4, 3) '条件書き込み
  cRng(1, 1).Value = WS1.Range("D1").Value
  cRng(1, 2).Value = WS1.Range("G1").Value
  cRng(1, 3).Value = WS1.Range("P1").Value
  cRng(2, 1).Formula = "=""ABC"""
  cRng(3, 2).Formula = "=0"
  cRng(4, 3).Formula = "="
  
  Set mRng = WS1.Cells(1).CurrentRegion
  mRng.AdvancedFilter xlFilterInPlace, cRng
  If mRng.Columns(1).SpecialCells(xlVisible).Count > 1 Then
    mRng.Offset(1).EntireRow.Delete
  End If
  cRng.Clear
  mRng.Worksheet.ShowAllData
End Sub

【69014】Re:行の削除(大量)
回答  列行  - 11/5/10(火) 13:22 -

引用なし
パスワード
   ▼kanabun さん:

返信有難うございます。
さっそく教えていただいたようにやってみました。

そしてフリーズしてしまいました・・・^^;


これはマクロやEXCELといったことでなく
PC性能、常駐ソフトなどの問題??;

Core2Duo 3G(CPU)
3G(メモリ)
MS Excel2010
で作成しています。。。

【69015】Re:行の削除(大量)
回答  UO3  - 11/5/10(火) 13:35 -

引用なし
パスワード
   ▼列行 さん:

私も、kanabunさん同様フィルター処理がいいんじゃないかと思ったんですが・・・
別案です。
行や列の削除、挿入といった処理は処理コストが結構大きくなりますので
不要なものを下においやってクリアします。

Sub Sample()
  Dim myA As Range
  Dim myW As Range
  
  With Worksheets("Sheet1") '<== 実際のシート名に
  
    Set myA = .UsedRange
    Set myW = myA.Columns(1).Resize(myA.Rows.Count - 1).Offset(1, myA.Columns.Count)
  
    myW.Formula = "=IF(OR(D1=""ABC"",G1=0,P1=""""),1,0)"
    myW.Value = myW.Value
    myW.Offset(-1).Cells(1).Value = "Dummy"
    If WorksheetFunction.CountIf(myW, 1) > 0 Then
    
      .Cells.Sort Key1:=.Columns(myW.Column), Order1:=xlAscending, _
        Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, _
        SortMethod:=xlPinYin, DataOption1:=xlSortNormal
  
      .Range(myW.Cells(WorksheetFunction.Match(1, myW, 0)), _
              myW.Cells(myW.Cells.Count)).EntireRow.ClearContents
      
    End If
    
  End With

  myW.EntireColumn.ClearContents
  
  Set myA = Nothing
  Set myW = Nothing
  
End Sub

【69016】Re:行の削除(大量)
発言  Abebobo  - 11/5/10(火) 14:15 -

引用なし
パスワード
   PCのスペックから考えて、

Application.EnableEvents = False

が決め手だったりして・・・

そのデータをどこかで参照していませんか?

【69017】Re:行の削除(大量)
お礼  列行  - 11/5/10(火) 16:38 -

引用なし
パスワード
   ▼UO3 さん:
返信有難うございます。

クリアすることで軽く動作することができました^^

【69018】Re:行の削除(大量)
お礼  列行  - 11/5/10(火) 16:40 -

引用なし
パスワード
   ▼Abebobo さん:
>PCのスペックから考えて、
>
>Application.EnableEvents = False
>
>が決め手だったりして・・・
>
>そのデータをどこかで参照していませんか?

返信有難うございます。
他のBookからマクロの入ってるBook(Sheet)にコピーして作業させていたんですが、重くなる原因だったんですかね??

【69019】Re:行の削除(大量)
発言  Abebobo  - 11/5/10(火) 19:04 -

引用なし
パスワード
   >他のBookからマクロの入ってるBook(Sheet)にコピーして作業させていたんですが、重くなる原因だったんですかね??

それは関係ないと思います。

削除中に再計算をいっぱいやっているのかなぁ〜

って、思いました。

Application.EnableEvents = False
で再計算しなくなり、
Application.EnableEvents = true
で、自動計算に戻します。

【69021】Re:行の削除(大量)
発言  UO3  - 11/5/10(火) 21:16 -

引用なし
パスワード
   ▼Abebobo さん:

>Application.EnableEvents = False
>で再計算しなくなり、
>Application.EnableEvents = true
>で、自動計算に戻します。


ん?

  Application.Calculation = xlManual
  Application.Calculation = xlAutomatic

では?

ところで、マクロのあるシートとおっしゃっているのが気になります。
シート上の、もろもろのイベントに対する処理が書かれているとすれば
シートへの変更処理のたびにイベントが発生している可能性はあります。

なので、

Application.EnableEvents = False  'イベント発生の抑止

’シートの処理コード

Application.EnableEvents = True  'イベント発生の再開

として試して見られてはいかがですか。

【69026】Re:行の削除(大量)
発言  Abebobo  - 11/5/10(火) 23:18 -

引用なし
パスワード
   UO3 さん

ゥキャーー。はずかしい。

と、合わせてまじめに反省

このそそっかしさが・・・
すみませんでした。

【69029】Re:行の削除(大量)
お礼  列行  - 11/5/11(水) 10:11 -

引用なし
パスワード
   みなさんありがとうございます。 ^^

おかげでスムーズに処理できるようになりました。

2274 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free